ruco-cpp 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Rakefile +17 -0
- data/bin/console +14 -0
- data/bin/ruco +30 -0
- data/bin/setup +7 -0
- data/data/ruco/Parser.frame +359 -0
- data/data/ruco/Scanner.frame +896 -0
- data/data/ruco/picojson/Changes +14 -0
- data/data/ruco/picojson/LICENSE +25 -0
- data/data/ruco/picojson/Makefile +8 -0
- data/data/ruco/picojson/README.mkdn +183 -0
- data/data/ruco/picojson/examples/github-issues.cc +110 -0
- data/data/ruco/picojson/examples/iostream.cc +70 -0
- data/data/ruco/picojson/examples/streaming.cc +76 -0
- data/data/ruco/picojson/picojson.h +1299 -0
- data/ext/cocor/Action.cpp +81 -0
- data/ext/cocor/Action.h +59 -0
- data/ext/cocor/ArrayList.cpp +79 -0
- data/ext/cocor/ArrayList.h +52 -0
- data/ext/cocor/BitArray.cpp +156 -0
- data/ext/cocor/BitArray.h +68 -0
- data/ext/cocor/CharClass.cpp +42 -0
- data/ext/cocor/CharClass.h +48 -0
- data/ext/cocor/CharSet.cpp +166 -0
- data/ext/cocor/CharSet.h +68 -0
- data/ext/cocor/Coco.atg +528 -0
- data/ext/cocor/Coco.cpp +173 -0
- data/ext/cocor/Comment.cpp +45 -0
- data/ext/cocor/Comment.h +51 -0
- data/ext/cocor/Copyright.frame +27 -0
- data/ext/cocor/DFA.cpp +865 -0
- data/ext/cocor/DFA.h +132 -0
- data/ext/cocor/Generator.cpp +182 -0
- data/ext/cocor/Generator.h +61 -0
- data/ext/cocor/Graph.h +59 -0
- data/ext/cocor/HashTable.cpp +115 -0
- data/ext/cocor/HashTable.h +84 -0
- data/ext/cocor/Makefile +11 -0
- data/ext/cocor/Melted.cpp +39 -0
- data/ext/cocor/Melted.h +51 -0
- data/ext/cocor/Node.cpp +69 -0
- data/ext/cocor/Node.h +86 -0
- data/ext/cocor/Parser.cpp +925 -0
- data/ext/cocor/Parser.frame +326 -0
- data/ext/cocor/Parser.h +153 -0
- data/ext/cocor/ParserGen.cpp +486 -0
- data/ext/cocor/ParserGen.h +99 -0
- data/ext/cocor/Position.cpp +37 -0
- data/ext/cocor/Position.h +46 -0
- data/ext/cocor/README.md +12 -0
- data/ext/cocor/Scanner.cpp +833 -0
- data/ext/cocor/Scanner.frame +897 -0
- data/ext/cocor/Scanner.h +291 -0
- data/ext/cocor/Sets.h +84 -0
- data/ext/cocor/SortedList.cpp +141 -0
- data/ext/cocor/SortedList.h +68 -0
- data/ext/cocor/State.cpp +77 -0
- data/ext/cocor/State.h +55 -0
- data/ext/cocor/StringBuilder.cpp +88 -0
- data/ext/cocor/StringBuilder.h +29 -0
- data/ext/cocor/Symbol.cpp +61 -0
- data/ext/cocor/Symbol.h +70 -0
- data/ext/cocor/Tab.cpp +1248 -0
- data/ext/cocor/Tab.h +245 -0
- data/ext/cocor/Target.cpp +41 -0
- data/ext/cocor/Target.h +48 -0
- data/ext/cocor/build.bat +3 -0
- data/ext/cocor/build.sh +4 -0
- data/ext/cocor/coc.bat +1 -0
- data/ext/cocor/coc.sh +2 -0
- data/ext/cocor/cocor_ruby_ext.cpp +124 -0
- data/ext/cocor/cygBuild.bat +1 -0
- data/ext/cocor/extconf.rb +5 -0
- data/ext/cocor/mingwbuild.bat +2 -0
- data/ext/cocor/mkmf.log +57 -0
- data/ext/cocor/zipsources.bat +1 -0
- data/lib/cocor.rb +14 -0
- data/lib/ruco/version.rb +3 -0
- data/lib/ruco.rb +728 -0
- metadata +195 -0
@@ -0,0 +1,326 @@
|
|
1
|
+
/*-------------------------------------------------------------------------
|
2
|
+
Compiler Generator Coco/R,
|
3
|
+
Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
|
4
|
+
extended by M. Loeberbauer & A. Woess, Univ. of Linz
|
5
|
+
ported to C++ by Csaba Balazs, University of Szeged
|
6
|
+
with improvements by Pat Terry, Rhodes University
|
7
|
+
|
8
|
+
This program is free software; you can redistribute it and/or modify it
|
9
|
+
under the terms of the GNU General Public License as published by the
|
10
|
+
Free Software Foundation; either version 2, or (at your option) any
|
11
|
+
later version.
|
12
|
+
|
13
|
+
This program is distributed in the hope that it will be useful, but
|
14
|
+
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
15
|
+
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
16
|
+
for more details.
|
17
|
+
|
18
|
+
You should have received a copy of the GNU General Public License along
|
19
|
+
with this program; if not, write to the Free Software Foundation, Inc.,
|
20
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
21
|
+
|
22
|
+
As an exception, it is allowed to write an extension of Coco/R that is
|
23
|
+
used as a plugin in non-free software.
|
24
|
+
|
25
|
+
If not otherwise stated, any source code generated by Coco/R (other than
|
26
|
+
Coco/R itself) does not fall under the GNU General Public License.
|
27
|
+
-------------------------------------------------------------------------*/
|
28
|
+
|
29
|
+
/*----------------------------------------------------------------------
|
30
|
+
Parser.h Specification
|
31
|
+
-----------------------------------------------------------------------*/
|
32
|
+
|
33
|
+
-->begin
|
34
|
+
|
35
|
+
#if !defined(-->prefixCOCO_PARSER_H__)
|
36
|
+
#define -->prefixCOCO_PARSER_H__
|
37
|
+
|
38
|
+
-->headerdef
|
39
|
+
|
40
|
+
#include "Scanner.h"
|
41
|
+
|
42
|
+
-->namespace_open
|
43
|
+
|
44
|
+
class Errors {
|
45
|
+
public:
|
46
|
+
int count; // number of errors detected
|
47
|
+
|
48
|
+
Errors();
|
49
|
+
void SynErr(int line, int col, int n);
|
50
|
+
void Error(int line, int col, const wchar_t *s);
|
51
|
+
void Warning(int line, int col, const wchar_t *s);
|
52
|
+
void Warning(const wchar_t *s);
|
53
|
+
void Exception(const wchar_t *s);
|
54
|
+
|
55
|
+
}; // Errors
|
56
|
+
|
57
|
+
class Parser {
|
58
|
+
private:
|
59
|
+
-->constantsheader
|
60
|
+
Token *dummyToken;
|
61
|
+
int errDist;
|
62
|
+
int minErrDist;
|
63
|
+
|
64
|
+
void SynErr(int n);
|
65
|
+
void Get();
|
66
|
+
void Expect(int n);
|
67
|
+
bool StartOf(int s);
|
68
|
+
void ExpectWeak(int n, int follow);
|
69
|
+
bool WeakSeparator(int n, int syFol, int repFol);
|
70
|
+
|
71
|
+
public:
|
72
|
+
Scanner *scanner;
|
73
|
+
Errors *errors;
|
74
|
+
|
75
|
+
Token *t; // last recognized token
|
76
|
+
Token *la; // lookahead token
|
77
|
+
|
78
|
+
-->declarations
|
79
|
+
|
80
|
+
Parser(Scanner *scanner);
|
81
|
+
~Parser();
|
82
|
+
void SemErr(const wchar_t* msg);
|
83
|
+
|
84
|
+
-->productionsheader
|
85
|
+
void Parse();
|
86
|
+
|
87
|
+
}; // end Parser
|
88
|
+
|
89
|
+
-->namespace_close
|
90
|
+
|
91
|
+
#endif
|
92
|
+
|
93
|
+
-->implementation
|
94
|
+
|
95
|
+
/*----------------------------------------------------------------------
|
96
|
+
Parser.cpp Specification
|
97
|
+
-----------------------------------------------------------------------*/
|
98
|
+
|
99
|
+
-->begin
|
100
|
+
|
101
|
+
#include <wchar.h>
|
102
|
+
#include "Parser.h"
|
103
|
+
#include "Scanner.h"
|
104
|
+
|
105
|
+
|
106
|
+
-->namespace_open
|
107
|
+
|
108
|
+
void Parser::SynErr(int n) {
|
109
|
+
if (errDist >= minErrDist) errors->SynErr(la->line, la->col, n);
|
110
|
+
errDist = 0;
|
111
|
+
}
|
112
|
+
|
113
|
+
void Parser::SemErr(const wchar_t* msg) {
|
114
|
+
if (errDist >= minErrDist) errors->Error(t->line, t->col, msg);
|
115
|
+
errDist = 0;
|
116
|
+
}
|
117
|
+
|
118
|
+
void Parser::Get() {
|
119
|
+
for (;;) {
|
120
|
+
t = la;
|
121
|
+
la = scanner->Scan();
|
122
|
+
if (la->kind <= maxT) { ++errDist; break; }
|
123
|
+
-->pragmas
|
124
|
+
if (dummyToken != t) {
|
125
|
+
dummyToken->kind = t->kind;
|
126
|
+
dummyToken->pos = t->pos;
|
127
|
+
dummyToken->col = t->col;
|
128
|
+
dummyToken->line = t->line;
|
129
|
+
dummyToken->next = NULL;
|
130
|
+
coco_string_delete(dummyToken->val);
|
131
|
+
dummyToken->val = coco_string_create(t->val);
|
132
|
+
t = dummyToken;
|
133
|
+
}
|
134
|
+
la = t;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
void Parser::Expect(int n) {
|
139
|
+
if (la->kind==n) Get(); else { SynErr(n); }
|
140
|
+
}
|
141
|
+
|
142
|
+
void Parser::ExpectWeak(int n, int follow) {
|
143
|
+
if (la->kind == n) Get();
|
144
|
+
else {
|
145
|
+
SynErr(n);
|
146
|
+
while (!StartOf(follow)) Get();
|
147
|
+
}
|
148
|
+
}
|
149
|
+
|
150
|
+
bool Parser::WeakSeparator(int n, int syFol, int repFol) {
|
151
|
+
if (la->kind == n) {Get(); return true;}
|
152
|
+
else if (StartOf(repFol)) {return false;}
|
153
|
+
else {
|
154
|
+
SynErr(n);
|
155
|
+
while (!(StartOf(syFol) || StartOf(repFol) || StartOf(0))) {
|
156
|
+
Get();
|
157
|
+
}
|
158
|
+
return StartOf(syFol);
|
159
|
+
}
|
160
|
+
}
|
161
|
+
|
162
|
+
-->productions
|
163
|
+
|
164
|
+
|
165
|
+
// If the user declared a method Init and a mehtod Destroy they should
|
166
|
+
// be called in the contructur and the destructor respctively.
|
167
|
+
//
|
168
|
+
// The following templates are used to recognize if the user declared
|
169
|
+
// the methods Init and Destroy.
|
170
|
+
|
171
|
+
template<typename T>
|
172
|
+
struct ParserInitExistsRecognizer {
|
173
|
+
template<typename U, void (U::*)() = &U::Init>
|
174
|
+
struct ExistsIfInitIsDefinedMarker{};
|
175
|
+
|
176
|
+
struct InitIsMissingType {
|
177
|
+
char dummy1;
|
178
|
+
};
|
179
|
+
|
180
|
+
struct InitExistsType {
|
181
|
+
char dummy1; char dummy2;
|
182
|
+
};
|
183
|
+
|
184
|
+
// exists always
|
185
|
+
template<typename U>
|
186
|
+
static InitIsMissingType is_here(...);
|
187
|
+
|
188
|
+
// exist only if ExistsIfInitIsDefinedMarker is defined
|
189
|
+
template<typename U>
|
190
|
+
static InitExistsType is_here(ExistsIfInitIsDefinedMarker<U>*);
|
191
|
+
|
192
|
+
enum { InitExists = (sizeof(is_here<T>(NULL)) == sizeof(InitExistsType)) };
|
193
|
+
};
|
194
|
+
|
195
|
+
template<typename T>
|
196
|
+
struct ParserDestroyExistsRecognizer {
|
197
|
+
template<typename U, void (U::*)() = &U::Destroy>
|
198
|
+
struct ExistsIfDestroyIsDefinedMarker{};
|
199
|
+
|
200
|
+
struct DestroyIsMissingType {
|
201
|
+
char dummy1;
|
202
|
+
};
|
203
|
+
|
204
|
+
struct DestroyExistsType {
|
205
|
+
char dummy1; char dummy2;
|
206
|
+
};
|
207
|
+
|
208
|
+
// exists always
|
209
|
+
template<typename U>
|
210
|
+
static DestroyIsMissingType is_here(...);
|
211
|
+
|
212
|
+
// exist only if ExistsIfDestroyIsDefinedMarker is defined
|
213
|
+
template<typename U>
|
214
|
+
static DestroyExistsType is_here(ExistsIfDestroyIsDefinedMarker<U>*);
|
215
|
+
|
216
|
+
enum { DestroyExists = (sizeof(is_here<T>(NULL)) == sizeof(DestroyExistsType)) };
|
217
|
+
};
|
218
|
+
|
219
|
+
// The folloing templates are used to call the Init and Destroy methods if they exist.
|
220
|
+
|
221
|
+
// Generic case of the ParserInitCaller, gets used if the Init method is missing
|
222
|
+
template<typename T, bool = ParserInitExistsRecognizer<T>::InitExists>
|
223
|
+
struct ParserInitCaller {
|
224
|
+
static void CallInit(T *t) {
|
225
|
+
// nothing to do
|
226
|
+
}
|
227
|
+
};
|
228
|
+
|
229
|
+
// True case of the ParserInitCaller, gets used if the Init method exists
|
230
|
+
template<typename T>
|
231
|
+
struct ParserInitCaller<T, true> {
|
232
|
+
static void CallInit(T *t) {
|
233
|
+
t->Init();
|
234
|
+
}
|
235
|
+
};
|
236
|
+
|
237
|
+
// Generic case of the ParserDestroyCaller, gets used if the Destroy method is missing
|
238
|
+
template<typename T, bool = ParserDestroyExistsRecognizer<T>::DestroyExists>
|
239
|
+
struct ParserDestroyCaller {
|
240
|
+
static void CallDestroy(T *t) {
|
241
|
+
// nothing to do
|
242
|
+
}
|
243
|
+
};
|
244
|
+
|
245
|
+
// True case of the ParserDestroyCaller, gets used if the Destroy method exists
|
246
|
+
template<typename T>
|
247
|
+
struct ParserDestroyCaller<T, true> {
|
248
|
+
static void CallDestroy(T *t) {
|
249
|
+
t->Destroy();
|
250
|
+
}
|
251
|
+
};
|
252
|
+
|
253
|
+
void Parser::Parse() {
|
254
|
+
t = NULL;
|
255
|
+
la = dummyToken = new Token();
|
256
|
+
la->val = coco_string_create(L"Dummy Token");
|
257
|
+
Get();
|
258
|
+
-->parseRoot
|
259
|
+
}
|
260
|
+
|
261
|
+
Parser::Parser(Scanner *scanner) {
|
262
|
+
-->constants
|
263
|
+
ParserInitCaller<Parser>::CallInit(this);
|
264
|
+
dummyToken = NULL;
|
265
|
+
t = la = NULL;
|
266
|
+
minErrDist = 2;
|
267
|
+
errDist = minErrDist;
|
268
|
+
this->scanner = scanner;
|
269
|
+
errors = new Errors();
|
270
|
+
}
|
271
|
+
|
272
|
+
bool Parser::StartOf(int s) {
|
273
|
+
const bool T = true;
|
274
|
+
const bool x = false;
|
275
|
+
|
276
|
+
-->initialization
|
277
|
+
|
278
|
+
return set[s][la->kind];
|
279
|
+
}
|
280
|
+
|
281
|
+
Parser::~Parser() {
|
282
|
+
ParserDestroyCaller<Parser>::CallDestroy(this);
|
283
|
+
delete errors;
|
284
|
+
delete dummyToken;
|
285
|
+
}
|
286
|
+
|
287
|
+
Errors::Errors() {
|
288
|
+
count = 0;
|
289
|
+
}
|
290
|
+
|
291
|
+
void Errors::SynErr(int line, int col, int n) {
|
292
|
+
wchar_t* s;
|
293
|
+
switch (n) {
|
294
|
+
-->errors
|
295
|
+
default:
|
296
|
+
{
|
297
|
+
wchar_t format[20];
|
298
|
+
coco_swprintf(format, 20, L"error %d", n);
|
299
|
+
s = coco_string_create(format);
|
300
|
+
}
|
301
|
+
break;
|
302
|
+
}
|
303
|
+
wprintf(L"-- line %d col %d: %ls\n", line, col, s);
|
304
|
+
coco_string_delete(s);
|
305
|
+
count++;
|
306
|
+
}
|
307
|
+
|
308
|
+
void Errors::Error(int line, int col, const wchar_t *s) {
|
309
|
+
wprintf(L"-- line %d col %d: %ls\n", line, col, s);
|
310
|
+
count++;
|
311
|
+
}
|
312
|
+
|
313
|
+
void Errors::Warning(int line, int col, const wchar_t *s) {
|
314
|
+
wprintf(L"-- line %d col %d: %ls\n", line, col, s);
|
315
|
+
}
|
316
|
+
|
317
|
+
void Errors::Warning(const wchar_t *s) {
|
318
|
+
wprintf(L"%ls\n", s);
|
319
|
+
}
|
320
|
+
|
321
|
+
void Errors::Exception(const wchar_t* s) {
|
322
|
+
wprintf(L"%ls", s);
|
323
|
+
exit(1);
|
324
|
+
}
|
325
|
+
|
326
|
+
-->namespace_close
|
data/ext/cocor/Parser.h
ADDED
@@ -0,0 +1,153 @@
|
|
1
|
+
/*----------------------------------------------------------------------
|
2
|
+
Compiler Generator Coco/R,
|
3
|
+
Copyright (c) 1990, 2004 Hanspeter Moessenboeck, University of Linz
|
4
|
+
extended by M. Loeberbauer & A. Woess, Univ. of Linz
|
5
|
+
ported to C++ by Csaba Balazs, University of Szeged
|
6
|
+
with improvements by Pat Terry, Rhodes University
|
7
|
+
|
8
|
+
This program is free software; you can redistribute it and/or modify it
|
9
|
+
under the terms of the GNU General Public License as published by the
|
10
|
+
Free Software Foundation; either version 2, or (at your option) any
|
11
|
+
later version.
|
12
|
+
|
13
|
+
This program is distributed in the hope that it will be useful, but
|
14
|
+
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
15
|
+
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
16
|
+
for more details.
|
17
|
+
|
18
|
+
You should have received a copy of the GNU General Public License along
|
19
|
+
with this program; if not, write to the Free Software Foundation, Inc.,
|
20
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
21
|
+
|
22
|
+
As an exception, it is allowed to write an extension of Coco/R that is
|
23
|
+
used as a plugin in non-free software.
|
24
|
+
|
25
|
+
If not otherwise stated, any source code generated by Coco/R (other than
|
26
|
+
Coco/R itself) does not fall under the GNU General Public License.
|
27
|
+
-----------------------------------------------------------------------*/
|
28
|
+
|
29
|
+
|
30
|
+
#if !defined(Coco_COCO_PARSER_H__)
|
31
|
+
#define Coco_COCO_PARSER_H__
|
32
|
+
|
33
|
+
#include "Tab.h"
|
34
|
+
#include "DFA.h"
|
35
|
+
#include "ParserGen.h"
|
36
|
+
|
37
|
+
|
38
|
+
#include "Scanner.h"
|
39
|
+
|
40
|
+
namespace Coco {
|
41
|
+
|
42
|
+
|
43
|
+
class Errors {
|
44
|
+
public:
|
45
|
+
int count; // number of errors detected
|
46
|
+
|
47
|
+
Errors();
|
48
|
+
void SynErr(int line, int col, int n);
|
49
|
+
void Error(int line, int col, const wchar_t *s);
|
50
|
+
void Warning(int line, int col, const wchar_t *s);
|
51
|
+
void Warning(const wchar_t *s);
|
52
|
+
void Exception(const wchar_t *s);
|
53
|
+
|
54
|
+
}; // Errors
|
55
|
+
|
56
|
+
class Parser {
|
57
|
+
private:
|
58
|
+
enum {
|
59
|
+
_EOF=0,
|
60
|
+
_ident=1,
|
61
|
+
_number=2,
|
62
|
+
_string=3,
|
63
|
+
_badString=4,
|
64
|
+
_char=5,
|
65
|
+
_ddtSym=42,
|
66
|
+
_optionSym=43
|
67
|
+
};
|
68
|
+
int maxT;
|
69
|
+
|
70
|
+
Token *dummyToken;
|
71
|
+
int errDist;
|
72
|
+
int minErrDist;
|
73
|
+
|
74
|
+
void SynErr(int n);
|
75
|
+
void Get();
|
76
|
+
void Expect(int n);
|
77
|
+
bool StartOf(int s);
|
78
|
+
void ExpectWeak(int n, int follow);
|
79
|
+
bool WeakSeparator(int n, int syFol, int repFol);
|
80
|
+
|
81
|
+
public:
|
82
|
+
Scanner *scanner;
|
83
|
+
Errors *errors;
|
84
|
+
|
85
|
+
Token *t; // last recognized token
|
86
|
+
Token *la; // lookahead token
|
87
|
+
|
88
|
+
int id;
|
89
|
+
int str;
|
90
|
+
|
91
|
+
FILE* trace; // other Coco objects referenced in this ATG
|
92
|
+
Tab *tab;
|
93
|
+
DFA *dfa;
|
94
|
+
ParserGen *pgen;
|
95
|
+
|
96
|
+
bool genScanner;
|
97
|
+
wchar_t* tokenString; // used in declarations of literal tokens
|
98
|
+
wchar_t* noString; // used in declarations of literal tokens
|
99
|
+
|
100
|
+
// This method will be called by the contructor if it exits.
|
101
|
+
// This support is specific to the C++ version of Coco/R.
|
102
|
+
void Init() {
|
103
|
+
tab = NULL;
|
104
|
+
dfa = NULL;
|
105
|
+
pgen = NULL;
|
106
|
+
id = 0;
|
107
|
+
str = 1;
|
108
|
+
tokenString = NULL;
|
109
|
+
noString = coco_string_create(L"-none-");
|
110
|
+
}
|
111
|
+
|
112
|
+
// Uncomment this method if cleanup is necessary,
|
113
|
+
// this method will be called by the destructor if it exists.
|
114
|
+
// This support is specific to the C++ version of Coco/R.
|
115
|
+
// void Destroy() {
|
116
|
+
// nothing to do
|
117
|
+
// }
|
118
|
+
/*-------------------------------------------------------------------------*/
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
Parser(Scanner *scanner);
|
123
|
+
~Parser();
|
124
|
+
void SemErr(const wchar_t* msg);
|
125
|
+
|
126
|
+
void Coco();
|
127
|
+
void SetDecl();
|
128
|
+
void TokenDecl(int typ);
|
129
|
+
void TokenExpr(Graph* &g);
|
130
|
+
void Set(CharSet* &s);
|
131
|
+
void AttrDecl(Symbol *sym);
|
132
|
+
void SemText(Position* &pos);
|
133
|
+
void Expression(Graph* &g);
|
134
|
+
void SimSet(CharSet* &s);
|
135
|
+
void Char(int &n);
|
136
|
+
void Sym(wchar_t* &name, int &kind);
|
137
|
+
void Term(Graph* &g);
|
138
|
+
void Resolver(Position* &pos);
|
139
|
+
void Factor(Graph* &g);
|
140
|
+
void Attribs(Node *p);
|
141
|
+
void Condition();
|
142
|
+
void TokenTerm(Graph* &g);
|
143
|
+
void TokenFactor(Graph* &g);
|
144
|
+
|
145
|
+
void Parse();
|
146
|
+
|
147
|
+
}; // end Parser
|
148
|
+
|
149
|
+
} // namespace
|
150
|
+
|
151
|
+
|
152
|
+
#endif
|
153
|
+
|