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