-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathZzparser.cpp
311 lines (263 loc) · 7.79 KB
/
Zzparser.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
/*
TODO :
------
1) to comply closure and others , when defining function store it's scope
and jump to that scope when calling the function (CHECK IF THIS SUFFICIENT)
2) Lists , still very much problematic
3) I/O module to develop real sample scripts
4) LLVM ?
5) libffi ?
*/
#include "stdafx.h"
#include "yatgLexer.h"
#include "yatgParser.h"
#include "yatgFW.h"
#include "ZInterp.h"
enum ERROR_TYPE{UN_Wanted_Token_EXCEPTION,MISSING_TOKEN_EXCEPTION,RECOGNITION_EXCEPTION,MISMATCHED_TOKEN_EXCEPTION,NO_VIABLE_ALT_EXCEPTION,MISMATCHED_SET_EXCEPTION,EARLY_EXIT_EXCEPTION};
struct ERROR_DATA
{
int count;
string fileName;
string text;
int line;
int column;
int type;
ERROR_TYPE Name;
};
vector< ERROR_DATA > error;
static void
myDisplayError (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 * tokenNames)
{
ERROR_DATA ee;
pANTLR3_PARSER parser;
pANTLR3_TREE_PARSER tparser;
pANTLR3_INT_STREAM is;
pANTLR3_STRING ttext;
pANTLR3_EXCEPTION ex;
pANTLR3_COMMON_TOKEN theToken;
pANTLR3_BASE_TREE theBaseTree;
pANTLR3_COMMON_TREE theCommonTree;
ex = recognizer->state->exception;
ee.fileName.append( (char*)ex->streamName->to8(ex->streamName)->chars);
ee.line=recognizer->state->exception->line;
ee.type= recognizer->state->exception->type;
switch (recognizer->type)
{
case ANTLR3_TYPE_PARSER:
case ANTLR3_TYPE_TREE_PARSER:
parser = (pANTLR3_PARSER) (recognizer->super);
tparser = NULL;
is = parser->tstream->istream;
theToken = (pANTLR3_COMMON_TOKEN)(recognizer->state->exception->token);
ttext = theToken->toString(theToken);
ee.text.append((char*)ttext->chars);
ee.column=recognizer->state->exception->charPositionInLine;
break;
default:
cout<<"Not Support Error Ocurred"<<endl;
return;
break;
}
switch (ex->type)
{
case ANTLR3_UNWANTED_TOKEN_EXCEPTION:
ee.Name= UN_Wanted_Token_EXCEPTION;
if (tokenNames == NULL)
{
//ANTLR3_FPRINTF(stderr, " : Extraneous input...");
}
else
{
if (ex->expecting == ANTLR3_TOKEN_EOF)
{
//ANTLR3_FPRINTF(stderr, " : Extraneous input - expected <EOF>\n");
}
else
{
//ANTLR3_FPRINTF(stderr, " : Extraneous input - expected %s ...\n", tokenNames[ex->expecting]);
}
}
break;
case ANTLR3_MISSING_TOKEN_EXCEPTION:
ee.Name= MISSING_TOKEN_EXCEPTION;
if (tokenNames == NULL)
{
//ANTLR3_FPRINTF(stderr, " : Missing token (%d)...\n", ex->expecting);
}
else
{
if (ex->expecting == ANTLR3_TOKEN_EOF)
{
//ANTLR3_FPRINTF(stderr, " : Missing <EOF>\n");
}
else
{
//ANTLR3_FPRINTF(stderr, " : Missing %s \n", tokenNames[ex->expecting]);
}
}
break;
case ANTLR3_RECOGNITION_EXCEPTION:
ee.Name= RECOGNITION_EXCEPTION;
//ANTLR3_FPRINTF(stderr, " : syntax error...\n");
break;
case ANTLR3_MISMATCHED_TOKEN_EXCEPTION:
ee.Name=MISMATCHED_TOKEN_EXCEPTION;
if (tokenNames == NULL)
{
//ANTLR3_FPRINTF(stderr, " : syntax error...\n");
}
else
{
if (ex->expecting == ANTLR3_TOKEN_EOF)
{
//ANTLR3_FPRINTF(stderr, " : expected <EOF>\n");
}
else
{
//ANTLR3_FPRINTF(stderr, " : expected %s ...\n", tokenNames[ex->expecting]);
}
}
break;
case ANTLR3_NO_VIABLE_ALT_EXCEPTION:
ee.Name=NO_VIABLE_ALT_EXCEPTION;
//ANTLR3_FPRINTF(stderr, " : cannot match to any predicted input...\n");
break;
case ANTLR3_MISMATCHED_SET_EXCEPTION:
ee.Name=MISMATCHED_SET_EXCEPTION;
{
ANTLR3_UINT32 count;
ANTLR3_UINT32 bit;
ANTLR3_UINT32 size;
ANTLR3_UINT32 numbits;
pANTLR3_BITSET errBits;
ANTLR3_FPRINTF(stderr, " : unexpected input...\n expected one of : ");
count = 0;
errBits = antlr3BitsetLoad (ex->expectingSet);
numbits = errBits->numBits (errBits);
size = errBits->size (errBits);
if (size > 0)
{
for (bit = 1; bit < numbits && count < 8 && count < size; bit++)
{
if (tokenNames[bit])
{
//ANTLR3_FPRINTF(stderr, "%s%s", count > 0 ? ", " : "", tokenNames[bit]);
count++;
}
}
ANTLR3_FPRINTF(stderr, "\n");
}
else
{
//ANTLR3_FPRINTF(stderr, "Actually dude, we didn't seem to be expecting anything here, or at least\n");
//ANTLR3_FPRINTF(stderr, "I could not work out what I was expecting, like so many of us these days!\n");
}
}
break;
case ANTLR3_EARLY_EXIT_EXCEPTION:
ee.Name=EARLY_EXIT_EXCEPTION;
//ANTLR3_FPRINTF(stderr, " : missing elements...\n");
break;
default:
// ANTLR3_FPRINTF(stderr, " : syntax not recognized...\n");
break;
}
error.push_back(ee);
}
int ANTLR3_CDECL _tmain(int argc, _TCHAR* argv[])
{
pANTLR3_UINT8 fName;
pANTLR3_INPUT_STREAM input;
pyatgLexer lxr;
pANTLR3_COMMON_TOKEN_STREAM tstream;
pyatgParser psr;
yatgParser_program_return yatgAST;
pANTLR3_COMMON_TREE_NODE_STREAM nodes;
pyatgFW treePsr;
fName =(pANTLR3_UINT8)"input.txt";
input = antlr3AsciiFileStreamNew(fName);
if ( input == NULL)
{
fprintf(stderr, "Failed to open file %s\n", (char *)fName);
exit(1);
}
lxr = yatgLexerNew(input);
if ( lxr == NULL )
{
fprintf(stderr, "Unable to create the lexer due to malloc() failure1\n");
exit(1);
}
tstream = antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lxr));
if (tstream == NULL)
{
fprintf(stderr, "Out of memory trying to allocate token stream\n");
exit(1);
}
psr = yatgParserNew(tstream);
if (psr == NULL)
{
fprintf(stderr, "Out of memory trying to allocate parser\n");
exit(ANTLR3_ERR_NOMEM);
}
psr->pParser->rec->displayRecognitionError=myDisplayError;
yatgAST=psr->program(psr);
if (psr->pParser->rec->state->errorCount > 0)
{
//error=new ERROR_DATA[psr->pParser->rec->state->errorCount];
fprintf(stderr, "The parser returned %d errors, tree walking aborted.\n", psr->pParser->rec->state->errorCount);
for(int i=0;i<error.size();i++)
{
cout<<"-------------------------------------------------------------------"<<endl;
cout<<"Error occured in \t"<<error[i].fileName<<endl
<<"Error: \t"<<error[i].type<<"\t Name\t"<<error[i].Name<<endl
<<"at line\t"<<error[i].line<<"\toffset: "<<error[i].column<<endl
<<"Error text: "<<error[i].text<<endl;
//cout<<"-------------------------------------------------------------------"<<endl;
}
exit(5);
}
else
{
if(yatgAST.tree!=NULL)
{
nodes = antlr3CommonTreeNodeStreamNewTree(yatgAST.tree, ANTLR3_SIZE_HINT);
}
else
{
nodes = NULL;
exit(2);
}
pANTLR3_BASE_TREE p;
int ln=0,cpos=0;
while(true)
{
p =nodes -> tnstream -> _LT ( nodes -> tnstream , 1 ) ;
p->savedIndex=nodes->tnstream->istream->index(nodes->tnstream->istream);
if( p->getToken(p)->line != 0 )
{
ln = p->getToken(p)->line;
}
p->getToken(p)->line = ln;
if( p->getCharPositionInLine(p) != 0 )
{
cpos = p->getCharPositionInLine(p);
}
p->getToken(p)->charPosition = cpos;
if(p->getType(p)==nodes->EOF_NODE.token->getType(nodes->EOF_NODE.token))break;
nodes->tnstream->istream->consume(nodes->tnstream->istream);
}
ZTObject::Init();
ZInterp::global::InitBuiltinMods();
treePsr = yatgFWNew(nodes);
ZInterp::cxtr = treePsr;
treePsr->program(treePsr);
//ZInterp::ZSym.currentScope->VarTable.PrintAll();
nodes->free(nodes); nodes = NULL;
treePsr ->free (treePsr); treePsr = NULL;
}
psr ->free (psr); psr = NULL;
tstream ->free (tstream); tstream = NULL;
lxr ->free (lxr); lxr = NULL;
input ->close (input); input = NULL;
return 0;
}