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