]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Other/Maintained/Tools/Pccts/h/AParser.cpp
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Other / Maintained / Tools / Pccts / h / AParser.cpp
CommitLineData
3eb9473e 1/* ANTLRParser.C\r
2 *\r
3 * SOFTWARE RIGHTS\r
4 *\r
5 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool\r
6 * Set (PCCTS) -- PCCTS is in the public domain. An individual or\r
7 * company may do whatever they wish with source code distributed with\r
8 * PCCTS or the code generated by PCCTS, including the incorporation of\r
9 * PCCTS, or its output, into commerical software.\r
10 *\r
11 * We encourage users to develop software with PCCTS. However, we do ask\r
12 * that credit is given to us for developing PCCTS. By "credit",\r
13 * we mean that if you incorporate our source code into one of your\r
14 * programs (commercial product, research project, or otherwise) that you\r
15 * acknowledge this fact somewhere in the documentation, research report,\r
16 * etc... If you like PCCTS and have developed a nice tool with the\r
17 * output, please mention that you developed it using PCCTS. In\r
18 * addition, we ask that this header remain intact in our source code.\r
19 * As long as these guidelines are kept, we expect to continue enhancing\r
20 * this system and expect to make other tools available as they are\r
21 * completed.\r
22 *\r
23 * ANTLR 1.33\r
24 * Terence Parr\r
25 * Parr Research Corporation\r
26 * with Purdue University and AHPCRC, University of Minnesota\r
27 * 1989-1998\r
28 */\r
29\r
30#include "pcctscfg.h"\r
31\r
32#include "pccts_stdlib.h"\r
33#include "pccts_stdarg.h"\r
34#include "pccts_string.h"\r
35#include "pccts_stdio.h"\r
36\r
37PCCTS_NAMESPACE_STD\r
38\r
39/* I have to put this here due to C++ limitation\r
40 * that you can't have a 'forward' decl for enums.\r
41 * I hate C++!!!!!!!!!!!!!!!\r
42 * Of course, if I could use real templates, this would go away.\r
43 */\r
44// MR1\r
45// MR1 10-Apr-97 133MR1 Prevent use of varying sizes for the\r
46// MR1 ANTLRTokenType enum\r
47// MR1\r
48\r
49enum ANTLRTokenType { TER_HATES_CPP=0, ITS_TOO_COMPLICATED=9999}; // MR1\r
50\r
51#define ANTLR_SUPPORT_CODE\r
52\r
53#include ATOKEN_H\r
54#include ATOKENBUFFER_H\r
55#include APARSER_H\r
56\r
57static const int zzINF_DEF_TOKEN_BUFFER_SIZE = 2000; /* MR14 */\r
58static const int zzINF_BUFFER_TOKEN_CHUNK_SIZE = 1000; /* MR14 */\r
59\r
60 /* L o o k a h e a d M a c r o s */\r
61\r
62/* maximum of 32 bits/unsigned int and must be 8 bits/byte;\r
63 * we only use 8 bits of it.\r
64 */\r
65SetWordType ANTLRParser::bitmask[sizeof(SetWordType)*8] = {\r
66 0x00000001, 0x00000002, 0x00000004, 0x00000008,\r
67 0x00000010, 0x00000020, 0x00000040, 0x00000080\r
68};\r
69\r
70char ANTLRParser::eMsgBuffer[500] = "";\r
71\r
72ANTLRParser::\r
73~ANTLRParser()\r
74{\r
75 delete [] token_type;\r
76 delete [] zzFAILtext; // MR16 Manfred Kogler\r
77}\r
78\r
79ANTLRParser::\r
80ANTLRParser(ANTLRTokenBuffer *_inputTokens,\r
81 int k,\r
82 int use_inf_look,\r
83 int dlook,\r
84 int ssize)\r
85{\r
86 LLk = k;\r
87 can_use_inf_look = use_inf_look;\r
88/* MR14 */ if (dlook != 0) {\r
89/* MR14 */ panic("ANTLRParser::ANTLRParser - Demand lookahead not supported in C++ mode");\r
90/* MR14 */\r
91/* MR14 */ };\r
92 demand_look = 0; /* demand_look = dlook; */\r
93 bsetsize = ssize;\r
94 guessing = 0;\r
95 token_tbl = NULL;\r
96 eofToken = (ANTLRTokenType)1;\r
97\r
98 // allocate lookahead buffer\r
99 token_type = new ANTLRTokenType[LLk];\r
100 lap = 0;\r
101 labase = 0;\r
102#ifdef ZZDEFER_FETCH\r
103 stillToFetch = 0; // MR19\r
104#endif\r
105 dirty = 0;\r
106 inf_labase = 0; // MR7\r
107 inf_last = 0; // MR7\r
108 /* prime lookahead buffer, point to inputTokens */\r
109 this->inputTokens = _inputTokens;\r
110 this->inputTokens->setMinTokens(k);\r
111 _inputTokens->setParser(this); // MR1\r
112 resynchConsumed=1; // MR8\r
113 zzFAILtext=NULL; // MR9\r
114 traceOptionValueDefault=0; // MR10\r
115 traceReset(); // MR10\r
116 zzGuessSeq=0; // MR10\r
117 syntaxErrCount=0; // MR11\r
118}\r
119\r
120void ANTLRParser::init()\r
121{\r
122 prime_lookahead();\r
123 resynchConsumed=1; // MR8\r
124 traceReset(); // MR10\r
125}\r
126\r
127void ANTLRParser::traceReset()\r
128{\r
129 traceOptionValue=traceOptionValueDefault;\r
130 traceGuessOptionValue=1;\r
131 traceCurrentRuleName=NULL;\r
132 traceDepth=0;\r
133}\r
134\r
135int ANTLRParser::\r
136guess(ANTLRParserState *st)\r
137{\r
138 saveState(st);\r
139 guessing = 1;\r
140 return setjmp(guess_start.state);\r
141}\r
142\r
143void ANTLRParser::\r
144saveState(ANTLRParserState *buf)\r
145{\r
146 buf->guess_start = guess_start;\r
147 buf->guessing = guessing;\r
148 buf->inf_labase = inf_labase;\r
149 buf->inf_last = inf_last;\r
150 buf->dirty = dirty;\r
151 buf->traceOptionValue=traceOptionValue; /* MR10 */\r
152 buf->traceGuessOptionValue=traceGuessOptionValue; /* MR10 */\r
153 buf->traceCurrentRuleName=traceCurrentRuleName; /* MR10 */\r
154 buf->traceDepth=traceDepth; /* MR10 */\r
155}\r
156\r
157void ANTLRParser::\r
158restoreState(ANTLRParserState *buf)\r
159{\r
160 int i;\r
161 int prevTraceOptionValue;\r
162\r
163 guess_start = buf->guess_start;\r
164 guessing = buf->guessing;\r
165 inf_labase = buf->inf_labase;\r
166 inf_last = buf->inf_last;\r
167 dirty = buf->dirty;\r
168\r
169 // restore lookahead buffer from k tokens before restored TokenBuffer position\r
170 // if demand_look, then I guess we don't look backwards for these tokens.\r
171 for (i=1; i<=LLk; i++) token_type[i-1] =\r
172 inputTokens->bufferedToken(i-LLk)->getType();\r
173 lap = 0;\r
174 labase = 0;\r
175\r
176 /* MR10 */\r
177\r
178 prevTraceOptionValue=traceOptionValue;\r
179 traceOptionValue=buf->traceOptionValue;\r
180 if ( (prevTraceOptionValue > 0) !=\r
181 (traceOptionValue > 0)) {\r
182 if (traceCurrentRuleName != NULL) { /* MR21 */\r
183 if (traceOptionValue > 0) {\r
184 fprintf(stderr,\r
185 "trace enable restored in rule %s depth %d\n",\r
186 traceCurrentRuleName,\r
187 traceDepth);\r
188 };\r
189 if (traceOptionValue <= 0) {\r
190 fprintf(stderr,\r
191 "trace disable restored in rule %s depth %d\n",\r
192 traceCurrentRuleName, /* MR21 */\r
193 traceDepth);\r
194 };\r
195 }\r
196 };\r
197 traceGuessOptionValue=buf->traceGuessOptionValue;\r
198 traceCurrentRuleName=buf->traceCurrentRuleName;\r
199 traceDepth=buf->traceDepth;\r
200 traceGuessDone(buf);\r
201}\r
202\r
203/* Get the next symbol from the input stream; put it into lookahead buffer;\r
204 * fill token_type[] fast reference cache also. NLA is the next place where\r
205 * a lookahead ANTLRAbstractToken should go.\r
206 */\r
207void ANTLRParser::\r
208consume()\r
209{\r
210\r
211#ifdef ZZDEBUG_CONSUME_ACTION\r
212 zzdebug_consume_action();\r
213#endif\r
214\r
215// MR19 V.H. Simonis\r
216// Defer Fetch feature\r
217// Moves action of consume() into LA() function\r
218\r
219#ifdef ZZDEFER_FETCH\r
220 stillToFetch++;\r
221#else\r
222 NLA = inputTokens->getToken()->getType();\r
223 dirty--;\r
224 lap = (lap+1)&(LLk-1);\r
225#endif\r
226\r
227}\r
228\r
229_ANTLRTokenPtr ANTLRParser::\r
230LT(int i)\r
231{\r
232\r
233// MR19 V.H. Simonis\r
234// Defer Fetch feature\r
235// Moves action of consume() into LA() function\r
236\r
237#ifdef ZZDEFER_FETCH\r
238 undeferFetch();\r
239#endif\r
240\r
241#ifdef DEBUG_TOKENBUFFER\r
242 if ( i >= inputTokens->bufferSize() || inputTokens->minTokens() < LLk ) /* MR20 Was "<=" */\r
243 {\r
244 char buf[2000]; /* MR20 Was "static" */\r
245 sprintf(buf, "The minimum number of tokens you requested that the\nANTLRTokenBuffer buffer is not enough to satisfy your\nLT(%d) request; increase 'k' argument to constructor for ANTLRTokenBuffer\n", i);\r
246 panic(buf);\r
247 }\r
248#endif\r
249 return inputTokens->bufferedToken(i-LLk);\r
250}\r
251\r
252void\r
253ANTLRParser::\r
254look(int k)\r
255{\r
256 int i, c = k - (LLk-dirty);\r
257 for (i=1; i<=c; i++) consume();\r
258}\r
259\r
260/* fill the lookahead buffer up with k symbols (even if DEMAND_LOOK);\r
261 */\r
262void\r
263ANTLRParser::\r
264prime_lookahead()\r
265{\r
266 int i;\r
267 for(i=1;i<=LLk; i++) consume();\r
268 dirty=0;\r
269 // lap = 0; // MR14 Sinan Karasu (sinan.karasu@boeing.com)\r
270 // labase = 0; // MR14\r
271 labase=lap; // MR14\r
272}\r
273\r
274/* check to see if the current input symbol matches '_t'.\r
275 * During NON demand lookahead mode, dirty will always be 0 and\r
276 * hence the extra code for consuming tokens in _match is never\r
277 * executed; the same routine can be used for both modes.\r
278 */\r
279int ANTLRParser::\r
280_match(ANTLRTokenType _t, ANTLRChar **MissText,\r
281 ANTLRTokenType *MissTok, _ANTLRTokenPtr *BadTok,\r
282 SetWordType **MissSet)\r
283{\r
284 if ( dirty==LLk ) {\r
285 consume();\r
286 }\r
287 if ( LA(1)!=_t ) {\r
288 *MissText=NULL;\r
289 *MissTok= _t; *BadTok = LT(1);\r
290 *MissSet=NULL;\r
291 return 0;\r
292 }\r
293 dirty++;\r
294 labase = (labase+1)&(LLk-1); // labase maintained even if !demand look\r
295 return 1;\r
296}\r
297\r
298/* check to see if the current input symbol matches '_t'.\r
299 * Used during exception handling.\r
300 */\r
301int ANTLRParser::\r
302_match_wsig(ANTLRTokenType _t)\r
303{\r
304 if ( dirty==LLk ) {\r
305 consume();\r
306 }\r
307 if ( LA(1)!=_t ) return 0;\r
308 dirty++;\r
309 labase = (labase+1)&(LLk-1); // labase maintained even if !demand look\r
310 return 1;\r
311}\r
312\r
313/* check to see if the current input symbol matches any token in a set.\r
314 * During NON demand lookahead mode, dirty will always be 0 and\r
315 * hence the extra code for consuming tokens in _match is never\r
316 * executed; the same routine can be used for both modes.\r
317 */\r
318int ANTLRParser::\r
319_setmatch(SetWordType *tset, ANTLRChar **MissText,\r
320 ANTLRTokenType *MissTok, _ANTLRTokenPtr *BadTok,\r
321 SetWordType **MissSet)\r
322{\r
323 if ( dirty==LLk ) {\r
324 consume();\r
325 }\r
326 if ( !set_el(LA(1), tset) ) {\r
327 *MissText=NULL;\r
328 *MissTok= (ANTLRTokenType)0; *BadTok=LT(1);\r
329 *MissSet=tset;\r
330 return 0;\r
331 }\r
332 dirty++;\r
333 labase = (labase+1)&(LLk-1); // labase maintained even if !demand look\r
334 return 1;\r
335}\r
336\r
337int ANTLRParser::\r
338_setmatch_wsig(SetWordType *tset)\r
339{\r
340 if ( dirty==LLk ) {\r
341 consume();\r
342 }\r
343 if ( !set_el(LA(1), tset) ) return 0;\r
344 dirty++;\r
345 labase = (labase+1)&(LLk-1); // labase maintained even if !demand look\r
346 return 1;\r
347}\r
348\r
349 /* Exception handling routines */\r
350//\r
351// 7-Apr-97 133MR1\r
352// Change suggested by Eli Sternheim (eli@interhdl.com)\r
353//\r
354void ANTLRParser::\r
355consumeUntil(SetWordType *st)\r
356{\r
357 ANTLRTokenType tmp; // MR1\r
358 const int Eof=1; // MR1\r
359 while ( !set_el( (tmp=LA(1)), st) && tmp!=Eof) { consume(); } // MR1\r
360}\r
361\r
362//\r
363// 7-Apr-97 133MR1\r
364// Change suggested by Eli Sternheim (eli@interhdl.com)\r
365//\r
366void ANTLRParser::\r
367consumeUntilToken(int t)\r
368{\r
369 int tmp; // MR1\r
370 const int Eof=1; // MR1\r
371 while ( (tmp=LA(1)) !=t && tmp!=Eof) { consume(); } // MR1\r
372}\r
373\r
374\r
375 /* Old error stuff */\r
376\r
377void ANTLRParser::\r
378resynch(SetWordType *wd,SetWordType mask)\r
379{\r
380\r
381/* MR8 S.Bochnak@microtool.com.pl */\r
382/* MR8 Change file scope static "consumed" to instance var */\r
383\r
384 /* if you enter here without having consumed a token from last resynch\r
385 * force a token consumption.\r
386 */\r
387/* MR8 */ if ( !resynchConsumed ) {consume(); resynchConsumed=1; return;}\r
388\r
389 /* if current token is in resynch set, we've got what we wanted */\r
390\r
391/* MR8 */ if ( wd[LA(1)]&mask || LA(1) == eofToken ) {resynchConsumed=0; return;}\r
392 \r
393 /* scan until we find something in the resynch set */\r
394\r
395 while ( !(wd[LA(1)]&mask) && LA(1) != eofToken ) {consume();}\r
396\r
397/* MR8 */ resynchConsumed=1;\r
398}\r
399\r
400/* standard error reporting function that assumes DLG-based scanners;\r
401 * you should redefine in subclass to change it or if you use your\r
402 * own scanner.\r
403 */\r
404void ANTLRParser::\r
405syn(_ANTLRTokenPtr tok, ANTLRChar *egroup, SetWordType *eset,\r
406 ANTLRTokenType etok, int k)\r
407{\r
408 int line;\r
409\r
410 line = LT(1)->getLine();\r
411\r
412 syntaxErrCount++; /* MR11 */\r
413 fprintf(stderr, "line %d: syntax error at \"%s\"",\r
414 line,\r
415 (LA(1)==eofToken && LT(1)->getText()[0] == '@')? \r
416 "<eof>":LT(1)->getText() /* MR21a */);\r
417 if ( !etok && !eset ) {fprintf(stderr, "\n"); return;}\r
418 if ( k==1 ) fprintf(stderr, " missing");\r
419 else\r
420 {\r
421 fprintf(stderr, "; \"%s\" not", LT(1)->getText());\r
422 if ( set_deg(eset)>1 ) fprintf(stderr, " in");\r
423 }\r
424 if ( set_deg(eset)>0 ) edecode(eset);\r
425 else fprintf(stderr, " %s", token_tbl[etok]);\r
426 if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup);\r
427 fprintf(stderr, "\n");\r
428}\r
429\r
430/* is b an element of set p? */\r
431int ANTLRParser::\r
432set_el(ANTLRTokenType b, SetWordType *p)\r
433{\r
434 return( p[DIVWORD(b)] & bitmask[MODWORD(b)] );\r
435}\r
436\r
437int ANTLRParser::\r
438set_deg(SetWordType *a)\r
439{\r
440 /* Fast compute degree of a set... the number\r
441 of elements present in the set. Assumes\r
442 that all word bits are used in the set\r
443 */\r
444 register SetWordType *p = a;\r
445 register SetWordType *endp = &(a[bsetsize]);\r
446 register int degree = 0;\r
447\r
448 if ( a == NULL ) return 0;\r
449 while ( p < endp )\r
450 {\r
451 register SetWordType t = *p;\r
452 register SetWordType *b = &(bitmask[0]);\r
453 do {\r
454 if (t & *b) ++degree;\r
455 } while (++b < &(bitmask[sizeof(SetWordType)*8]));\r
456 p++;\r
457 }\r
458\r
459 return(degree);\r
460}\r
461\r
462void ANTLRParser::\r
463edecode(SetWordType *a)\r
464{\r
465 register SetWordType *p = a;\r
466 register SetWordType *endp = &(p[bsetsize]);\r
467 register unsigned e = 0;\r
468\r
469 if ( set_deg(a)>1 ) fprintf(stderr, " {");\r
470 do {\r
471 register SetWordType t = *p;\r
472 register SetWordType *b = &(bitmask[0]);\r
473 do {\r
474 if ( t & *b ) fprintf(stderr, " %s", token_tbl[e]);\r
475 e++;\r
476 } while (++b < &(bitmask[sizeof(SetWordType)*8]));\r
477 } while (++p < endp);\r
478 if ( set_deg(a)>1 ) fprintf(stderr, " }");\r
479}\r
480\r
481/* input looks like:\r
482 * zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk)\r
483 * where the zzMiss stuff is set here to the token that did not match\r
484 * (and which set wasn't it a member of).\r
485 */\r
486\r
487// MR9 29-Sep-97 Stan Bochnak (S.Bochnak@microTool.com.pl)\r
488// MR9 Original fix to static allocated text didn't\r
489// MR9 work because a pointer to it was passed back\r
490// MR9 to caller. Replace with instance variable.\r
491\r
492const int SETWORDCOUNT=20;\r
493\r
494void\r
495ANTLRParser::FAIL(int k, ...)\r
496{\r
497//\r
498// MR1 10-Apr-97 \r
499//\r
500\r
501 if (zzFAILtext == NULL) zzFAILtext=new char [1000]; // MR9\r
502 SetWordType **f=new SetWordType *[SETWORDCOUNT]; // MR1 // MR9\r
503 SetWordType **miss_set;\r
504 ANTLRChar **miss_text;\r
505 _ANTLRTokenPtr *bad_tok;\r
506 ANTLRChar **bad_text;\r
507//\r
508// 7-Apr-97 133MR1\r
509// err_k is passed as a "int *", not "unsigned *"\r
510//\r
511 int *err_k; // MR1\r
512 int i;\r
513 va_list ap;\r
514\r
515 va_start(ap, k);\r
516\r
517 zzFAILtext[0] = '\0';\r
518 if ( k > SETWORDCOUNT ) panic("FAIL: overflowed buffer");\r
519 for (i=1; i<=k; i++) /* collect all lookahead sets */\r
520 {\r
521 f[i-1] = va_arg(ap, SetWordType *);\r
522 }\r
523 for (i=1; i<=k; i++) /* look for offending token */\r
524 {\r
525 if ( i>1 ) strcat(zzFAILtext, " ");\r
526 strcat(zzFAILtext, LT(i)->getText());\r
527 if ( !set_el(LA(i), f[i-1]) ) break;\r
528 }\r
529 miss_set = va_arg(ap, SetWordType **);\r
530 miss_text = va_arg(ap, ANTLRChar **);\r
531 bad_tok = va_arg(ap, _ANTLRTokenPtr *);\r
532 bad_text = va_arg(ap, ANTLRChar **);\r
533 err_k = va_arg(ap, int *); // MR1\r
534 if ( i>k )\r
535 {\r
536 /* bad; lookahead is permutation that cannot be matched,\r
537 * but, the ith token of lookahead is valid at the ith position\r
538 * (The old LL sub 1 (k) versus LL(k) parsing technique)\r
539 */\r
540 *miss_set = NULL;\r
541 *miss_text = LT(1)->getText();\r
542 *bad_tok = LT(1);\r
543 *bad_text = (*bad_tok)->getText();\r
544 *err_k = k;\r
545//\r
546// MR4 20-May-97 erroneously deleted contents of f[]\r
547// MR4 reported by Bruce Guenter (bruceg@qcc.sk.ca)\r
548// MR1 10-Apr-97 release temporary storage\r
549//\r
550 delete [] f; // MR1\r
551 return; // MR1\r
552 }\r
553/* fprintf(stderr, "%s not in %dth set\n", zztokens[LA(i)], i);*/\r
554 *miss_set = f[i-1];\r
555 *miss_text = zzFAILtext;\r
556 *bad_tok = LT(i);\r
557 *bad_text = (*bad_tok)->getText();\r
558 if ( i==1 ) *err_k = 1;\r
559 else *err_k = k;\r
560//\r
561// MR4 20-May-97 erroneously deleted contents of f[]\r
562// MR4 reported by Bruce Guenter (bruceg@qcc.sk.ca)\r
563// MR1 10-Apr-97 release temporary storage\r
564//\r
565 delete [] f; // MR1\r
566 return; // MR1\r
567}\r
568\r
569int ANTLRParser::\r
570_match_wdfltsig(ANTLRTokenType tokenWanted, SetWordType *whatFollows)\r
571{\r
572 if ( dirty==LLk ) consume();\r
573\r
574 if ( LA(1)!=tokenWanted )\r
575 {\r
576 syntaxErrCount++; /* MR11 */\r
577 fprintf(stderr,\r
578 "line %d: syntax error at \"%s\" missing %s\n",\r
579 LT(1)->getLine(),\r
580 (LA(1)==eofToken && LT(1)->getText()[0] == '@')?"<eof>":LT(1)->getText(), /* MR21a */\r
581 token_tbl[tokenWanted]);\r
582 consumeUntil( whatFollows );\r
583 return 0;\r
584 }\r
585 else {\r
586 dirty++;\r
587 labase = (labase+1)&(LLk-1); // labase maintained even if !demand look\r
588/* if ( !demand_look ) consume(); */\r
589 return 1;\r
590 }\r
591}\r
592\r
593\r
594int ANTLRParser::\r
595_setmatch_wdfltsig(SetWordType *tokensWanted,\r
596 ANTLRTokenType tokenTypeOfSet,\r
597 SetWordType *whatFollows)\r
598{\r
599 if ( dirty==LLk ) consume();\r
600 if ( !set_el(LA(1), tokensWanted) )\r
601 {\r
602 syntaxErrCount++; /* MR11 */\r
603 fprintf(stderr,\r
604 "line %d: syntax error at \"%s\" missing %s\n",\r
605 LT(1)->getLine(),\r
606 (LA(1)==eofToken && LT(1)->getText()[0] == '@')?"<eof>":LT(1)->getText(), /* MR21a */\r
607 token_tbl[tokenTypeOfSet]);\r
608 consumeUntil( whatFollows );\r
609 return 0;\r
610 }\r
611 else {\r
612 dirty++;\r
613 labase = (labase+1)&(LLk-1); // labase maintained even if !demand look\r
614/* if ( !demand_look ) consume(); */\r
615 return 1;\r
616 }\r
617}\r
618\r
619char *ANTLRParser::\r
620eMsgd(char *err,int d)\r
621{\r
622 sprintf(eMsgBuffer, err, d); // dangerous, but I don't care\r
623 return eMsgBuffer;\r
624}\r
625\r
626char *ANTLRParser::\r
627eMsg(char *err, char *s)\r
628{\r
629 sprintf(eMsgBuffer, err, s);\r
630 return eMsgBuffer;\r
631}\r
632\r
633char *ANTLRParser::\r
634eMsg2(char *err,char *s, char *t)\r
635{\r
636 sprintf(eMsgBuffer, err, s, t);\r
637 return eMsgBuffer;\r
638}\r
639\r
640void ANTLRParser::\r
641panic(const char *msg) // MR20 const\r
642{\r
643 fprintf(stderr, "ANTLR panic: %s\n", msg);\r
644 exit(PCCTS_EXIT_FAILURE); // MR1\r
645}\r
646\r
647const ANTLRChar *ANTLRParser:: // MR1\r
648parserTokenName(int tok) { // MR1\r
649 return token_tbl[tok]; // MR1\r
650} // MR1\r
651\r
652void ANTLRParser::traceGuessDone(const ANTLRParserState *state) {\r
653\r
654 int doIt=0;\r
655\r
656 if (traceCurrentRuleName == NULL) return;\r
657\r
658 if (traceOptionValue <= 0) {\r
659 doIt=0;\r
660 } else if (traceGuessOptionValue <= 0) {\r
661 doIt=0;\r
662 } else {\r
663 doIt=1;\r
664 };\r
665\r
666 if (doIt) {\r
667 fprintf(stderr,"guess done - returning to rule %s {\"%s\"} at depth %d",\r
668 state->traceCurrentRuleName,\r
669 LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),\r
670 state->traceDepth);\r
671 if (state->guessing != 0) {\r
672 fprintf(stderr," (guess mode continues - an enclosing guess is still active)");\r
673 } else {\r
674 fprintf(stderr," (guess mode ends)");\r
675 };\r
676 fprintf(stderr,"\n");\r
677 };\r
678}\r
679\r
680void ANTLRParser::traceGuessFail() {\r
681\r
682 int doIt=0;\r
683\r
684 if (traceCurrentRuleName == NULL) return; /* MR21 */\r
685\r
686 if (traceOptionValue <= 0) {\r
687 doIt=0;\r
688 } else if (guessing && traceGuessOptionValue <= 0) {\r
689 doIt=0;\r
690 } else {\r
691 doIt=1;\r
692 };\r
693\r
694 if (doIt) {\r
695 fprintf(stderr,"guess failed\n");\r
696 };\r
697}\r
698\r
699/* traceOption:\r
700 zero value turns off trace\r
701*/\r
702\r
703void ANTLRParser::tracein(const ANTLRChar * rule) {\r
704\r
705 int doIt=0;\r
706\r
707 traceDepth++;\r
708 traceCurrentRuleName=rule;\r
709\r
710 if (traceOptionValue <= 0) {\r
711 doIt=0;\r
712 } else if (guessing && traceGuessOptionValue <= 0) {\r
713 doIt=0;\r
714 } else {\r
715 doIt=1;\r
716 };\r
717\r
718 if (doIt) {\r
719 fprintf(stderr,"enter rule %s {\"%s\"} depth %d",\r
720 rule,\r
721 LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),\r
722 traceDepth);\r
723 if (guessing) fprintf(stderr," guessing");\r
724 fprintf(stderr,"\n");\r
725 };\r
726 return;\r
727}\r
728\r
729void ANTLRParser::traceout(const ANTLRChar * rule) {\r
730\r
731 int doIt=0;\r
732\r
733 traceDepth--;\r
734\r
735 if (traceOptionValue <= 0) {\r
736 doIt=0;\r
737 } else if (guessing && traceGuessOptionValue <= 0) {\r
738 doIt=0;\r
739 } else {\r
740 doIt=1;\r
741 };\r
742\r
743 if (doIt) {\r
744 fprintf(stderr,"exit rule %s {\"%s\"} depth %d",\r
745 rule,\r
746 LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),\r
747 traceDepth+1);\r
748 if (guessing) fprintf(stderr," guessing");\r
749 fprintf(stderr,"\n");\r
750 };\r
751}\r
752\r
753int ANTLRParser::traceOption(int delta) {\r
754\r
755 int prevValue=traceOptionValue;\r
756\r
757 traceOptionValue=traceOptionValue+delta;\r
758\r
759 if (traceCurrentRuleName != NULL) {\r
760 if (prevValue <= 0 && traceOptionValue > 0) {\r
761 fprintf(stderr,"trace enabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);\r
762 };\r
763 if (prevValue > 0 && traceOptionValue <= 0) {\r
764 fprintf(stderr,"trace disabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);\r
765 };\r
766 };\r
767\r
768 return prevValue;\r
769}\r
770\r
771int ANTLRParser::traceGuessOption(int delta) {\r
772\r
773 int prevValue=traceGuessOptionValue;\r
774\r
775 traceGuessOptionValue=traceGuessOptionValue+delta;\r
776\r
777 if (traceCurrentRuleName != NULL) {\r
778 if (prevValue <= 0 && traceGuessOptionValue > 0) {\r
779 fprintf(stderr,"guess trace enabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);\r
780 };\r
781 if (prevValue > 0 && traceGuessOptionValue <= 0) {\r
782 fprintf(stderr,"guess trace disabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);\r
783 };\r
784 };\r
785 return prevValue;\r
786}\r
787\r
788// MR19 V.H. Simonis Defer Fetch feature\r
789\r
790void ANTLRParser::undeferFetch()\r
791{\r
792\r
793#ifdef ZZDEFER_FETCH\r
794 if (stillToFetch) {\r
795 for (int stillToFetch_x = 0; stillToFetch_x < stillToFetch; ++stillToFetch_x) {\r
796 NLA = inputTokens->getToken()->getType();\r
797 dirty--;\r
798 lap = (lap+1)&(LLk-1);\r
799 }\r
800 stillToFetch = 0;\r
801 }\r
802#else\r
803 return;\r
804#endif\r
805\r
806}\r
807\r
808int ANTLRParser::isDeferFetchEnabled()\r
809{\r
810#ifdef ZZDEFER_FETCH\r
811 return 1;\r
812#else\r
813 return 0;\r
814#endif\r
815}\r