1 /*
2 * A n t l r T r a n s l a t i o n H e a d e r
3 *
4 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
5 * Purdue University Electrical Engineering
6 * With AHPCRC, University of Minnesota
7 * ANTLR Version 1.33MR33
8 *
9 * ..\bin\antlr -gh antlr.g
10 *
11 */
12
13 #define ANTLR_VERSION 13333
14 #include "pcctscfg.h"
15 #include "pccts_stdio.h"
16
17 #include "pcctscfg.h"
18 #include "set.h"
19 #include <ctype.h>
20 #include "syn.h"
21 #include "hash.h"
22 #include "generic.h"
23 #define zzcr_attr(attr,tok,t)
24 #define zzSET_SIZE 20
25 #include "antlr.h"
26 #include "tokens.h"
27 #include "dlgdef.h"
28 #include "mode.h"
29
30 /* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */
31
32 #ifndef PCCTS_PURIFY
33 #define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s));
34 #endif
35
36 ANTLR_INFO
37
38
39 /* MR20 G. Hobbelt For Borland C++ 4.x & 5.x compiling with ALL warnings enabled */
40 #if defined(__TURBOC__)
41 #pragma warn -aus /* unused assignment of 'xxx' */
42 #endif
43
44
45 #ifdef __USE_PROTOS
46 static void chkToken(char *, char *, char *, int);
47 #else
48 static void chkToken();
49 #endif
50
51 #ifdef __USE_PROTOS
52 static int isDLGmaxToken(char *Token); /* MR3 */
53 #else
54 static int isDLGmaxToken(); /* MR3 */
55 #endif
56
57 static int class_nest_level = 0;
58
59 /* MR20 G. Hobbelt extern definitions moved to antlr.h */
60
61
62
63 void
64 #ifdef __USE_PROTOS
grammar(void)65 grammar(void)
66 #else
67 grammar()
68 #endif
69 {
70 zzRULE;
71 zzBLOCK(zztasp1);
72 zzMake0;
73 {
74 Graph g;
75 {
76 zzBLOCK(zztasp2);
77 zzMake0;
78 {
79 for (;;) {
80 if ( !((setwd1[LA(1)]&0x1))) break;
81 if ( (LA(1)==94) ) {
82 zzmatch(94); zzCONSUME;
83 zzmatch(Action);
84
85 if ( HdrAction==NULL ) {
86 HdrAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
87 require(HdrAction!=NULL, "rule grammar: cannot allocate header action");
88 strcpy(HdrAction, LATEXT(1));
89 }
90 else warn("additional #header statement ignored");
91 zzCONSUME;
92
93 }
94 else {
95 if ( (LA(1)==95) ) {
96 zzmatch(95); zzCONSUME;
97 zzmatch(Action);
98
99 if ( FirstAction==NULL ) {
100 FirstAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
101 require(FirstAction!=NULL, "rule grammar: cannot allocate #first action");
102 strcpy(FirstAction, LATEXT(1));
103 } else {
104 warn("additional #first statement ignored");
105 };
106 zzCONSUME;
107
108 }
109 else {
110 if ( (LA(1)==96) ) {
111 zzmatch(96); zzCONSUME;
112 zzmatch(QuotedTerm);
113
114 if ( GenCC ) {
115 warn("#parser meta-op incompatible with -CC; ignored");
116 }
117 else {
118 if ( strcmp(ParserName,"zzparser")==0 ) {
119 ParserName=StripQuotes(mystrdup(LATEXT(1)));
120 if ( RulePrefix[0]!='\0' )
121 {
122 warn("#parser meta-op incompatible with '-gp prefix'; '-gp' ignored");
123 RulePrefix[0]='\0';
124 }
125 }
126 else warn("additional #parser statement ignored");
127 }
128 zzCONSUME;
129
130 }
131 else {
132 if ( (LA(1)==97) ) {
133 zzmatch(97); zzCONSUME;
134 zzmatch(QuotedTerm);
135 {
136 char *fname;
137 zzantlr_state st; FILE *f; struct zzdlg_state dst;
138 UserTokenDefsFile = mystrdup(LATEXT(1));
139 zzsave_antlr_state(&st);
140 zzsave_dlg_state(&dst);
141 fname = mystrdup(LATEXT(1));
142 f = fopen(StripQuotes(fname), "r");
143 if ( f==NULL ) {warn(eMsg1("cannot open token defs file '%s'", fname+1));}
144 else {
145 ANTLRm(enum_file(fname+1), f, PARSE_ENUM_FILE);
146 UserDefdTokens = 1;
147 }
148 zzrestore_antlr_state(&st);
149 zzrestore_dlg_state(&dst);
150 }
151 zzCONSUME;
152
153 }
154 else break; /* MR6 code for exiting loop "for sure" */
155 }
156 }
157 }
158 zzLOOP(zztasp2);
159 }
160 zzEXIT(zztasp2);
161 }
162 }
163 {
164 zzBLOCK(zztasp2);
165 zzMake0;
166 {
167 for (;;) {
168 if ( !((setwd1[LA(1)]&0x2))) break;
169 if ( (LA(1)==Action) ) {
170 zzmatch(Action);
171 {
172 UserAction *ua = newUserAction(LATEXT(1));
173 ua->file = action_file; ua->line = action_line;
174 if ( class_nest_level>0 ) list_add(&class_before_actions, ua);
175 else list_add(&BeforeActions, ua);
176 }
177 zzCONSUME;
178
179 }
180 else {
181 if ( (LA(1)==108) ) {
182 laction();
183 }
184 else {
185 if ( (LA(1)==109) ) {
186 lmember();
187 }
188 else {
189 if ( (LA(1)==110) ) {
190 lprefix();
191 }
192 else {
193 if ( (LA(1)==116) ) {
194 aLexclass();
195 }
196 else {
197 if ( (LA(1)==120) ) {
198 token();
199 }
200 else {
201 if ( (LA(1)==117) ) {
202 error();
203 }
204 else {
205 if ( (LA(1)==118) ) {
206 tclass();
207 }
208 else {
209 if ( (LA(1)==111) ) {
210 aPred();
211 }
212 else {
213 if ( (LA(1)==133) ) {
214 default_exception_handler();
215 }
216 else {
217 if ( (LA(1)==99) ) {
218 class_def();
219 }
220 else {
221 if ( (LA(1)==98) ) {
222 zzmatch(98);
223
224 if ( class_nest_level==0 )
225 warn("missing class definition for trailing '}'");
226 class_nest_level--;
227 zzCONSUME;
228
229 }
230 else break; /* MR6 code for exiting loop "for sure" */
231 }
232 }
233 }
234 }
235 }
236 }
237 }
238 }
239 }
240 }
241 }
242 zzLOOP(zztasp2);
243 }
244 zzEXIT(zztasp2);
245 }
246 }
247 rule();
248 g=zzaArg(zztasp1,3); SynDiag = (Junction *) zzaArg(zztasp1,3 ).left;
249 {
250 zzBLOCK(zztasp2);
251 zzMake0;
252 {
253 for (;;) {
254 if ( !((setwd1[LA(1)]&0x4))) break;
255 if ( (LA(1)==NonTerminal) ) {
256 rule();
257 if ( zzaArg(zztasp2,1 ).left!=NULL ) {
258 g.right = NULL;
259
260 /* MR21a */ /* Avoid use of a malformed graph when CannotContinue */
261 /* MR21a */ /* is already set */
262 /* MR21a */
263 /* MR21a */ if (! (CannotContinue && g.left == NULL)) {
264 /* MR21a */ g = Or(g, zzaArg(zztasp2,1));
265 /* MR21a */ }
266 /* MR21a */ }
267 }
268 else {
269 if ( (LA(1)==116) ) {
270 aLexclass();
271 }
272 else {
273 if ( (LA(1)==120) ) {
274 token();
275 }
276 else {
277 if ( (LA(1)==117) ) {
278 error();
279 }
280 else {
281 if ( (LA(1)==118) ) {
282 tclass();
283 }
284 else {
285 if ( (LA(1)==111) ) {
286 aPred();
287 }
288 else {
289 if ( (LA(1)==99) ) {
290 class_def();
291 }
292 else {
293 if ( (LA(1)==98) ) {
294 zzmatch(98);
295
296 if ( class_nest_level==0 )
297 warn("missing class definition for trailing '}'");
298 class_nest_level--;
299 zzCONSUME;
300
301 }
302 else break; /* MR6 code for exiting loop "for sure" */
303 }
304 }
305 }
306 }
307 }
308 }
309 }
310 zzLOOP(zztasp2);
311 }
312 zzEXIT(zztasp2);
313 }
314 }
315 {
316 zzBLOCK(zztasp2);
317 zzMake0;
318 {
319 for (;;) {
320 if ( !((setwd1[LA(1)]&0x8))) break;
321 if ( (LA(1)==Action) ) {
322 zzmatch(Action);
323 {
324 UserAction *ua = newUserAction(LATEXT(1));
325 ua->file = action_file; ua->line = action_line;
326 if ( class_nest_level>0 ) list_add(&class_after_actions, ua);
327 else list_add(&AfterActions, ua);
328 }
329 zzCONSUME;
330
331 }
332 else {
333 if ( (LA(1)==108) ) {
334 laction();
335 }
336 else {
337 if ( (LA(1)==109) ) {
338 lmember();
339 }
340 else {
341 if ( (LA(1)==110) ) {
342 lprefix();
343 }
344 else {
345 if ( (LA(1)==117) ) {
346 error();
347 }
348 else {
349 if ( (LA(1)==118) ) {
350 tclass();
351 }
352 else {
353 if ( (LA(1)==99) ) {
354 class_def();
355 }
356 else {
357 if ( (LA(1)==111) ) {
358 aPred();
359 }
360 else {
361 if ( (LA(1)==98) ) {
362 zzmatch(98);
363
364 if ( class_nest_level==0 )
365 warn("missing class definition for trailing '}'");
366 class_nest_level--;
367 zzCONSUME;
368
369 }
370 else break; /* MR6 code for exiting loop "for sure" */
371 }
372 }
373 }
374 }
375 }
376 }
377 }
378 }
379 zzLOOP(zztasp2);
380 }
381 zzEXIT(zztasp2);
382 }
383 }
384 zzmatch(Eof); zzCONSUME;
385 zzEXIT(zztasp1);
386 return;
387 fail:
388 zzEXIT(zztasp1);
389 CannotContinue=TRUE;
390 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
391 zzresynch(setwd1, 0x10);
392 }
393 }
394
395 void
396 #ifdef __USE_PROTOS
class_def(void)397 class_def(void)
398 #else
399 class_def()
400 #endif
401 {
402 zzRULE;
403 zzBLOCK(zztasp1);
404 zzMake0;
405 {
406 int go=1; char name[MaxRuleName+1];
407 zzmatch(99); zzCONSUME;
408 {
409 zzBLOCK(zztasp2);
410 zzMake0;
411 {
412 if ( (LA(1)==NonTerminal) ) {
413 zzmatch(NonTerminal);
414 if(go) strncpy(name,LATEXT(1),MaxRuleName);
415 zzCONSUME;
416
417 }
418 else {
419 if ( (LA(1)==TokenTerm) ) {
420 zzmatch(TokenTerm);
421 if(go) strncpy(name,LATEXT(1),MaxRuleName);
422 zzCONSUME;
423
424 }
425 else {zzFAIL(1,zzerr1,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
426 }
427 zzEXIT(zztasp2);
428 }
429 }
430
431 if ( CurrentClassName[0]!='\0' && strcmp(CurrentClassName,name)!=0
432 && GenCC ) {
433 err("only one grammar class allowed in this release");
434 go = 0;
435 }
436 else strcpy(CurrentClassName, name);
437 if ( !GenCC ) { err("class meta-op used without C++ option"); }
438 {
439 zzBLOCK(zztasp2);
440 zzMake0;
441 {
442 while ( (setwd1[LA(1)]&0x20) ) {
443 zzsetmatch(zzerr2, zzerr3);
444 if (ClassDeclStuff == NULL) {
445 /* MR10 */ ClassDeclStuff=(char *)calloc(MaxClassDeclStuff+1,sizeof(char));
446 /* MR10 */ };
447 /* MR10 */ strncat(ClassDeclStuff," ",MaxClassDeclStuff);
448 /* MR10 */ strncat(ClassDeclStuff,LATEXT(1),MaxClassDeclStuff);
449 /* MR22 */ do {
450 /* MR22 */ if (0 == strcmp(LATEXT(1),"public")) break;
451 /* MR22 */ if (0 == strcmp(LATEXT(1),"private")) break;
452 /* MR22 */ if (0 == strcmp(LATEXT(1),"protected")) break;
453 /* MR22 */ if (0 == strcmp(LATEXT(1),"virtual")) break;
454 /* MR22 */ if (0 == strcmp(LATEXT(1),",")) break;
455 /* MR22 */ if (0 == strcmp(LATEXT(1),":")) break;
456 /* MR22 */ if (BaseClassName != NULL) break;
457 /* MR22 */ BaseClassName=(char *)calloc(strlen(LATEXT(1))+1,sizeof(char));
458 /* MR22 */ require(BaseClassName!=NULL, "rule grammar: cannot allocate base class name");
459 /* MR22 */ strcpy(BaseClassName,LATEXT(1));
460 /* MR22 */ } while (0);
461 /* MR10 */
462 zzCONSUME;
463
464 zzLOOP(zztasp2);
465 }
466 zzEXIT(zztasp2);
467 }
468 }
469 zzmatch(102);
470
471 no_classes_found = 0;
472 if ( class_nest_level>=1 ) {warn("cannot have nested classes");}
473 else class_nest_level++;
474 zzCONSUME;
475
476 zzEXIT(zztasp1);
477 return;
478 fail:
479 zzEXIT(zztasp1);
480 CannotContinue=TRUE;
481 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
482 zzresynch(setwd1, 0x40);
483 }
484 }
485
486 void
487 #ifdef __USE_PROTOS
rule(void)488 rule(void)
489 #else
490 rule()
491 #endif
492 {
493 zzRULE;
494 zzBLOCK(zztasp1);
495 zzMake0;
496 {
497
498
499 ExceptionGroup *eg;
500 RuleEntry *q; Junction *p; Graph r; int f, l; ECnode *e;
501 set toksrefd, rulesrefd;
502 char *pdecl=NULL, *ret=NULL, *a; CurRetDef = CurParmDef = NULL;
503 CurExGroups = NULL;
504 CurElementLabels = NULL;
505 CurAstLabelsInActions = NULL; /* MR27 */
506 /* We want a new element label hash table for each rule */
507 if ( Elabel!=NULL ) killHashTable(Elabel);
508 Elabel = newHashTable();
509 attribsRefdFromAction = empty;
510 zzmatch(NonTerminal);
511 q=NULL;
512 if ( hash_get(Rname, LATEXT(1))!=NULL ) {
513 err(eMsg1("duplicate rule definition: '%s'",LATEXT(1)));
514 CannotContinue=TRUE;
515 }
516 else
517 {
518 q = (RuleEntry *)hash_add(Rname,
519 LATEXT(1),
520 (Entry *)newRuleEntry(LATEXT(1)));
521 CurRule = q->str;
522 }
523 CurRuleNode = q;
524 f = CurFile; l = zzline;
525 NumRules++;
526 zzCONSUME;
527
528 {
529 zzBLOCK(zztasp2);
530 zzMake0;
531 {
532 if ( (LA(1)==103) ) {
533 zzmatch(103);
534 if ( q!=NULL ) q->noAST = TRUE;
535 zzCONSUME;
536
537 }
538 else {
539 if ( (setwd1[LA(1)]&0x80) ) {
540 }
541 else {zzFAIL(1,zzerr4,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
542 }
543 zzEXIT(zztasp2);
544 }
545 }
546 {
547 zzBLOCK(zztasp2);
548 zzMake0;
549 {
550 ;
551 if ( (setwd2[LA(1)]&0x1) ) {
552 {
553 zzBLOCK(zztasp3);
554 zzMake0;
555 {
556 if ( (LA(1)==104) ) {
557 zzmatch(104); zzCONSUME;
558 }
559 else {
560 if ( (LA(1)==PassAction) ) {
561 }
562 else {zzFAIL(1,zzerr5,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
563 }
564 zzEXIT(zztasp3);
565 }
566 }
567 zzmatch(PassAction);
568 pdecl = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
569 require(pdecl!=NULL, "rule rule: cannot allocate param decl");
570 strcpy(pdecl, LATEXT(1));
571 CurParmDef = pdecl;
572 zzCONSUME;
573
574 }
575 else {
576 if ( (setwd2[LA(1)]&0x2) ) {
577 }
578 else {zzFAIL(1,zzerr6,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
579 }
580 zzEXIT(zztasp2);
581 }
582 }
583 {
584 zzBLOCK(zztasp2);
585 zzMake0;
586 {
587 if ( (LA(1)==105) ) {
588 zzmatch(105); zzCONSUME;
589 zzmatch(PassAction);
590 ret = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
591 require(ret!=NULL, "rule rule: cannot allocate ret type");
592 strcpy(ret, LATEXT(1));
593 CurRetDef = ret;
594 zzCONSUME;
595
596 }
597 else {
598 if ( (setwd2[LA(1)]&0x4) ) {
599 }
600 else {zzFAIL(1,zzerr7,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
601 }
602 zzEXIT(zztasp2);
603 }
604 }
605 {
606 zzBLOCK(zztasp2);
607 zzMake0;
608 {
609 if ( (LA(1)==QuotedTerm) ) {
610 zzmatch(QuotedTerm);
611 if ( q!=NULL ) q->egroup=mystrdup(LATEXT(1));
612 zzCONSUME;
613
614 }
615 else {
616 if ( (LA(1)==106) ) {
617 }
618 else {zzFAIL(1,zzerr8,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
619 }
620 zzEXIT(zztasp2);
621 }
622 }
623
624 if ( GenEClasseForRules && q!=NULL ) {
625 e = newECnode;
626 require(e!=NULL, "cannot allocate error class node");
627 if ( q->egroup == NULL ) {a = q->str; a[0] = (char)toupper(a[0]);}
628 else a = q->egroup;
629 if ( Tnum( a ) == 0 )
630 {
631 e->tok = addTname( a );
632 list_add(&eclasses, (char *)e);
633 if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]);
634 /* refers to itself */
635 list_add(&(e->elist), mystrdup(q->str));
636 }
637 else {
638 warn(eMsg1("default errclass for '%s' would conflict with token/errclass/tokclass",a));
639 if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]);
640 free((char *)e);
641 }
642 }
643 BlkLevel++;
644 if (BlkLevel >= MAX_BLK_LEVEL) fatal("Blocks nested too deeply");
645 /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID;
646 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum;
647 zzmatch(106);
648 inAlt=1;
649 zzCONSUME;
650
651 block( &toksrefd, &rulesrefd );
652 r = makeBlk(zzaArg(zztasp1,7),0, NULL /* pFirstSetSymbol */ );
653 CurRuleBlk = (Junction *)r.left;
654 CurRuleBlk->blockid = CurBlockID;
655 CurRuleBlk->jtype = RuleBlk;
656 if ( q!=NULL ) CurRuleBlk->rname = q->str;
657 CurRuleBlk->file = f;
658 CurRuleBlk->line = l;
659 CurRuleBlk->pdecl = pdecl;
660 CurRuleBlk->ret = ret;
661 CurRuleBlk->lock = makelocks();
662 CurRuleBlk->pred_lock = makelocks();
663 CurRuleBlk->tokrefs = toksrefd;
664 CurRuleBlk->rulerefs = rulesrefd;
665 p = newJunction(); /* add EndRule Node */
666 ((Junction *)r.right)->p1 = (Node *)p;
667 r.right = (Node *) p;
668 p->jtype = EndRule;
669 p->lock = makelocks();
670 p->pred_lock = makelocks();
671 CurRuleBlk->end = p;
672 if ( q!=NULL ) q->rulenum = NumRules;
673 zzaArg(zztasp1,7) = r;
674
675 /* MR23 */ CurBlockID_array[BlkLevel] = (-1);
676 /* MR23 */ CurAltNum_array[BlkLevel] = (-1);
677 --BlkLevel;
678 altFixup();leFixup();egFixup();
679 zzmatch(107);
680 inAlt=0;
681 zzCONSUME;
682
683 {
684 zzBLOCK(zztasp2);
685 zzMake0;
686 {
687 if ( (LA(1)==Action) ) {
688 zzmatch(Action);
689 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
690 require(a!=NULL, "rule rule: cannot allocate error action");
691 strcpy(a, LATEXT(1));
692 CurRuleBlk->erraction = a;
693 zzCONSUME;
694
695 }
696 else {
697 if ( (setwd2[LA(1)]&0x8) ) {
698 }
699 else {zzFAIL(1,zzerr9,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
700 }
701 zzEXIT(zztasp2);
702 }
703 }
704 {
705 zzBLOCK(zztasp2);
706 zzMake0;
707 {
708 while ( (LA(1)==133) ) {
709 eg = exception_group();
710
711 if ( eg!=NULL ) {
712 list_add(&CurExGroups, (void *)eg);
713 if (eg->label == NULL || *eg->label=='\0' ) q->has_rule_exception = 1;
714 }
715 zzLOOP(zztasp2);
716 }
717 zzEXIT(zztasp2);
718 }
719 }
720 if ( q==NULL ) zzaArg(zztasp1,0 ).left = NULL; else zzaArg(zztasp1,0) = zzaArg(zztasp1,7);
721 CurRuleBlk->exceptions = CurExGroups;
722 CurRuleBlk->el_labels = CurElementLabels;
723 CurRuleNode->ast_labels_in_actions = CurAstLabelsInActions;
724 CurRuleNode = NULL;
725 zzEXIT(zztasp1);
726 return;
727 fail:
728 zzEXIT(zztasp1);
729 CannotContinue=TRUE;
730 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
731 zzresynch(setwd2, 0x10);
732 }
733 }
734
735 void
736 #ifdef __USE_PROTOS
laction(void)737 laction(void)
738 #else
739 laction()
740 #endif
741 {
742 zzRULE;
743 zzBLOCK(zztasp1);
744 zzMake0;
745 {
746 char *a;
747 zzmatch(108); zzCONSUME;
748 zzmatch(Action);
749
750 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
751 require(a!=NULL, "rule laction: cannot allocate action");
752 strcpy(a, LATEXT(1));
753 list_add(&LexActions, a);
754 zzCONSUME;
755
756 zzEXIT(zztasp1);
757 return;
758 fail:
759 zzEXIT(zztasp1);
760 CannotContinue=TRUE;
761 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
762 zzresynch(setwd2, 0x20);
763 }
764 }
765
766 void
767 #ifdef __USE_PROTOS
lmember(void)768 lmember(void)
769 #else
770 lmember()
771 #endif
772 {
773 zzRULE;
774 zzBLOCK(zztasp1);
775 zzMake0;
776 {
777 char *a;
778 zzmatch(109); zzCONSUME;
779 zzmatch(Action);
780
781 /* MR1 */ if (! GenCC) {
782 /* MR1 */ err("Use #lexmember only in C++ mode (to insert code in DLG class header");
783 /* MR1 */ } else {
784 /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
785 /* MR1 */ require(a!=NULL, "rule lmember: cannot allocate action");
786 /* MR1 */ strcpy(a, LATEXT(1));
787 /* MR1 */ list_add(&LexMemberActions, a);
788 /* MR1 */ };
789 /* MR1 */
790 zzCONSUME;
791
792 zzEXIT(zztasp1);
793 return;
794 fail:
795 zzEXIT(zztasp1);
796 CannotContinue=TRUE;
797 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
798 zzresynch(setwd2, 0x40);
799 }
800 }
801
802 void
803 #ifdef __USE_PROTOS
lprefix(void)804 lprefix(void)
805 #else
806 lprefix()
807 #endif
808 {
809 zzRULE;
810 zzBLOCK(zztasp1);
811 zzMake0;
812 {
813 char *a;
814 zzmatch(110); zzCONSUME;
815 zzmatch(Action);
816
817 /* MR1 */ if (! GenCC) {
818 /* MR1 */ err("Use #lexprefix only in C++ mode (to insert code in DLG class header");
819 /* MR1 */ } else {
820 /* MR1 */ a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
821 /* MR1 */ require(a!=NULL, "rule lprefix: cannot allocate action");
822 /* MR1 */ strcpy(a, LATEXT(1));
823 /* MR1 */ list_add(&LexPrefixActions, a);
824 /* MR1 */ };
825 /* MR1 */
826 zzCONSUME;
827
828 zzEXIT(zztasp1);
829 return;
830 fail:
831 zzEXIT(zztasp1);
832 CannotContinue=TRUE;
833 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
834 zzresynch(setwd2, 0x80);
835 }
836 }
837
838 void
839 #ifdef __USE_PROTOS
aPred(void)840 aPred(void)
841 #else
842 aPred()
843 #endif
844 {
845 zzRULE;
846 zzBLOCK(zztasp1);
847 zzMake0;
848 {
849 PredEntry *predEntry=NULL;
850 char *name=NULL;
851 Predicate *predExpr=NULL;
852 char *predLiteral=NULL;
853 int save_file;
854 int save_line;
855 int predExprPresent=0;
856 zzmatch(111);
857
858 MR_usingPredNames=1; /* will need to use -mrhoist version of genPredTree */
859 zzCONSUME;
860
861 zzmatch(TokenTerm);
862 name=mystrdup(LATEXT(1));
863 zzCONSUME;
864
865
866 /* don't free - referenced in predicates */
867
868 CurPredName=(char *)calloc(1,strlen(name) + 10);
869 strcat(CurPredName,"#pred ");
870 strcat(CurPredName,name);
871
872 predEntry=(PredEntry *) hash_get(Pname,name);
873 if (predEntry != NULL) {
874 warnFL(eMsg1("#pred %s previously defined - ignored",name),
875 FileStr[action_file],action_line);
876 name=NULL;
877 };
878 {
879 zzBLOCK(zztasp2);
880 zzMake0;
881 {
882 if ( (LA(1)==Pred) ) {
883 zzmatch(Pred);
884 predLiteral=mystrdup(LATEXT(1));
885 save_line=action_line;
886 save_file=action_file;
887 zzCONSUME;
888
889 {
890 zzBLOCK(zztasp3);
891 zzMake0;
892 {
893 if ( (setwd3[LA(1)]&0x1) ) {
894 predExpr = predOrExpr();
895
896 predExprPresent=1;
897 }
898 else {
899 if ( (setwd3[LA(1)]&0x2) ) {
900 }
901 else {zzFAIL(1,zzerr10,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
902 }
903 zzEXIT(zztasp3);
904 }
905 }
906 if (predLiteral != NULL && name != NULL) {
907
908 /*
909 * predExpr may be NULL due to syntax errors
910 * or simply omitted by the user
911 */
912
913 predEntry=newPredEntry(name);
914 predEntry->file=save_file;
915 predEntry->line=save_line;
916 predExpr=MR_predFlatten(predExpr);
917 predEntry->predLiteral=predLiteral;
918 if (! predExprPresent || predExpr == NULL) {
919 predExpr=new_pred();
920 predExpr->expr=predLiteral;
921 predExpr->source=newActionNode();
922 predExpr->source->action=predExpr->expr;
923 predExpr->source->rname=CurPredName;
924 predExpr->source->line=action_line;
925 predExpr->source->file=action_file;
926 predExpr->source->is_predicate=1;
927 predExpr->k=predicateLookaheadDepth(predExpr->source);
928 };
929 predEntry->pred=predExpr;
930 hash_add(Pname,name,(Entry *)predEntry);
931 predExpr=NULL;
932 };
933 predicate_free(predExpr);
934 }
935 else {
936 if ( (setwd3[LA(1)]&0x4) ) {
937 save_line=zzline; save_file=CurFile;
938 predExpr = predOrExpr();
939
940 if (predExpr != NULL && name != NULL) {
941 predEntry=newPredEntry(name);
942 predEntry->file=CurFile;
943 predEntry->line=zzline;
944 predExpr=MR_predFlatten(predExpr);
945 predEntry->pred=predExpr;
946 hash_add(Pname,name,(Entry *)predEntry);
947 predExpr=NULL;
948 };
949 predicate_free(predExpr);
950 }
951 else {zzFAIL(1,zzerr11,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
952 }
953 zzEXIT(zztasp2);
954 }
955 }
956 {
957 zzBLOCK(zztasp2);
958 zzMake0;
959 {
960 if ( (LA(1)==107) ) {
961 zzmatch(107); zzCONSUME;
962 }
963 else {
964 if ( (setwd3[LA(1)]&0x8) ) {
965 }
966 else {zzFAIL(1,zzerr12,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
967 }
968 zzEXIT(zztasp2);
969 }
970 }
971 zzEXIT(zztasp1);
972 return;
973 fail:
974 zzEXIT(zztasp1);
975 predicate_free(predExpr);
976 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
977 zzresynch(setwd3, 0x10);
978 }
979 }
980
981 Predicate *
982 #ifdef __USE_PROTOS
predOrExpr(void)983 predOrExpr(void)
984 #else
985 predOrExpr()
986 #endif
987 {
988 Predicate * _retv;
989 zzRULE;
990 zzBLOCK(zztasp1);
991 PCCTS_PURIFY(_retv,sizeof(Predicate * ))
992 zzMake0;
993 {
994 Predicate *ORnode;
995 Predicate *predExpr;
996 Predicate **tail=NULL;
997 predExpr = predAndExpr();
998
999
1000 ORnode=new_pred();
1001 ORnode->expr=PRED_OR_LIST;
1002 if (predExpr != NULL) {
1003 ORnode->down=predExpr;
1004 tail=&predExpr->right;
1005 };
1006 {
1007 zzBLOCK(zztasp2);
1008 zzMake0;
1009 {
1010 while ( (LA(1)==112) ) {
1011 zzmatch(112); zzCONSUME;
1012 predExpr = predAndExpr();
1013
1014
1015 if (predExpr != NULL) {
1016 *tail=predExpr;
1017 tail=&predExpr->right;
1018 };
1019 zzLOOP(zztasp2);
1020 }
1021 zzEXIT(zztasp2);
1022 }
1023 }
1024
1025 _retv=ORnode;
1026 ORnode=NULL;
1027 zzEXIT(zztasp1);
1028 return _retv;
1029 fail:
1030 zzEXIT(zztasp1);
1031 predicate_free(ORnode);
1032 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1033 zzresynch(setwd3, 0x20);
1034 return _retv;
1035 }
1036 }
1037
1038 Predicate *
1039 #ifdef __USE_PROTOS
predAndExpr(void)1040 predAndExpr(void)
1041 #else
1042 predAndExpr()
1043 #endif
1044 {
1045 Predicate * _retv;
1046 zzRULE;
1047 zzBLOCK(zztasp1);
1048 PCCTS_PURIFY(_retv,sizeof(Predicate * ))
1049 zzMake0;
1050 {
1051 Predicate *ANDnode;
1052 Predicate *predExpr;
1053 Predicate **tail=NULL;
1054 predExpr = predPrimary();
1055
1056
1057 ANDnode=new_pred();
1058 ANDnode->expr=PRED_AND_LIST;
1059 if (predExpr != NULL) {
1060 ANDnode->down=predExpr;
1061 tail=&predExpr->right;
1062 };
1063 {
1064 zzBLOCK(zztasp2);
1065 zzMake0;
1066 {
1067 while ( (LA(1)==113) ) {
1068 zzmatch(113); zzCONSUME;
1069 predExpr = predPrimary();
1070
1071
1072 if (predExpr != NULL) {
1073 *tail=predExpr;
1074 tail=&predExpr->right;
1075 };
1076 zzLOOP(zztasp2);
1077 }
1078 zzEXIT(zztasp2);
1079 }
1080 }
1081
1082 _retv=ANDnode;
1083 ANDnode=NULL;
1084 zzEXIT(zztasp1);
1085 return _retv;
1086 fail:
1087 zzEXIT(zztasp1);
1088 predicate_free(ANDnode);
1089 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1090 zzresynch(setwd3, 0x40);
1091 return _retv;
1092 }
1093 }
1094
1095 Predicate *
1096 #ifdef __USE_PROTOS
predPrimary(void)1097 predPrimary(void)
1098 #else
1099 predPrimary()
1100 #endif
1101 {
1102 Predicate * _retv;
1103 zzRULE;
1104 zzBLOCK(zztasp1);
1105 PCCTS_PURIFY(_retv,sizeof(Predicate * ))
1106 zzMake0;
1107 {
1108
1109 char *name=NULL;
1110 PredEntry *predEntry=NULL;
1111 Predicate *predExpr=NULL;
1112 if ( (LA(1)==TokenTerm) ) {
1113 zzmatch(TokenTerm);
1114 name=mystrdup(LATEXT(1));
1115 zzCONSUME;
1116
1117
1118 predEntry=(PredEntry *) hash_get(Pname,name);
1119 if (predEntry == NULL) {
1120 warnFL(eMsg1("no previously defined #pred with name \"%s\"",name),
1121 FileStr[CurFile],zzline);
1122 name=NULL;
1123 _retv=NULL;
1124 } else {
1125 predExpr=predicate_dup(predEntry->pred);
1126 predExpr->predEntry=predEntry;
1127 _retv=predExpr;
1128 };
1129 }
1130 else {
1131 if ( (LA(1)==114) ) {
1132 zzmatch(114); zzCONSUME;
1133 predExpr = predOrExpr();
1134
1135 zzmatch(115);
1136
1137 _retv=predExpr;
1138 zzCONSUME;
1139
1140 }
1141 else {
1142 if ( (LA(1)==103) ) {
1143 zzmatch(103); zzCONSUME;
1144 predExpr = predPrimary();
1145
1146
1147 predExpr->inverted=!predExpr->inverted;
1148 _retv=predExpr;
1149 }
1150 else {zzFAIL(1,zzerr13,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1151 }
1152 }
1153 zzEXIT(zztasp1);
1154 return _retv;
1155 fail:
1156 zzEXIT(zztasp1);
1157
1158 predicate_free(predExpr);
1159 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1160 zzresynch(setwd3, 0x80);
1161 return _retv;
1162 }
1163 }
1164
1165 void
1166 #ifdef __USE_PROTOS
aLexclass(void)1167 aLexclass(void)
1168 #else
1169 aLexclass()
1170 #endif
1171 {
1172 zzRULE;
1173 zzBLOCK(zztasp1);
1174 zzMake0;
1175 {
1176 zzmatch(116); zzCONSUME;
1177 zzmatch(TokenTerm);
1178 lexclass(mystrdup(LATEXT(1)));
1179 zzCONSUME;
1180
1181 zzEXIT(zztasp1);
1182 return;
1183 fail:
1184 zzEXIT(zztasp1);
1185 CannotContinue=TRUE;
1186 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1187 zzresynch(setwd4, 0x1);
1188 }
1189 }
1190
1191 void
1192 #ifdef __USE_PROTOS
error(void)1193 error(void)
1194 #else
1195 error()
1196 #endif
1197 {
1198 zzRULE;
1199 zzBLOCK(zztasp1);
1200 zzMake0;
1201 {
1202 char *t=NULL; ECnode *e; int go=1; TermEntry *p;
1203 zzmatch(117); zzCONSUME;
1204 {
1205 zzBLOCK(zztasp2);
1206 zzMake0;
1207 {
1208 ;
1209 if ( (LA(1)==TokenTerm) ) {
1210 zzmatch(TokenTerm);
1211 t=mystrdup(LATEXT(1));
1212 zzCONSUME;
1213
1214 }
1215 else {
1216 if ( (LA(1)==QuotedTerm) ) {
1217 zzmatch(QuotedTerm);
1218 t=mystrdup(LATEXT(1));
1219 zzCONSUME;
1220
1221 }
1222 else {zzFAIL(1,zzerr14,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1223 }
1224 zzEXIT(zztasp2);
1225 }
1226 }
1227 e = newECnode;
1228 require(e!=NULL, "cannot allocate error class node");
1229 e->lexclass = CurrentLexClass;
1230 if ( Tnum( (t=StripQuotes(t)) ) == 0 )
1231 {
1232 if ( hash_get(Texpr, t) != NULL )
1233 warn(eMsg1("errclass name conflicts with regular expression '%s'",t));
1234 e->tok = addTname( t );
1235 set_orel(e->tok, &imag_tokens);
1236 require((p=(TermEntry *)hash_get(Tname, t)) != NULL,
1237 "hash table mechanism is broken");
1238 p->classname = 1; /* entry is errclass name, not token */
1239 list_add(&eclasses, (char *)e);
1240 }
1241 else
1242 {
1243 warn(eMsg1("redefinition of errclass or conflict w/token or tokclass '%s'; ignored",t));
1244 free( (char *)e );
1245 go=0;
1246 }
1247 zzmatch(102); zzCONSUME;
1248 {
1249 zzBLOCK(zztasp2);
1250 zzMake0;
1251 {
1252 if ( (LA(1)==NonTerminal) ) {
1253 zzmatch(NonTerminal);
1254 if ( go ) t=mystrdup(LATEXT(1));
1255 zzCONSUME;
1256
1257 }
1258 else {
1259 if ( (LA(1)==TokenTerm) ) {
1260 zzmatch(TokenTerm);
1261 if ( go ) t=mystrdup(LATEXT(1));
1262 zzCONSUME;
1263
1264 }
1265 else {
1266 if ( (LA(1)==QuotedTerm) ) {
1267 zzmatch(QuotedTerm);
1268 if ( go ) t=mystrdup(LATEXT(1));
1269 zzCONSUME;
1270
1271 }
1272 else {zzFAIL(1,zzerr15,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1273 }
1274 }
1275 zzEXIT(zztasp2);
1276 }
1277 }
1278 if ( go ) list_add(&(e->elist), t);
1279 {
1280 zzBLOCK(zztasp2);
1281 zzMake0;
1282 {
1283 while ( (setwd4[LA(1)]&0x2) ) {
1284 {
1285 zzBLOCK(zztasp3);
1286 zzMake0;
1287 {
1288 if ( (LA(1)==NonTerminal) ) {
1289 zzmatch(NonTerminal);
1290 if ( go ) t=mystrdup(LATEXT(1));
1291 zzCONSUME;
1292
1293 }
1294 else {
1295 if ( (LA(1)==TokenTerm) ) {
1296 zzmatch(TokenTerm);
1297 if ( go ) t=mystrdup(LATEXT(1));
1298 zzCONSUME;
1299
1300 }
1301 else {
1302 if ( (LA(1)==QuotedTerm) ) {
1303 zzmatch(QuotedTerm);
1304 if ( go ) t=mystrdup(LATEXT(1));
1305 zzCONSUME;
1306
1307 }
1308 else {zzFAIL(1,zzerr16,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1309 }
1310 }
1311 zzEXIT(zztasp3);
1312 }
1313 }
1314 if ( go ) list_add(&(e->elist), t);
1315 zzLOOP(zztasp2);
1316 }
1317 zzEXIT(zztasp2);
1318 }
1319 }
1320 zzmatch(98); zzCONSUME;
1321 zzEXIT(zztasp1);
1322 return;
1323 fail:
1324 zzEXIT(zztasp1);
1325 CannotContinue=TRUE;
1326 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1327 zzresynch(setwd4, 0x4);
1328 }
1329 }
1330
1331 void
1332 #ifdef __USE_PROTOS
tclass(void)1333 tclass(void)
1334 #else
1335 tclass()
1336 #endif
1337 {
1338 zzRULE;
1339 zzBLOCK(zztasp1);
1340 zzMake0;
1341 {
1342 char *t=NULL; TCnode *e; int go=1,tok,totok; TermEntry *p, *term, *toterm;
1343 char *akaString=NULL; int save_file; int save_line;
1344 char *totext=NULL;
1345 zzmatch(118); zzCONSUME;
1346 zzmatch(TokenTerm);
1347 t=mystrdup(LATEXT(1));
1348 zzCONSUME;
1349
1350 e = newTCnode;
1351 require(e!=NULL, "cannot allocate token class node");
1352 e->lexclass = CurrentLexClass;
1353 if ( Tnum( t ) == 0 )
1354 {
1355 e->tok = addTname( t );
1356 set_orel(e->tok, &imag_tokens);
1357 set_orel(e->tok, &tokclasses);
1358 require((p=(TermEntry *)hash_get(Tname, t)) != NULL,
1359 "hash table mechanism is broken");
1360 p->classname = 1; /* entry is class name, not token */
1361 p->tclass = e; /* save ptr to this tclass def */
1362 list_add(&tclasses, (char *)e);
1363 }
1364 else
1365 {
1366 warn(eMsg1("redefinition of tokclass or conflict w/token '%s'; ignored",t));
1367 free( (char *)e );
1368 go=0;
1369 }
1370 {
1371 zzBLOCK(zztasp2);
1372 zzMake0;
1373 {
1374 if ( (LA(1)==114) ) {
1375 zzmatch(114); zzCONSUME;
1376 zzmatch(QuotedTerm);
1377 akaString=mystrdup(StripQuotes(LATEXT(1)));
1378 /* MR11 */ save_file=CurFile;save_line=zzline;
1379 /* MR23 */
1380 zzCONSUME;
1381
1382 zzmatch(115); zzCONSUME;
1383 }
1384 else {
1385 if ( (LA(1)==102) ) {
1386 }
1387 else {zzFAIL(1,zzerr17,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1388 }
1389 zzEXIT(zztasp2);
1390 }
1391 }
1392
1393 /* MR23 */ if (p!= NULL && akaString != NULL) {
1394 /* MR23 */ if (p->akaString != NULL) {
1395 /* MR23 */ if (strcmp(p->akaString,akaString) != 0) {
1396 /* MR23 */ warnFL(eMsg2("this #tokclass statment conflicts with a previous #tokclass %s(\"%s\") statement",
1397 /* MR23 */ t,p->akaString),
1398 /* MR23 */ FileStr[save_file],save_line);
1399 /* MR23 */ };
1400 /* MR23 */ } else {
1401 /* MR23 */ p->akaString=akaString;
1402 /* MR23 */ };
1403 /* MR23 */ };
1404 /* MR23 */
1405 zzmatch(102); zzCONSUME;
1406 {
1407 zzBLOCK(zztasp2);
1408 int zzcnt=1;
1409 zzMake0;
1410 {
1411 do {
1412 {
1413 zzBLOCK(zztasp3);
1414 zzMake0;
1415 {
1416 if ( (LA(1)==TokenTerm) ) {
1417 zzmatch(TokenTerm);
1418 if ( go ) {
1419 term = (TermEntry *) hash_get(Tname, LATEXT(1));
1420 if ( term==NULL && UserDefdTokens ) {
1421 err("implicit token definition not allowed with #tokdefs");
1422 go = 0;
1423 }
1424 else {t=mystrdup(LATEXT(1)); tok=addTname(LATEXT(1));}
1425 }
1426 zzCONSUME;
1427
1428 {
1429 zzBLOCK(zztasp4);
1430 zzMake0;
1431 {
1432 if ( (LA(1)==119) ) {
1433 zzmatch(119); zzCONSUME;
1434 zzmatch(TokenTerm);
1435 if ( go ) {
1436 toterm = (TermEntry *) hash_get(Tname, LATEXT(1));
1437 if ( toterm==NULL && UserDefdTokens ) {
1438 err("implicit token definition not allowed with #tokdefs");
1439 go = 0;
1440 } else {
1441 totext=mystrdup(LATEXT(1)); totok=addTname(LATEXT(1));
1442 }
1443 }
1444 zzCONSUME;
1445
1446 }
1447 else {
1448 if ( (setwd4[LA(1)]&0x8) ) {
1449 }
1450 else {zzFAIL(1,zzerr18,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1451 }
1452 zzEXIT(zztasp4);
1453 }
1454 }
1455 }
1456 else {
1457 if ( (LA(1)==QuotedTerm) ) {
1458 zzmatch(QuotedTerm);
1459 if ( go ) {
1460 term = (TermEntry *) hash_get(Texpr, LATEXT(1));
1461 if ( term==NULL && UserDefdTokens ) {
1462 err("implicit token definition not allowed with #tokdefs");
1463 go = 0;
1464 }
1465 else {t=mystrdup(LATEXT(1)); tok=addTexpr(LATEXT(1));}
1466 }
1467 zzCONSUME;
1468
1469 }
1470 else {zzFAIL(1,zzerr19,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1471 }
1472 zzEXIT(zztasp3);
1473 }
1474 }
1475 if ( go ) {
1476 if (totext == NULL) {
1477 list_add(&(e->tlist), t);
1478 } else {
1479 list_add(&(e->tlist),"..");
1480 list_add(&(e->tlist),t);
1481 list_add(&(e->tlist),totext);
1482 }
1483 totext=NULL;
1484 }
1485 zzLOOP(zztasp2);
1486 } while ( (setwd4[LA(1)]&0x10) );
1487 zzEXIT(zztasp2);
1488 }
1489 }
1490 zzmatch(98); zzCONSUME;
1491 zzEXIT(zztasp1);
1492 return;
1493 fail:
1494 zzEXIT(zztasp1);
1495 CannotContinue=TRUE;
1496 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1497 zzresynch(setwd4, 0x20);
1498 }
1499 }
1500
1501 void
1502 #ifdef __USE_PROTOS
token(void)1503 token(void)
1504 #else
1505 token()
1506 #endif
1507 {
1508 zzRULE;
1509 zzBLOCK(zztasp1);
1510 zzMake0;
1511 {
1512 char *t=NULL, *e=NULL, *a=NULL; int tnum=0;
1513 char *akaString=NULL; TermEntry *te;int save_file=0,save_line=0;
1514 zzmatch(120);
1515 tokenActionActive=1;
1516 zzCONSUME;
1517
1518 {
1519 zzBLOCK(zztasp2);
1520 zzMake0;
1521 {
1522 if ( (LA(1)==TokenTerm) ) {
1523 zzmatch(TokenTerm);
1524 t=mystrdup(LATEXT(1));
1525 zzCONSUME;
1526
1527 {
1528 zzBLOCK(zztasp3);
1529 zzMake0;
1530 {
1531 if ( (LA(1)==114) ) {
1532 zzmatch(114); zzCONSUME;
1533 zzmatch(QuotedTerm);
1534 akaString=mystrdup(StripQuotes(LATEXT(1)));
1535 /* MR11 */ save_file=CurFile;save_line=zzline;
1536 /* MR11 */
1537 zzCONSUME;
1538
1539 zzmatch(115); zzCONSUME;
1540 }
1541 else {
1542 if ( (setwd4[LA(1)]&0x40) ) {
1543 }
1544 else {zzFAIL(1,zzerr20,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1545 }
1546 zzEXIT(zztasp3);
1547 }
1548 }
1549 {
1550 zzBLOCK(zztasp3);
1551 zzMake0;
1552 {
1553 if ( (LA(1)==121) ) {
1554 zzmatch(121); zzCONSUME;
1555 zzmatch(122);
1556 tnum = atoi(LATEXT(1));
1557 zzCONSUME;
1558
1559 }
1560 else {
1561 if ( (setwd4[LA(1)]&0x80) ) {
1562 }
1563 else {zzFAIL(1,zzerr21,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1564 }
1565 zzEXIT(zztasp3);
1566 }
1567 }
1568 }
1569 else {
1570 if ( (setwd5[LA(1)]&0x1) ) {
1571 }
1572 else {zzFAIL(1,zzerr22,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1573 }
1574 zzEXIT(zztasp2);
1575 }
1576 }
1577 {
1578 zzBLOCK(zztasp2);
1579 zzMake0;
1580 {
1581 if ( (LA(1)==QuotedTerm) ) {
1582 zzmatch(QuotedTerm);
1583 e=mystrdup(LATEXT(1));
1584 zzCONSUME;
1585
1586 }
1587 else {
1588 if ( (setwd5[LA(1)]&0x2) ) {
1589 }
1590 else {zzFAIL(1,zzerr23,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1591 }
1592 zzEXIT(zztasp2);
1593 }
1594 }
1595 {
1596 zzBLOCK(zztasp2);
1597 zzMake0;
1598 {
1599 if ( (LA(1)==Action) ) {
1600 zzmatch(Action);
1601
1602 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
1603 require(a!=NULL, "rule token: cannot allocate action");
1604 strcpy(a, LATEXT(1));
1605 zzCONSUME;
1606
1607 }
1608 else {
1609 if ( (setwd5[LA(1)]&0x4) ) {
1610 }
1611 else {zzFAIL(1,zzerr24,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1612 }
1613 zzEXIT(zztasp2);
1614 }
1615 }
1616 {
1617 zzBLOCK(zztasp2);
1618 zzMake0;
1619 {
1620 if ( (LA(1)==107) ) {
1621 zzmatch(107); zzCONSUME;
1622 }
1623 else {
1624 if ( (setwd5[LA(1)]&0x8) ) {
1625 }
1626 else {zzFAIL(1,zzerr25,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1627 }
1628 zzEXIT(zztasp2);
1629 }
1630 }
1631 chkToken(t, e, a, tnum);
1632 if (t != NULL) {
1633 te=(TermEntry *)hash_get(Tname,t);
1634 if (te != NULL && akaString != NULL) {
1635 if (te->akaString != NULL) {
1636 if (strcmp(te->akaString,akaString) != 0) {
1637 warnFL(eMsg2("this #token statment conflicts with a previous #token %s(\"%s\") statement",
1638 t,te->akaString),
1639 FileStr[save_file],save_line);
1640 };
1641 } else {
1642 te->akaString=akaString;
1643 };
1644 };
1645 };
1646 zzEXIT(zztasp1);
1647 return;
1648 fail:
1649 zzEXIT(zztasp1);
1650 CannotContinue=TRUE;
1651 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1652 zzresynch(setwd5, 0x10);
1653 }
1654 }
1655
1656 void
1657 #ifdef __USE_PROTOS
block(set * toksrefd,set * rulesrefd)1658 block(set * toksrefd,set * rulesrefd)
1659 #else
1660 block(toksrefd,rulesrefd)
1661 set *toksrefd;
1662 set *rulesrefd ;
1663 #endif
1664 {
1665 zzRULE;
1666 zzBLOCK(zztasp1);
1667 zzMake0;
1668 {
1669
1670 Graph g, b;
1671 set saveblah;
1672 int saveinalt = inAlt;
1673 ExceptionGroup *eg;
1674 * toksrefd = empty;
1675 * rulesrefd = empty;
1676 set_clr(AST_nodes_refd_in_actions);
1677 CurBlockID++;
1678 /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID;
1679 CurAltNum = 1;
1680 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum;
1681 saveblah = attribsRefdFromAction;
1682 attribsRefdFromAction = empty;
1683 alt( toksrefd,rulesrefd );
1684 b = g = zzaArg(zztasp1,1);
1685
1686 if ( ((Junction *)g.left)->p1->ntype == nAction )
1687 {
1688 ActionNode *actionNode=(ActionNode *)
1689 ( ( (Junction *)g.left) ->p1);
1690 if (!actionNode->is_predicate )
1691 {
1692 actionNode->init_action = TRUE;
1693 /* MR12c */ if (actionNode->noHoist) {
1694 /* MR12c */ errFL("<<nohoist>> appears as init-action - use <<>> <<nohoist>>",
1695 /* MR12c */ FileStr[actionNode->file],actionNode->line);
1696 /* MR12c */ };
1697 }
1698 }
1699 ((Junction *)g.left)->blockid = CurBlockID;
1700 {
1701 zzBLOCK(zztasp2);
1702 zzMake0;
1703 {
1704 while ( (LA(1)==133) ) {
1705 eg = exception_group();
1706
1707
1708 if ( eg!=NULL ) {
1709 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/
1710 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/
1711 list_add(&CurExGroups, (void *)eg);
1712 }
1713 zzLOOP(zztasp2);
1714 }
1715 zzEXIT(zztasp2);
1716 }
1717 }
1718 CurAltNum++;
1719 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum;
1720 {
1721 zzBLOCK(zztasp2);
1722 zzMake0;
1723 {
1724 while ( (LA(1)==123) ) {
1725 zzmatch(123);
1726 inAlt=1;
1727 zzCONSUME;
1728
1729 alt( toksrefd,rulesrefd );
1730 g = Or(g, zzaArg(zztasp2,2));
1731
1732 ((Junction *)g.left)->blockid = CurBlockID;
1733 {
1734 zzBLOCK(zztasp3);
1735 zzMake0;
1736 {
1737 while ( (LA(1)==133) ) {
1738 eg = exception_group();
1739
1740
1741 if ( eg!=NULL ) {
1742 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/
1743 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/
1744 list_add(&CurExGroups, (void *)eg);
1745 }
1746 zzLOOP(zztasp3);
1747 }
1748 zzEXIT(zztasp3);
1749 }
1750 }
1751 CurAltNum++;
1752 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum;
1753 zzLOOP(zztasp2);
1754 }
1755 zzEXIT(zztasp2);
1756 }
1757 }
1758 zzaArg(zztasp1,0) = b;
1759 attribsRefdFromAction = saveblah; inAlt = saveinalt;
1760 zzEXIT(zztasp1);
1761 return;
1762 fail:
1763 zzEXIT(zztasp1);
1764 CannotContinue=TRUE;
1765 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1766 zzresynch(setwd5, 0x20);
1767 }
1768 }
1769
1770 void
1771 #ifdef __USE_PROTOS
alt(set * toksrefd,set * rulesrefd)1772 alt(set * toksrefd,set * rulesrefd)
1773 #else
1774 alt(toksrefd,rulesrefd)
1775 set *toksrefd;
1776 set *rulesrefd ;
1777 #endif
1778 {
1779 zzRULE;
1780 zzBLOCK(zztasp1);
1781 zzMake0;
1782 {
1783 int n=0; Graph g; int e_num=0, old_not=0; Node *node; set elems, dif;
1784 int first_on_line = 1, use_def_MT_handler = 0;
1785 g.left=NULL; g.right=NULL;
1786
1787 CurAltStart = NULL;
1788 elems = empty;
1789 inAlt = 1;
1790 {
1791 zzBLOCK(zztasp2);
1792 zzMake0;
1793 {
1794 if ( (LA(1)==88) ) {
1795 zzmatch(88);
1796 use_def_MT_handler = 1;
1797 zzCONSUME;
1798
1799 }
1800 else {
1801 if ( (setwd5[LA(1)]&0x40) ) {
1802 }
1803 else {zzFAIL(1,zzerr26,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1804 }
1805 zzEXIT(zztasp2);
1806 }
1807 }
1808 {
1809 zzBLOCK(zztasp2);
1810 zzMake0;
1811 {
1812 ;
1813 while ( (setwd5[LA(1)]&0x80) ) {
1814 {
1815 zzBLOCK(zztasp3);
1816 zzMake0;
1817 {
1818 old_not=0;
1819 if ( (LA(1)==124) ) {
1820 zzmatch(124);
1821 old_not=1;
1822 zzCONSUME;
1823
1824 }
1825 else {
1826 if ( (setwd6[LA(1)]&0x1) ) {
1827 }
1828 else {zzFAIL(1,zzerr27,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
1829 }
1830 zzEXIT(zztasp3);
1831 }
1832 }
1833 node = element( old_not, first_on_line, use_def_MT_handler );
1834
1835 if ( node!=NULL && node->ntype!=nAction ) first_on_line = 0;
1836
1837 if ( zzaArg(zztasp2,2 ).left!=NULL ) {
1838 g = Cat(g, zzaArg(zztasp2,2));
1839 n++;
1840 if ( node!=NULL ) {
1841 if ( node->ntype!=nAction ) e_num++;
1842 /* record record number of all rule and token refs */
1843 if ( node->ntype==nToken ) {
1844 TokNode *tk = (TokNode *)((Junction *)zzaArg(zztasp2,2 ).left)->p1;
1845 tk->elnum = e_num;
1846 set_orel(e_num, &elems);
1847 }
1848 else if ( node->ntype==nRuleRef ) {
1849 RuleRefNode *rn = (RuleRefNode *)((Junction *)zzaArg(zztasp2,2 ).left)->p1;
1850 rn->elnum = e_num;
1851 set_orel(e_num, rulesrefd);
1852 }
1853 }
1854 }
1855 zzLOOP(zztasp2);
1856 }
1857 zzEXIT(zztasp2);
1858 }
1859 }
1860 if ( n == 0 ) g = emptyAlt();
1861 zzaArg(zztasp1,0) = g;
1862 /* We want to reduce number of LT(i) calls and the number of
1863 * local attribute variables in C++ mode (for moment, later we'll
1864 * do for C also). However, if trees are being built, they
1865 * require most of the attrib variables to create the tree nodes
1866 * with; therefore, we gen a token ptr for each token ref in C++
1867 */
1868 if ( GenCC && !GenAST )
1869 {
1870 /* This now free's the temp set -ATG 5/6/95 */
1871 set temp;
1872 temp = set_and(elems, attribsRefdFromAction);
1873 set_orin( toksrefd, temp);
1874 set_free(temp);
1875 }
1876 else set_orin( toksrefd, elems);
1877 if ( GenCC ) {
1878 dif = set_dif(attribsRefdFromAction, elems);
1879 if ( set_deg(dif)>0 )
1880 err("one or more $i in action(s) refer to non-token elements");
1881 set_free(dif);
1882 }
1883 set_free(elems);
1884 set_free(attribsRefdFromAction);
1885 inAlt = 0;
1886 zzEXIT(zztasp1);
1887 return;
1888 fail:
1889 zzEXIT(zztasp1);
1890 CannotContinue=TRUE;
1891 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1892 zzresynch(setwd6, 0x2);
1893 }
1894 }
1895
1896 LabelEntry *
1897 #ifdef __USE_PROTOS
element_label(void)1898 element_label(void)
1899 #else
1900 element_label()
1901 #endif
1902 {
1903 LabelEntry * _retv;
1904 zzRULE;
1905 zzBLOCK(zztasp1);
1906 PCCTS_PURIFY(_retv,sizeof(LabelEntry * ))
1907 zzMake0;
1908 {
1909 TermEntry *t=NULL; LabelEntry *l=NULL; RuleEntry *r=NULL; char *lab;
1910 zzmatch(LABEL);
1911 lab = mystrdup(LATEXT(1));
1912 zzCONSUME;
1913
1914
1915 UsedNewStyleLabel = 1;
1916 if ( UsedOldStyleAttrib ) err("cannot mix with new-style labels with old-style $i");
1917 t = (TermEntry *) hash_get(Tname, lab);
1918 if ( t==NULL ) t = (TermEntry *) hash_get(Texpr, lab);
1919 if ( t==NULL ) r = (RuleEntry *) hash_get(Rname, lab);
1920 if ( t!=NULL ) {
1921 err(eMsg1("label definition clashes with token/tokclass definition: '%s'", lab));
1922 _retv = NULL;
1923 }
1924 else if ( r!=NULL ) {
1925 err(eMsg1("label definition clashes with rule definition: '%s'", lab));
1926 _retv = NULL;
1927 }
1928 else {
1929 /* we don't clash with anybody else */
1930 l = (LabelEntry *) hash_get(Elabel, lab);
1931 if ( l==NULL ) { /* ok to add new element label */
1932 l = (LabelEntry *)hash_add(Elabel,
1933 lab,
1934 (Entry *)newLabelEntry(lab));
1935 /* add to list of element labels for this rule */
1936 list_add(&CurElementLabels, (void *)lab);
1937 /* MR7 */ leAdd(l); /* list of labels waiting for exception group definitions */
1938 _retv = l;
1939 }
1940 else {
1941 err(eMsg1("label definitions must be unique per rule: '%s'", lab));
1942 _retv = NULL;
1943 }
1944 }
1945 zzmatch(106); zzCONSUME;
1946 zzEXIT(zztasp1);
1947 return _retv;
1948 fail:
1949 zzEXIT(zztasp1);
1950 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
1951 zzresynch(setwd6, 0x4);
1952 return _retv;
1953 }
1954 }
1955
1956 Node *
1957 #ifdef __USE_PROTOS
element(int old_not,int first_on_line,int use_def_MT_handler)1958 element(int old_not,int first_on_line,int use_def_MT_handler)
1959 #else
1960 element(old_not,first_on_line,use_def_MT_handler)
1961 int old_not;
1962 int first_on_line;
1963 int use_def_MT_handler ;
1964 #endif
1965 {
1966 Node * _retv;
1967 zzRULE;
1968 zzBLOCK(zztasp1);
1969 PCCTS_PURIFY(_retv,sizeof(Node * ))
1970 zzMake0;
1971 {
1972
1973 Attrib blk;
1974 Predicate *pred = NULL;
1975 int local_use_def_MT_handler=0;
1976 ActionNode *act;
1977 RuleRefNode *rr;
1978 set toksrefd, rulesrefd;
1979 TermEntry *term;
1980 TokNode *p=NULL; RuleRefNode *q; int approx=0;
1981 LabelEntry *label=NULL;
1982 int predMsgDone=0;
1983 int semDepth=0;
1984 int ampersandStyle;
1985 int height; /* MR11 */
1986 int equal_height; /* MR11 */
1987
1988 char* pFirstSetSymbol = NULL; /* MR21 */
1989
1990 _retv = NULL;
1991 if ( (setwd6[LA(1)]&0x8) ) {
1992 {
1993 zzBLOCK(zztasp2);
1994 zzMake0;
1995 {
1996 if ( (LA(1)==LABEL) ) {
1997 label = element_label();
1998
1999 }
2000 else {
2001 if ( (setwd6[LA(1)]&0x10) ) {
2002 }
2003 else {zzFAIL(1,zzerr28,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2004 }
2005 zzEXIT(zztasp2);
2006 }
2007 }
2008 {
2009 zzBLOCK(zztasp2);
2010 zzMake0;
2011 {
2012 if ( (LA(1)==TokenTerm) ) {
2013 zzmatch(TokenTerm);
2014
2015 term = (TermEntry *) hash_get(Tname, LATEXT(1));
2016 if ( term==NULL && UserDefdTokens ) {
2017 err("implicit token definition not allowed with #tokdefs");
2018 zzaRet.left = zzaRet.right = NULL;
2019 }
2020 else {
2021 zzaRet = buildToken(LATEXT(1));
2022 p=((TokNode *)((Junction *)zzaRet.left)->p1);
2023 term = (TermEntry *) hash_get(Tname, LATEXT(1));
2024 require( term!= NULL, "hash table mechanism is broken");
2025 p->tclass = term->tclass;
2026 p->complement = old_not;
2027 if ( label!=NULL ) {
2028 p->el_label = label->str;
2029 label->elem = (Node *)p;
2030 }
2031 }
2032 zzCONSUME;
2033
2034 {
2035 zzBLOCK(zztasp3);
2036 zzMake0;
2037 {
2038 if ( (LA(1)==119) ) {
2039 zzmatch(119); zzCONSUME;
2040 {
2041 zzBLOCK(zztasp4);
2042 zzMake0;
2043 {
2044 if ( (LA(1)==QuotedTerm) ) {
2045 zzmatch(QuotedTerm);
2046 if ( p!=NULL ) setUpperRange(p, LATEXT(1));
2047 zzCONSUME;
2048
2049 }
2050 else {
2051 if ( (LA(1)==TokenTerm) ) {
2052 zzmatch(TokenTerm);
2053 if ( p!=NULL ) setUpperRange(p, LATEXT(1));
2054 zzCONSUME;
2055
2056 }
2057 else {zzFAIL(1,zzerr29,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2058 }
2059 zzEXIT(zztasp4);
2060 }
2061 }
2062 }
2063 else {
2064 if ( (setwd6[LA(1)]&0x20) ) {
2065 }
2066 else {zzFAIL(1,zzerr30,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2067 }
2068 zzEXIT(zztasp3);
2069 }
2070 }
2071
2072 if ( p!=NULL && (p->upper_range!=0 || p->tclass || old_not) )
2073 list_add(&MetaTokenNodes, (void *)p);
2074 {
2075 zzBLOCK(zztasp3);
2076 zzMake0;
2077 {
2078 if ( (LA(1)==125) ) {
2079 zzmatch(125);
2080 if ( p!=NULL ) p->astnode=ASTroot;
2081 zzCONSUME;
2082
2083 }
2084 else {
2085 if ( (setwd6[LA(1)]&0x40) ) {
2086 if ( p!=NULL ) p->astnode=ASTchild;
2087 }
2088 else {
2089 if ( (LA(1)==103) ) {
2090 zzmatch(103);
2091 if ( p!=NULL ) p->astnode=ASTexclude;
2092 zzCONSUME;
2093
2094 }
2095 else {zzFAIL(1,zzerr31,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2096 }
2097 }
2098 zzEXIT(zztasp3);
2099 }
2100 }
2101 {
2102 zzBLOCK(zztasp3);
2103 zzMake0;
2104 {
2105 if ( (LA(1)==88) ) {
2106 zzmatch(88);
2107 local_use_def_MT_handler = 1;
2108 zzCONSUME;
2109
2110 }
2111 else {
2112 if ( (setwd6[LA(1)]&0x80) ) {
2113 }
2114 else {zzFAIL(1,zzerr32,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2115 }
2116 zzEXIT(zztasp3);
2117 }
2118 }
2119
2120 if ( p!=NULL && first_on_line ) {
2121 CurAltStart = (Junction *)zzaRet.left;
2122 altAdd(CurAltStart); /* MR7 */
2123 p->altstart = CurAltStart;
2124 }
2125 if ( p!=NULL )
2126 p->use_def_MT_handler = use_def_MT_handler || local_use_def_MT_handler;
2127 _retv = (Node *)p;
2128 }
2129 else {
2130 if ( (LA(1)==QuotedTerm) ) {
2131 zzmatch(QuotedTerm);
2132
2133 term = (TermEntry *) hash_get(Texpr, LATEXT(1));
2134 if ( term==NULL && UserDefdTokens ) {
2135 err("implicit token definition not allowed with #tokdefs");
2136 zzaRet.left = zzaRet.right = NULL;
2137 }
2138 else {
2139 zzaRet = buildToken(LATEXT(1)); p=((TokNode *)((Junction *)zzaRet.left)->p1);
2140 p->complement = old_not;
2141 if ( label!=NULL ) {
2142 p->el_label = label->str;
2143 label->elem = (Node *)p;
2144 }
2145 }
2146 zzCONSUME;
2147
2148 {
2149 zzBLOCK(zztasp3);
2150 zzMake0;
2151 {
2152 if ( (LA(1)==119) ) {
2153 zzmatch(119); zzCONSUME;
2154 {
2155 zzBLOCK(zztasp4);
2156 zzMake0;
2157 {
2158 if ( (LA(1)==QuotedTerm) ) {
2159 zzmatch(QuotedTerm);
2160 if ( p!=NULL ) setUpperRange(p, LATEXT(1));
2161 zzCONSUME;
2162
2163 }
2164 else {
2165 if ( (LA(1)==TokenTerm) ) {
2166 zzmatch(TokenTerm);
2167 if ( p!=NULL ) setUpperRange(p, LATEXT(1));
2168 zzCONSUME;
2169
2170 }
2171 else {zzFAIL(1,zzerr33,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2172 }
2173 zzEXIT(zztasp4);
2174 }
2175 }
2176 }
2177 else {
2178 if ( (setwd7[LA(1)]&0x1) ) {
2179 }
2180 else {zzFAIL(1,zzerr34,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2181 }
2182 zzEXIT(zztasp3);
2183 }
2184 }
2185 {
2186 zzBLOCK(zztasp3);
2187 zzMake0;
2188 {
2189 if ( (LA(1)==125) ) {
2190 zzmatch(125);
2191 if ( p!=NULL ) p->astnode=ASTroot;
2192 zzCONSUME;
2193
2194 }
2195 else {
2196 if ( (setwd7[LA(1)]&0x2) ) {
2197 if ( p!=NULL ) p->astnode=ASTchild;
2198 }
2199 else {
2200 if ( (LA(1)==103) ) {
2201 zzmatch(103);
2202 if ( p!=NULL ) p->astnode=ASTexclude;
2203 zzCONSUME;
2204
2205 }
2206 else {zzFAIL(1,zzerr35,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2207 }
2208 }
2209 zzEXIT(zztasp3);
2210 }
2211 }
2212 {
2213 zzBLOCK(zztasp3);
2214 zzMake0;
2215 {
2216 if ( (LA(1)==88) ) {
2217 zzmatch(88);
2218 local_use_def_MT_handler = 1;
2219 zzCONSUME;
2220
2221 }
2222 else {
2223 if ( (setwd7[LA(1)]&0x4) ) {
2224 }
2225 else {zzFAIL(1,zzerr36,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2226 }
2227 zzEXIT(zztasp3);
2228 }
2229 }
2230
2231 if ( p!=NULL && (p->upper_range!=0 || p->tclass || old_not) )
2232 list_add(&MetaTokenNodes, (void *)p);
2233
2234 if ( first_on_line ) {
2235 CurAltStart = (Junction *)zzaRet.left;
2236 altAdd(CurAltStart); /* MR7 */
2237 p->altstart = CurAltStart;
2238 }
2239 if ( p!=NULL )
2240 p->use_def_MT_handler = use_def_MT_handler || local_use_def_MT_handler;
2241 _retv = (Node *)p;
2242 }
2243 else {
2244 if ( (LA(1)==WildCard) ) {
2245 if ( old_not ) warn("~ WILDCARD is an undefined operation (implies 'nothing')");
2246 zzmatch(WildCard);
2247 zzaRet = buildWildCard(LATEXT(1)); p=((TokNode *)((Junction *)zzaRet.left)->p1);
2248 zzCONSUME;
2249
2250 {
2251 zzBLOCK(zztasp3);
2252 zzMake0;
2253 {
2254 if ( (LA(1)==125) ) {
2255 zzmatch(125);
2256 p->astnode=ASTroot;
2257 zzCONSUME;
2258
2259 }
2260 else {
2261 if ( (setwd7[LA(1)]&0x8) ) {
2262 p->astnode=ASTchild;
2263 }
2264 else {
2265 if ( (LA(1)==103) ) {
2266 zzmatch(103);
2267 p->astnode=ASTexclude;
2268 zzCONSUME;
2269
2270 }
2271 else {zzFAIL(1,zzerr37,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2272 }
2273 }
2274 zzEXIT(zztasp3);
2275 }
2276 }
2277 list_add(&MetaTokenNodes, (void *)p);
2278
2279 if ( first_on_line ) {
2280 CurAltStart = (Junction *)zzaRet.left;
2281 altAdd(CurAltStart); /* MR7 */
2282 p->altstart = CurAltStart;
2283 if ( label!=NULL ) {
2284 p->el_label = label->str;
2285 label->elem = (Node *)p;
2286 }
2287 }
2288 _retv = (Node *)p;
2289 }
2290 else {
2291 if ( (LA(1)==NonTerminal) ) {
2292 if ( old_not ) warn("~ NONTERMINAL is an undefined operation");
2293 zzmatch(NonTerminal);
2294 zzaRet = buildRuleRef(LATEXT(1));
2295 zzCONSUME;
2296
2297 {
2298 zzBLOCK(zztasp3);
2299 zzMake0;
2300 {
2301 if ( (LA(1)==103) ) {
2302 zzmatch(103);
2303 q = (RuleRefNode *) ((Junction *)zzaRet.left)->p1;
2304 q->astnode=ASTexclude;
2305 zzCONSUME;
2306
2307 }
2308 else {
2309 if ( (setwd7[LA(1)]&0x10) ) {
2310 }
2311 else {zzFAIL(1,zzerr38,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2312 }
2313 zzEXIT(zztasp3);
2314 }
2315 }
2316 {
2317 zzBLOCK(zztasp3);
2318 zzMake0;
2319 {
2320 if ( (setwd7[LA(1)]&0x20) ) {
2321 {
2322 zzBLOCK(zztasp4);
2323 zzMake0;
2324 {
2325 if ( (LA(1)==104) ) {
2326 zzmatch(104); zzCONSUME;
2327 }
2328 else {
2329 if ( (LA(1)==PassAction) ) {
2330 }
2331 else {zzFAIL(1,zzerr39,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2332 }
2333 zzEXIT(zztasp4);
2334 }
2335 }
2336 zzmatch(PassAction);
2337 addParm(((Junction *)zzaRet.left)->p1, LATEXT(1));
2338 zzCONSUME;
2339
2340 }
2341 else {
2342 if ( (setwd7[LA(1)]&0x40) ) {
2343 }
2344 else {zzFAIL(1,zzerr40,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2345 }
2346 zzEXIT(zztasp3);
2347 }
2348 }
2349 rr=(RuleRefNode *) ((Junction *)zzaRet.left)->p1;
2350 {
2351 zzBLOCK(zztasp3);
2352 zzMake0;
2353 {
2354 char *a;
2355 if ( (LA(1)==105) ) {
2356 zzmatch(105); zzCONSUME;
2357 zzmatch(PassAction);
2358
2359 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2360 require(a!=NULL, "rule element: cannot allocate assignment");
2361 strcpy(a, LATEXT(1));
2362 rr->assign = a;
2363 zzCONSUME;
2364
2365 }
2366 else {
2367 if ( (setwd7[LA(1)]&0x80) ) {
2368 }
2369 else {zzFAIL(1,zzerr41,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2370 }
2371 zzEXIT(zztasp3);
2372 }
2373 }
2374
2375 if ( label!=NULL ) {
2376 rr->el_label = label->str;
2377 label->elem = (Node *)rr;
2378 }
2379 if ( first_on_line ) {
2380 CurAltStart = (Junction *)zzaRet.left;
2381 altAdd(CurAltStart); /* MR7 */
2382 ((RuleRefNode *)((Junction *)zzaRet.left)->p1)->altstart = CurAltStart;
2383 }
2384 _retv = (Node *)rr;
2385 }
2386 else {zzFAIL(1,zzerr42,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2387 }
2388 }
2389 }
2390 zzEXIT(zztasp2);
2391 }
2392 }
2393 }
2394 else {
2395 if ( (LA(1)==Action) ) {
2396 if ( old_not ) warn("~ ACTION is an undefined operation");
2397 zzmatch(Action);
2398 zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 0);
2399 zzCONSUME;
2400
2401 if ( first_on_line ) { /* MR7 */
2402 CurAltStart = (Junction *)zzaArg(zztasp1,0 ).left; /* MR7 */
2403 altAdd(CurAltStart); /* MR7 */
2404 };
2405 _retv = (Node *) ((Junction *)zzaArg(zztasp1,0 ).left)->p1;
2406 }
2407 else {
2408 if ( (LA(1)==Pred) ) {
2409 if ( old_not ) warn("~ SEMANTIC-PREDICATE is an undefined operation");
2410 zzmatch(Pred);
2411 zzaArg(zztasp1,0) = buildAction(LATEXT(1),action_file,action_line, 1);
2412 zzCONSUME;
2413
2414 act = (ActionNode *) ((Junction *)zzaArg(zztasp1,0 ).left)->p1;
2415 if (numericActionLabel) { /* MR10 */
2416 list_add(&NumericPredLabels,act); /* MR10 */
2417 numericActionLabel=0; /* MR10 */
2418 }; /* MR10 */
2419 {
2420 zzBLOCK(zztasp2);
2421 zzMake0;
2422 {
2423 char *a;
2424 if ( (LA(1)==PassAction) ) {
2425 zzmatch(PassAction);
2426
2427 a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2428 require(a!=NULL, "rule element: cannot allocate predicate fail action");
2429 strcpy(a, LATEXT(1));
2430 act->pred_fail = a;
2431 zzCONSUME;
2432
2433 }
2434 else {
2435 if ( (setwd8[LA(1)]&0x1) ) {
2436 }
2437 else {zzFAIL(1,zzerr43,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2438 }
2439 zzEXIT(zztasp2);
2440 }
2441 }
2442 if ( first_on_line ) { /* MR7 */
2443 CurAltStart = (Junction *)zzaArg(zztasp1,0 ).left; /* MR7 */
2444 altAdd(CurAltStart); /* MR7 */
2445 };
2446 _retv = (Node *)act;
2447 }
2448 else {
2449 if ( (setwd8[LA(1)]&0x2) ) {
2450 if ( old_not ) warn("~ BLOCK is an undefined operation");
2451 BlkLevel++;
2452 if (BlkLevel >= MAX_BLK_LEVEL) fatal("Blocks nested too deeply");
2453 /* MR23 */ CurBlockID_array[BlkLevel] = CurBlockID;
2454 /* MR23 */ CurAltNum_array[BlkLevel] = CurAltNum;
2455 {
2456 zzBLOCK(zztasp2);
2457 zzMake0;
2458 {
2459 if ( (LA(1)==Pragma) ) {
2460 zzmatch(Pragma); zzCONSUME;
2461 {
2462 zzBLOCK(zztasp3);
2463 zzMake0;
2464 {
2465 if ( (LA(1)==126) ) {
2466 zzmatch(126);
2467 approx=LL_k;
2468 zzCONSUME;
2469
2470 }
2471 else {
2472 if ( (LA(1)==127) ) {
2473 zzmatch(127);
2474 approx = 1;
2475 zzCONSUME;
2476
2477 }
2478 else {
2479 if ( (LA(1)==128) ) {
2480 zzmatch(128);
2481 approx = 2;
2482 zzCONSUME;
2483
2484 }
2485 else {zzFAIL(1,zzerr44,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2486 }
2487 }
2488 zzEXIT(zztasp3);
2489 }
2490 }
2491 }
2492 else {
2493 if ( (setwd8[LA(1)]&0x4) ) {
2494 }
2495 else {zzFAIL(1,zzerr45,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2496 }
2497 zzEXIT(zztasp2);
2498 }
2499 }
2500 {
2501 zzBLOCK(zztasp2);
2502 zzMake0;
2503 {
2504 if ( (LA(1)==FirstSetSymbol) ) {
2505 zzmatch(FirstSetSymbol); zzCONSUME;
2506 zzmatch(114); zzCONSUME;
2507 {
2508 zzBLOCK(zztasp3);
2509 zzMake0;
2510 {
2511 if ( (LA(1)==NonTerminal) ) {
2512 zzmatch(NonTerminal);
2513
2514 /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1,
2515 /* MR21 */ sizeof(char));
2516 /* MR21 */ require(pFirstSetSymbol!=NULL,
2517 /* MR21 */ "cannot allocate first set name");
2518 /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1));
2519 /* MR21 */
2520 zzCONSUME;
2521
2522 }
2523 else {
2524 if ( (LA(1)==TokenTerm) ) {
2525 zzmatch(TokenTerm);
2526
2527 /* MR21 */ pFirstSetSymbol = (char *) calloc(strlen(LATEXT(1))+1,
2528 /* MR21 */ sizeof(char));
2529 /* MR21 */ require(pFirstSetSymbol!=NULL,
2530 /* MR21 */ "cannot allocate first set name");
2531 /* MR21 */ strcpy(pFirstSetSymbol, LATEXT(1));
2532 /* MR21 */
2533 zzCONSUME;
2534
2535 }
2536 else {zzFAIL(1,zzerr46,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2537 }
2538 zzEXIT(zztasp3);
2539 }
2540 }
2541 zzmatch(115); zzCONSUME;
2542 }
2543 else {
2544 if ( (setwd8[LA(1)]&0x8) ) {
2545 }
2546 else {zzFAIL(1,zzerr47,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2547 }
2548 zzEXIT(zztasp2);
2549 }
2550 }
2551 {
2552 zzBLOCK(zztasp2);
2553 zzMake0;
2554 {
2555 if ( (LA(1)==114) ) {
2556 zzmatch(114); zzCONSUME;
2557 block( &toksrefd,&rulesrefd );
2558 zzmatch(115);
2559 blk = zzaRet = zzaArg(zztasp2,2);
2560 /* MR23 */ CurBlockID_array[BlkLevel] = (-1);
2561 /* MR23 */ CurAltNum_array[BlkLevel] = (-1);
2562 --BlkLevel;
2563 zzCONSUME;
2564
2565 {
2566 zzBLOCK(zztasp3);
2567 zzMake0;
2568 {
2569 if ( (LA(1)==129) ) {
2570 zzmatch(129);
2571 zzaRet = makeLoop(zzaRet,approx,pFirstSetSymbol);
2572 zzCONSUME;
2573
2574 }
2575 else {
2576 if ( (LA(1)==130) ) {
2577 zzmatch(130);
2578 zzaRet = makePlus(zzaRet,approx,pFirstSetSymbol);
2579 zzCONSUME;
2580
2581 }
2582 else {
2583 if ( (LA(1)==131) ) {
2584 zzmatch(131); zzCONSUME;
2585 {
2586 zzBLOCK(zztasp4);
2587 zzMake0;
2588 {
2589 if ( (setwd8[LA(1)]&0x10) ) {
2590 {
2591 zzBLOCK(zztasp5);
2592 zzMake0;
2593 {
2594 if ( (LA(1)==132) ) {
2595 zzmatch(132);
2596 ampersandStyle=0;
2597 zzCONSUME;
2598
2599 }
2600 else {
2601 if ( (LA(1)==113) ) {
2602 zzmatch(113);
2603 ampersandStyle=1;
2604 zzCONSUME;
2605
2606 }
2607 else {zzFAIL(1,zzerr48,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2608 }
2609 zzEXIT(zztasp5);
2610 }
2611 }
2612 zzmatch(Pred);
2613 zzaRet = buildAction(LATEXT(1),action_file,action_line,1);
2614 zzCONSUME;
2615
2616 act = (ActionNode *) ((Junction *)zzaRet.left)->p1;
2617 semDepth=predicateLookaheadDepth(act);
2618 if (numericActionLabel) { /* MR10 */
2619 list_add(&NumericPredLabels,act); /* MR10 */
2620 numericActionLabel=0; /* MR10 */
2621 }; /* MR10 */
2622 {
2623 zzBLOCK(zztasp5);
2624 zzMake0;
2625 {
2626 char *a;
2627 if ( (LA(1)==PassAction) ) {
2628 zzmatch(PassAction);
2629
2630 a = (char *)calloc(strlen(LATEXT(1))+1, sizeof(char));
2631 require(a!=NULL, "rule element: cannot allocate predicate fail action");
2632 strcpy(a, LATEXT(1));
2633 act->pred_fail = a;
2634 zzCONSUME;
2635
2636 }
2637 else {
2638 if ( (setwd8[LA(1)]&0x20) ) {
2639 }
2640 else {zzFAIL(1,zzerr49,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2641 }
2642 zzEXIT(zztasp5);
2643 }
2644 }
2645 if ( first_on_line) { /* MR7 */
2646 CurAltStart=(Junction *)zzaRet.left; /* MR7 */
2647 altAdd(CurAltStart); /* MR7 */
2648 };
2649 _retv = (Node *)act;
2650
2651 pred = computePredFromContextGuard(blk,&predMsgDone); /* MR10 */
2652 if ( pred==NULL) { /* MR10 */
2653 if ( !predMsgDone) err("invalid or missing context guard"); /* MR10 */
2654 predMsgDone=1; /* MR10 */
2655 } else { /* MR10 */
2656 act->guardNodes=(Junction *)blk.left; /* MR11 */
2657 pred->expr = act->action;
2658 pred->source = act;
2659 /* MR10 */ pred->ampersandStyle = ampersandStyle; /* 0 means (g)? => ... 1 means (g)? && ... */
2660 /* MR13 */ if (pred->tcontext != NULL) {
2661 /* MR13 */ height=MR_max_height_of_tree(pred->tcontext);
2662 /* MR13 */ equal_height=MR_all_leaves_same_height(pred->tcontext,height);
2663 /* MR13 */ if (! equal_height) {
2664 /* MR13 */ errFL("in guarded predicates all tokens in the guard must be at the same height",
2665 /* MR13 */ FileStr[act->file],act->line);
2666 /* MR13 */ };
2667 /* MR13 */ }
2668 /* MR10 */ if (ampersandStyle) {
2669 /* MR10 */ act->ampersandPred = pred;
2670 /* MR11 */ if (! HoistPredicateContext) {
2671 /* MR11 */ errFL("without \"-prc on\" (guard)? && <<pred>>? ... doesn't make sense",
2672 /* MR11 */ FileStr[act->file],act->line);
2673 /* MR11 */ };
2674 /* MR10 */ } else {
2675 /* MR10 */ act->guardpred = pred;
2676 /* MR10 */ };
2677 /* MR10 */ if (pred->k != semDepth) {
2678 /* MR10 */ warn(eMsgd2("length of guard (%d) does not match the length of semantic predicate (%d)",
2679 /* MR10 */ pred->k,semDepth));
2680 /* MR10 */ };
2681 }
2682 }
2683 else {
2684 if ( (setwd8[LA(1)]&0x40) ) {
2685 zzaRet = makeBlk(zzaRet,approx,pFirstSetSymbol);
2686 FoundGuessBlk = 1;
2687 ((Junction *) ((Junction *)zzaRet.left)->p1)->guess=1;
2688 if ( ! first_on_line ) {
2689 err("(...)? predicate must be first element of production");
2690 }
2691 }
2692 else {zzFAIL(1,zzerr50,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2693 }
2694 zzEXIT(zztasp4);
2695 }
2696 }
2697 }
2698 else {
2699 if ( (setwd8[LA(1)]&0x80) ) {
2700 zzaRet = makeBlk(zzaRet,approx,pFirstSetSymbol);
2701 }
2702 else {zzFAIL(1,zzerr51,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2703 }
2704 }
2705 }
2706 zzEXIT(zztasp3);
2707 }
2708 }
2709
2710 if ( pred==NULL && !predMsgDone) { /* MR10 */
2711 ((Junction *)((Junction *)zzaRet.left)->p1)->blockid = CurBlockID;
2712 ((Junction *)((Junction *)zzaRet.left)->p1)->tokrefs = toksrefd;
2713 ((Junction *)((Junction *)zzaRet.left)->p1)->rulerefs = rulesrefd;
2714 if ( first_on_line ) { /* MR7 */
2715 CurAltStart = (Junction *)((Junction *)((Junction *)zzaRet.left)->p1); /* MR7 */
2716 altAdd(CurAltStart); /* MR7 */
2717 }; /* MR7 */
2718 _retv = (Node *) ((Junction *)zzaRet.left)->p1;
2719 }
2720 }
2721 else {
2722 if ( (LA(1)==102) ) {
2723 zzmatch(102); zzCONSUME;
2724 block( &toksrefd,&rulesrefd );
2725 zzaRet = makeOpt(zzaArg(zztasp2,2),approx,pFirstSetSymbol);
2726 /* MR23 */ CurBlockID_array[BlkLevel] = (-1);
2727 /* MR23 */ CurAltNum_array[BlkLevel] = (-1);
2728 --BlkLevel;
2729 zzmatch(98);
2730
2731 ((Junction *)((Junction *)zzaRet.left)->p1)->blockid = CurBlockID;
2732 ((Junction *)((Junction *)zzaRet.left)->p1)->tokrefs = toksrefd;
2733 ((Junction *)((Junction *)zzaRet.left)->p1)->rulerefs = rulesrefd;
2734 zzCONSUME;
2735
2736 if ( first_on_line ) { /* MR7 */
2737 CurAltStart = (Junction *) ((Junction *)((Junction *)zzaRet.left)->p1); /* MR7 */
2738 altAdd(CurAltStart); /* MR7 */
2739 };
2740 _retv = (Node *) ((Junction *)zzaRet.left)->p1;
2741 }
2742 else {zzFAIL(1,zzerr52,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2743 }
2744 zzEXIT(zztasp2);
2745 }
2746 }
2747 }
2748 else {
2749 if ( (LA(1)==129) ) {
2750 zzmatch(129);
2751 warn("don't you want a ')' with that '*'?"); CannotContinue=TRUE;
2752 zzCONSUME;
2753
2754 }
2755 else {
2756 if ( (LA(1)==130) ) {
2757 zzmatch(130);
2758 warn("don't you want a ')' with that '+'?"); CannotContinue=TRUE;
2759 zzCONSUME;
2760
2761 }
2762 else {
2763 if ( (LA(1)==105) ) {
2764 zzmatch(105);
2765 warn("'>' can only appear after a nonterminal"); CannotContinue=TRUE;
2766 zzCONSUME;
2767
2768 }
2769 else {
2770 if ( (LA(1)==PassAction) ) {
2771 zzmatch(PassAction);
2772 warn("[...] out of context 'rule > [...]'");
2773 CannotContinue=TRUE;
2774 zzCONSUME;
2775
2776 }
2777 else {zzFAIL(1,zzerr53,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2778 }
2779 }
2780 }
2781 }
2782 }
2783 }
2784 }
2785 zzEXIT(zztasp1);
2786 return _retv;
2787 fail:
2788 zzEXIT(zztasp1);
2789 CannotContinue=TRUE;
2790 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
2791 zzresynch(setwd9, 0x1);
2792 return _retv;
2793 }
2794 }
2795
2796 void
2797 #ifdef __USE_PROTOS
default_exception_handler(void)2798 default_exception_handler(void)
2799 #else
2800 default_exception_handler()
2801 #endif
2802 {
2803 zzRULE;
2804 zzBLOCK(zztasp1);
2805 zzMake0;
2806 {
2807 DefaultExGroup = exception_group();
2808
2809 zzEXIT(zztasp1);
2810 return;
2811 fail:
2812 zzEXIT(zztasp1);
2813 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
2814 zzresynch(setwd9, 0x2);
2815 }
2816 }
2817
2818 ExceptionGroup *
2819 #ifdef __USE_PROTOS
exception_group(void)2820 exception_group(void)
2821 #else
2822 exception_group()
2823 #endif
2824 {
2825 ExceptionGroup * _retv;
2826 zzRULE;
2827 zzBLOCK(zztasp1);
2828 PCCTS_PURIFY(_retv,sizeof(ExceptionGroup * ))
2829 zzMake0;
2830 {
2831 ExceptionHandler *h; LabelEntry *label=NULL; /* MR6 */
2832 FoundException = 1; FoundExceptionGroup = 1;
2833 zzmatch(133);
2834 _retv = (ExceptionGroup *)calloc(1, sizeof(ExceptionGroup));
2835 zzCONSUME;
2836
2837 {
2838 zzBLOCK(zztasp2);
2839 zzMake0;
2840 {
2841 char *p;
2842 if ( (LA(1)==PassAction) ) {
2843 zzmatch(PassAction);
2844
2845 p = LATEXT(1)+1;
2846 p[strlen(p)-1] = '\0'; /* kill trailing space */
2847 label = (LabelEntry *) hash_get(Elabel, LATEXT(1)+1);
2848 if ( label==NULL )
2849 {
2850 err(eMsg1("unknown label in exception handler: '%s'", LATEXT(1)+1));
2851 }
2852 zzCONSUME;
2853
2854 }
2855 else {
2856 if ( (setwd9[LA(1)]&0x4) ) {
2857 }
2858 else {zzFAIL(1,zzerr54,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2859 }
2860 zzEXIT(zztasp2);
2861 }
2862 }
2863 {
2864 zzBLOCK(zztasp2);
2865 zzMake0;
2866 {
2867 while ( (LA(1)==135) ) {
2868 h = exception_handler();
2869
2870 list_add(&(_retv->handlers), (void *)h);
2871 zzLOOP(zztasp2);
2872 }
2873 zzEXIT(zztasp2);
2874 }
2875 }
2876 {
2877 zzBLOCK(zztasp2);
2878 zzMake0;
2879 {
2880 if ( (LA(1)==134) ) {
2881 zzmatch(134); zzCONSUME;
2882 zzmatch(106); zzCONSUME;
2883 zzmatch(Action);
2884 {
2885 ExceptionHandler *eh = (ExceptionHandler *)
2886 calloc(1, sizeof(ExceptionHandler));
2887 char *a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2888 require(eh!=NULL, "exception: cannot allocate handler");
2889 require(a!=NULL, "exception: cannot allocate action");
2890 strcpy(a, LATEXT(1));
2891 eh->action = a;
2892 eh->signalname = (char *) calloc(strlen("default")+1, sizeof(char));
2893 require(eh->signalname!=NULL, "exception: cannot allocate sig name");
2894 strcpy(eh->signalname, "default");
2895 list_add(&(_retv->handlers), (void *)eh);
2896 }
2897 zzCONSUME;
2898
2899 }
2900 else {
2901 if ( (setwd9[LA(1)]&0x8) ) {
2902 }
2903 else {zzFAIL(1,zzerr55,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
2904 }
2905 zzEXIT(zztasp2);
2906 }
2907 }
2908
2909 if ( label!=NULL ) {
2910 /* Record ex group in sym tab for this label */
2911 if ( label->ex_group!=NULL ) {
2912 err(eMsg1("duplicate exception handler for label '%s'",label->str));
2913 } else {
2914 label->ex_group = _retv;
2915 /* Label the exception group itself */
2916 _retv->label = label->str;
2917 /* Make the labelled element pt to the exception also */
2918 /* MR6 */ if (label->elem == NULL) {
2919 /* MR6 */ err(eMsg1("reference in exception handler to undefined label '%s'",label->str));
2920 /* MR6 */ } else {
2921 switch ( label->elem->ntype ) {
2922 case nRuleRef :
2923 {
2924 RuleRefNode *r = (RuleRefNode *)label->elem;
2925 r->ex_group = _retv;
2926 break;
2927 }
2928 case nToken :
2929 {
2930 TokNode *t = (TokNode *)label->elem;
2931 t->ex_group = _retv;
2932 break;
2933 }
2934 } /* end switch */
2935 /* MR6 */ }; /* end test on label->elem */
2936 } /* end test on label->ex_group */
2937
2938 } /* end test on exception label */
2939
2940 /* MR7 */
2941 /* MR7 */ if (BlkLevel == 1 && label == NULL) {
2942 /* MR7 */ _retv->forRule=1;
2943 /* MR7 */ } else if (label == NULL) {
2944 /* MR7 */ _retv->altID = makeAltID(CurBlockID_array[BlkLevel], CurAltNum_array[BlkLevel]);
2945 /* MR7 */ egAdd(_retv);
2946 /* MR7 */ } else {
2947 /* MR7 */ _retv->labelEntry=label;
2948 /* MR7 */ };
2949 /* MR7 */
2950 /* MR7 */ /* You may want to remove this exc from the rule list */
2951 /* MR7 */ /* and handle at the labeled element site. */
2952 /* MR7 */
2953 /* MR7 */ if (label != NULL) {
2954 /* MR7 */ _retv = NULL;
2955 /* MR7 */ };
2956 zzEXIT(zztasp1);
2957 return _retv;
2958 fail:
2959 zzEXIT(zztasp1);
2960 CannotContinue=TRUE;
2961 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
2962 zzresynch(setwd9, 0x10);
2963 return _retv;
2964 }
2965 }
2966
2967 ExceptionHandler *
2968 #ifdef __USE_PROTOS
exception_handler(void)2969 exception_handler(void)
2970 #else
2971 exception_handler()
2972 #endif
2973 {
2974 ExceptionHandler * _retv;
2975 zzRULE;
2976 zzBLOCK(zztasp1);
2977 PCCTS_PURIFY(_retv,sizeof(ExceptionHandler * ))
2978 zzMake0;
2979 {
2980 ;
2981 zzmatch(135);
2982
2983 _retv = (ExceptionHandler *)calloc(1, sizeof(ExceptionHandler));
2984 require(_retv!=NULL, "exception: cannot allocate handler");
2985 zzCONSUME;
2986
2987 {
2988 zzBLOCK(zztasp2);
2989 zzMake0;
2990 {
2991 if ( (LA(1)==NonTerminal) ) {
2992 zzmatch(NonTerminal);
2993
2994 _retv->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2995 require(_retv->signalname!=NULL, "exception: cannot allocate sig name");
2996 strcpy(_retv->signalname, LATEXT(1));
2997 zzCONSUME;
2998
2999 }
3000 else {
3001 if ( (LA(1)==TokenTerm) ) {
3002 zzmatch(TokenTerm);
3003
3004 _retv->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
3005 require(_retv->signalname!=NULL, "exception: cannot allocate sig name");
3006 strcpy(_retv->signalname, LATEXT(1));
3007 zzCONSUME;
3008
3009 }
3010 else {zzFAIL(1,zzerr56,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3011 }
3012 zzEXIT(zztasp2);
3013 }
3014 }
3015 zzmatch(106); zzCONSUME;
3016 {
3017 zzBLOCK(zztasp2);
3018 zzMake0;
3019 {
3020 _retv->action = NULL;
3021 if ( (LA(1)==Action) ) {
3022 zzmatch(Action);
3023
3024 _retv->action = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
3025 require(_retv->action!=NULL, "exception: cannot allocate action");
3026 strcpy(_retv->action, LATEXT(1));
3027 zzCONSUME;
3028
3029 }
3030 else {
3031 if ( (setwd9[LA(1)]&0x20) ) {
3032 }
3033 else {zzFAIL(1,zzerr57,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3034 }
3035 zzEXIT(zztasp2);
3036 }
3037 }
3038 zzEXIT(zztasp1);
3039 return _retv;
3040 fail:
3041 zzEXIT(zztasp1);
3042 CannotContinue=TRUE;
3043 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
3044 zzresynch(setwd9, 0x40);
3045 return _retv;
3046 }
3047 }
3048
3049 void
3050 #ifdef __USE_PROTOS
enum_file(char * fname)3051 enum_file(char * fname)
3052 #else
3053 enum_file(fname)
3054 char *fname ;
3055 #endif
3056 {
3057 zzRULE;
3058 zzBLOCK(zztasp1);
3059 zzMake0;
3060 {
3061 if ( (setwd9[LA(1)]&0x80) ) {
3062 {
3063 zzBLOCK(zztasp2);
3064 zzMake0;
3065 {
3066 if ( (LA(1)==143) ) {
3067 zzmatch(143); zzCONSUME;
3068 zzmatch(ID); zzCONSUME;
3069 {
3070 zzBLOCK(zztasp3);
3071 zzMake0;
3072 {
3073 if ( (LA(1)==149) ) {
3074 zzmatch(149); zzCONSUME;
3075 zzmatch(ID); zzCONSUME;
3076 }
3077 else {
3078 if ( (setwd10[LA(1)]&0x1) ) {
3079 }
3080 else {zzFAIL(1,zzerr58,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3081 }
3082 zzEXIT(zztasp3);
3083 }
3084 }
3085 }
3086 else {
3087 if ( (setwd10[LA(1)]&0x2) ) {
3088 }
3089 else {zzFAIL(1,zzerr59,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3090 }
3091 zzEXIT(zztasp2);
3092 }
3093 }
3094 {
3095 zzBLOCK(zztasp2);
3096 zzMake0;
3097 {
3098 if ( (LA(1)==151) ) {
3099 {
3100 zzBLOCK(zztasp3);
3101 int zzcnt=1;
3102 zzMake0;
3103 {
3104 do {
3105 enum_def( fname );
3106 zzLOOP(zztasp3);
3107 } while ( (LA(1)==151) );
3108 zzEXIT(zztasp3);
3109 }
3110 }
3111 }
3112 else {
3113 if ( (LA(1)==149) ) {
3114 defines( fname );
3115 }
3116 else {zzFAIL(1,zzerr60,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3117 }
3118 zzEXIT(zztasp2);
3119 }
3120 }
3121 }
3122 else {
3123 if ( (LA(1)==Eof) ) {
3124 }
3125 else {zzFAIL(1,zzerr61,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3126 }
3127 zzEXIT(zztasp1);
3128 return;
3129 fail:
3130 zzEXIT(zztasp1);
3131 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
3132 zzresynch(setwd10, 0x4);
3133 }
3134 }
3135
3136 void
3137 #ifdef __USE_PROTOS
defines(char * fname)3138 defines(char * fname)
3139 #else
3140 defines(fname)
3141 char *fname ;
3142 #endif
3143 {
3144 zzRULE;
3145 zzBLOCK(zztasp1);
3146 zzMake0;
3147 {
3148 int v; int maxt=(-1); char *t;
3149 {
3150 zzBLOCK(zztasp2);
3151 int zzcnt=1;
3152 zzMake0;
3153 {
3154 do {
3155 zzmatch(149); zzCONSUME;
3156 zzmatch(ID);
3157 t = mystrdup(LATEXT(1));
3158 zzCONSUME;
3159
3160 zzmatch(INT);
3161
3162 v = atoi(LATEXT(1));
3163 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3164
3165 /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
3166 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */
3167 /* MR2 Don't let #tokdefs be confused by */
3168 /* MR2 DLGminToken and DLGmaxToken */
3169
3170 if ( ! isDLGmaxToken(t)) { /* MR2 */
3171 TokenNum = v;
3172 if ( v>maxt ) maxt=v;
3173 if ( Tnum( t ) == 0 ) {
3174 addForcedTname( t, v );
3175 } else {
3176 warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline);
3177 };
3178 };
3179 zzCONSUME;
3180
3181 zzLOOP(zztasp2);
3182 } while ( (LA(1)==149) );
3183 zzEXIT(zztasp2);
3184 }
3185 }
3186 TokenNum = maxt + 1;
3187 zzEXIT(zztasp1);
3188 return;
3189 fail:
3190 zzEXIT(zztasp1);
3191 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
3192 zzresynch(setwd10, 0x8);
3193 }
3194 }
3195
3196 void
3197 #ifdef __USE_PROTOS
enum_def(char * fname)3198 enum_def(char * fname)
3199 #else
3200 enum_def(fname)
3201 char *fname ;
3202 #endif
3203 {
3204 zzRULE;
3205 zzBLOCK(zztasp1);
3206 zzMake0;
3207 {
3208 int v= 0; int maxt=(-1); char *t;
3209 zzmatch(151); zzCONSUME;
3210 zzmatch(ID); zzCONSUME;
3211 zzmatch(152); zzCONSUME;
3212 zzmatch(ID);
3213 t = mystrdup(LATEXT(1));
3214 zzCONSUME;
3215
3216 {
3217 zzBLOCK(zztasp2);
3218 zzMake0;
3219 {
3220 if ( (LA(1)==153) ) {
3221 zzmatch(153); zzCONSUME;
3222 zzmatch(INT);
3223 v=atoi(LATEXT(1));
3224 zzCONSUME;
3225
3226 }
3227 else {
3228 if ( (setwd10[LA(1)]&0x10) ) {
3229 v++;
3230 }
3231 else {zzFAIL(1,zzerr62,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3232 }
3233 zzEXIT(zztasp2);
3234 }
3235 }
3236
3237 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3238 TokenNum = v;
3239 if ( v>maxt ) maxt=v; /* MR3 */
3240 if ( Tnum( t ) == 0 ) addForcedTname( t, v );
3241 else {
3242 warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline);
3243 }
3244 {
3245 zzBLOCK(zztasp2);
3246 zzMake0;
3247 {
3248 while ( (LA(1)==154) ) {
3249 zzmatch(154); zzCONSUME;
3250 {
3251 zzBLOCK(zztasp3);
3252 zzMake0;
3253 {
3254 if ( (LA(1)==ID)&&(isDLGmaxToken(LATEXT(1))) ) {
3255 if (!(isDLGmaxToken(LATEXT(1))) ) {zzfailed_pred(" isDLGmaxToken(LATEXT(1))",0 /* report */, { 0; /* no user action */ } );}
3256 zzmatch(ID); zzCONSUME;
3257 {
3258 zzBLOCK(zztasp4);
3259 zzMake0;
3260 {
3261 if ( (LA(1)==153) ) {
3262 zzmatch(153); zzCONSUME;
3263 zzmatch(INT); zzCONSUME;
3264 }
3265 else {
3266 if ( (setwd10[LA(1)]&0x20) ) {
3267 }
3268 else {zzFAIL(1,zzerr63,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3269 }
3270 zzEXIT(zztasp4);
3271 }
3272 }
3273 }
3274 else {
3275 if ( (LA(1)==ID) ) {
3276 zzmatch(ID);
3277 t = mystrdup(LATEXT(1));
3278 zzCONSUME;
3279
3280 {
3281 zzBLOCK(zztasp4);
3282 zzMake0;
3283 {
3284 if ( (LA(1)==153) ) {
3285 zzmatch(153); zzCONSUME;
3286 zzmatch(INT);
3287 v=atoi(LATEXT(1));
3288 zzCONSUME;
3289
3290 }
3291 else {
3292 if ( (setwd10[LA(1)]&0x40) ) {
3293 v++;
3294 }
3295 else {zzFAIL(1,zzerr64,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3296 }
3297 zzEXIT(zztasp4);
3298 }
3299 }
3300
3301 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3302 TokenNum = v;
3303 if ( v>maxt ) maxt=v; /* MR3 */
3304 if ( Tnum( t ) == 0 ) addForcedTname( t, v );
3305 else {
3306 warnFL(eMsg1("redefinition of token %s; ignored",t), fname,zzline);
3307 }
3308 }
3309 else {
3310 if ( (setwd10[LA(1)]&0x80) ) {
3311 }
3312 else {zzFAIL(1,zzerr65,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk); goto fail;}
3313 }
3314 }
3315 zzEXIT(zztasp3);
3316 }
3317 }
3318 zzLOOP(zztasp2);
3319 }
3320 zzEXIT(zztasp2);
3321 }
3322 }
3323 zzmatch(155); zzCONSUME;
3324 zzmatch(156);
3325 TokenNum = maxt + 1;
3326 zzCONSUME;
3327
3328 zzEXIT(zztasp1);
3329 return;
3330 fail:
3331 zzEXIT(zztasp1);
3332 zzsyn(zzMissText, zzBadTok, (ANTLRChar *)"", zzMissSet, zzMissTok, zzErrk, zzBadText);
3333 zzresynch(setwd11, 0x1);
3334 }
3335 }
3336
3337
3338 /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
3339 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */
3340 /* MR2 Don't let #tokdefs be confused by */
3341 /* MR2 DLGminToken and DLGmaxToken */
3342
3343 /* semantic check on DLGminToken and DLGmaxmaxToken in #tokdefs */
3344
3345 #ifdef __USE_PROTOS
isDLGmaxToken(char * Token)3346 static int isDLGmaxToken(char *Token)
3347 #else
3348 static int isDLGmaxToken(Token)
3349 char * Token;
3350 #endif
3351 {
3352 static char checkStr1[] = "DLGmaxToken";
3353 static char checkStr2[] = "DLGminToken";
3354
3355 if (strcmp(Token, checkStr1) == 0)
3356 return 1;
3357 else if (strcmp(Token, checkStr2) == 0)
3358 return 1;
3359 else
3360 return 0;
3361 }
3362
3363 /* semantics of #token */
3364 static void
3365 #ifdef __USE_PROTOS
chkToken(char * t,char * e,char * a,int tnum)3366 chkToken(char *t, char *e, char *a, int tnum)
3367 #else
3368 chkToken(t,e,a,tnum)
3369 char *t, *e, *a;
3370 int tnum;
3371 #endif
3372 {
3373 TermEntry *p;
3374
3375 /* check to see that they don't try to redefine a token as a token class */
3376 if ( t!=NULL ) {
3377 p = (TermEntry *) hash_get(Tname, t);
3378 if ( p!=NULL && p->classname ) {
3379 err(eMsg1("redefinition of #tokclass '%s' to #token not allowed; ignored",t));
3380 if ( a!=NULL ) free((char *)a);
3381 return;
3382 }
3383 }
3384
3385 if ( t==NULL && e==NULL ) { /* none found */
3386 err("#token requires at least token name or rexpr");
3387 }
3388 else if ( t!=NULL && e!=NULL ) { /* both found */
3389 if ( UserDefdTokens ) { /* if #tokdefs, must not define new */
3390 p = (TermEntry *) hash_get(Tname, t);
3391 if ( p == NULL) {
3392 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t));
3393 return;
3394 };
3395 }
3396 Tklink(t, e);
3397 if ( a!=NULL ) {
3398 if ( hasAction(e) ) {
3399 err(eMsg1("redefinition of action for %s; ignored",e));
3400 }
3401 else setHasAction(e, a);
3402 }
3403 }
3404 else if ( t!=NULL ) { /* only one found */
3405 if ( UserDefdTokens ) {
3406 p = (TermEntry *) hash_get(Tname, t);
3407 if (p == NULL) {
3408 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t));
3409 };
3410 return;
3411 }
3412 if ( Tnum( t ) == 0 ) addTname( t );
3413 else {
3414 err(eMsg1("redefinition of token %s; ignored",t));
3415 }
3416 if ( a!=NULL ) {
3417 err(eMsg1("action cannot be attached to a token name (%s); ignored",t));
3418 free((char *)a);
3419 }
3420 }
3421 else if ( e!=NULL ) {
3422 if ( Tnum( e ) == 0 ) addTexpr( e );
3423 else {
3424 if ( hasAction(e) ) {
3425 err(eMsg1("redefinition of action for expr %s; ignored",e));
3426 }
3427 else if ( a==NULL ) {
3428 err(eMsg1("redefinition of expr %s; ignored",e));
3429 }
3430 }
3431 if ( a!=NULL ) setHasAction(e, a);
3432 }
3433
3434 /* if a token type number was specified, then add the token ID and 'tnum'
3435 * pair to the ForcedTokens list. (only applies if an id was given)
3436 */
3437 if ( t!=NULL && tnum>0 )
3438 {
3439 if ( set_el(tnum, reserved_positions) )
3440 {
3441 err(eMsgd("a token has already been forced to token number %d; ignored", tnum));
3442 }
3443 else
3444 {
3445 list_add(&ForcedTokens, newForcedToken(t,tnum));
3446 set_orel(tnum, &reserved_positions);
3447 }
3448 }
3449 }
3450
3451 static int
3452 #ifdef __USE_PROTOS
match_token(char * s,char ** nxt)3453 match_token(char *s, char **nxt)
3454 #else
3455 match_token(s,nxt)
3456 char *s;
3457 char **nxt;
3458 #endif
3459 {
3460 if ( !(*s>='A' && *s<='Z') ) return 0;
3461 s++;
3462 while ( (*s>='a' && *s<='z') ||
3463 (*s>='A' && *s<='Z') ||
3464 (*s>='0' && *s<='9') ||
3465 *s=='_' )
3466 {
3467 s++;
3468 }
3469 if ( *s!=' ' && *s!='}' ) return 0;
3470 *nxt = s;
3471 return 1;
3472 }
3473
3474 static int
3475 #ifdef __USE_PROTOS
match_rexpr(char * s,char ** nxt)3476 match_rexpr(char *s, char **nxt)
3477 #else
3478 match_rexpr(s,nxt)
3479 char *s;
3480 char **nxt;
3481 #endif
3482 {
3483 if ( *s!='"' ) return 0;
3484 s++;
3485 while ( *s!='"' )
3486 {
3487 if ( *s=='\n' || *s=='\r' ) /* MR13 */
3488 warn("eoln found in regular expression");
3489 if ( *s=='\\' ) s++;
3490 s++;
3491 }
3492 *nxt = s+1;
3493 return 1;
3494 }
3495
3496 /*
3497 * Walk a string "{ A .. Z }" where A..Z is a space separated list
3498 * of token references (either labels or reg exprs). Return a
3499 * string "inlineX_set" for some unique integer X. Basically,
3500 * we pretend as if we had seen "#tokclass inlineX { A .. Z }"
3501 * on the input stream outside of an action.
3502 */
3503 char *
3504 #ifdef __USE_PROTOS
inline_set(char * s)3505 inline_set(char *s)
3506 #else
3507 inline_set(s)
3508 char *s;
3509 #endif
3510 {
3511 char *nxt;
3512 fprintf(stderr, "found consumeUntil( {...} )\n");
3513 while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;}
3514 if ( *s!='{' )
3515 {
3516 err("malformed consumeUntil( {...} ); missing '{'");
3517 return "bad_set";
3518 }
3519 s++;
3520 while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;}
3521 while ( *s!='}' )
3522 {
3523 if ( match_token(s,&nxt) ) fprintf(stderr, "found token %s\n", s);
3524 else if ( match_rexpr(s,&nxt) ) fprintf(stderr, "found rexpr %s\n", s);
3525 else {
3526 err("invalid element in consumeUntil( {...} )");
3527 return "bad_set";
3528 }
3529 s = nxt;
3530 while ( *s==' ' || *s=='\t' || *s=='\n' || *s=='\r' ) {s++;}
3531 }
3532 return "inlineX_set";
3533 }
3534
3535 /* ANTLR-specific syntax error message generator
3536 * (define USER_ZZSYN when compiling so don't get 2 definitions)
3537 */
3538 void
3539 #ifdef __USE_PROTOS
zzsyn(char * text,int tok,char * egroup,SetWordType * eset,int etok,int k,char * bad_text)3540 zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok,
3541 int k, char *bad_text)
3542 #else
3543 zzsyn(text, tok, egroup, eset, etok, k, bad_text)
3544 char *text, *egroup, *bad_text;
3545 int tok;
3546 int etok;
3547 int k;
3548 SetWordType *eset;
3549 #endif
3550 {
3551 fprintf(stderr, ErrHdr, FileStr[CurFile]!=NULL?FileStr[CurFile]:"stdin", zzline);
3552 fprintf(stderr, " syntax error at \"%s\"", (tok==zzEOF_TOKEN)?"EOF":text);
3553 if ( !etok && !eset ) {fprintf(stderr, "\n"); return;}
3554 if ( k==1 ) fprintf(stderr, " missing");
3555 else
3556 {
3557 fprintf(stderr, "; \"%s\" not", bad_text);
3558 if ( zzset_deg(eset)>1 ) fprintf(stderr, " in");
3559 }
3560 if ( zzset_deg(eset)>0 ) zzedecode(eset);
3561 else fprintf(stderr, " %s", zztokens[etok]);
3562 if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup);
3563 fprintf(stderr, "\n");
3564 }
3565