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