2 * A n t l r T r a n s l a t i o n H e a d e r
4 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
5 * Purdue University Electrical Engineering
6 * With AHPCRC, University of Minnesota
7 * ANTLR Version 1.33MR33
9 * ..\bin\antlr -gh antlr.g
13 #define ANTLR_VERSION 13333
15 #include "pccts_stdio.h"
23 #define zzcr_attr(attr,tok,t)
30 /* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */
33 #define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s));
39 /* MR20 G. Hobbelt For Borland C++ 4.x & 5.x compiling with ALL warnings enabled */
40 #if defined(__TURBOC__)
41 #pragma warn -aus /* unused assignment of 'xxx' */
44 #pragma clang diagnostic ignored "-Wparentheses-equality"
47 static void chkToken(char *, char *, char *, int);
49 static void chkToken();
53 static int isDLGmaxToken(char *Token
); /* MR3 */
55 static int isDLGmaxToken(); /* MR3 */
58 static int class_nest_level
= 0;
60 /* MR20 G. Hobbelt extern definitions moved to antlr.h */
81 if ( !((setwd1
[LA(1)]&0x1))) break;
83 zzmatch(94); zzCONSUME
;
86 if ( HdrAction
==NULL
) {
87 HdrAction
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
88 require(HdrAction
!=NULL
, "rule grammar: cannot allocate header action");
89 strcpy(HdrAction
, LATEXT(1));
91 else warn("additional #header statement ignored");
97 zzmatch(95); zzCONSUME
;
100 if ( FirstAction
==NULL
) {
101 FirstAction
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
102 require(FirstAction
!=NULL
, "rule grammar: cannot allocate #first action");
103 strcpy(FirstAction
, LATEXT(1));
105 warn("additional #first statement ignored");
112 zzmatch(96); zzCONSUME
;
116 warn("#parser meta-op incompatible with -CC; ignored");
119 if ( strcmp(ParserName
,"zzparser")==0 ) {
120 ParserName
=StripQuotes(mystrdup(LATEXT(1)));
121 if ( RulePrefix
[0]!='\0' )
123 warn("#parser meta-op incompatible with '-gp prefix'; '-gp' ignored");
127 else warn("additional #parser statement ignored");
134 zzmatch(97); zzCONSUME
;
138 zzantlr_state st
; FILE *f
; struct zzdlg_state dst
;
139 UserTokenDefsFile
= mystrdup(LATEXT(1));
140 zzsave_antlr_state(&st
);
141 zzsave_dlg_state(&dst
);
142 fname
= mystrdup(LATEXT(1));
143 f
= fopen(StripQuotes(fname
), "r");
144 if ( f
==NULL
) {warn(eMsg1("cannot open token defs file '%s'", fname
+1));}
146 ANTLRm(enum_file(fname
+1), f
, PARSE_ENUM_FILE
);
149 zzrestore_antlr_state(&st
);
150 zzrestore_dlg_state(&dst
);
155 else break; /* MR6 code for exiting loop "for sure" */
169 if ( !((setwd1
[LA(1)]&0x2))) break;
170 if ( (LA(1)==Action
) ) {
173 UserAction
*ua
= newUserAction(LATEXT(1));
174 ua
->file
= action_file
; ua
->line
= action_line
;
175 if ( class_nest_level
>0 ) list_add(&class_before_actions
, ua
);
176 else list_add(&BeforeActions
, ua
);
182 if ( (LA(1)==108) ) {
186 if ( (LA(1)==109) ) {
190 if ( (LA(1)==110) ) {
194 if ( (LA(1)==116) ) {
198 if ( (LA(1)==120) ) {
202 if ( (LA(1)==117) ) {
206 if ( (LA(1)==118) ) {
210 if ( (LA(1)==111) ) {
214 if ( (LA(1)==133) ) {
215 default_exception_handler();
225 if ( class_nest_level
==0 )
226 warn("missing class definition for trailing '}'");
231 else break; /* MR6 code for exiting loop "for sure" */
249 g
=zzaArg(zztasp1
,3); SynDiag
= (Junction
*) zzaArg(zztasp1
,3 ).left
;
255 if ( !((setwd1
[LA(1)]&0x4))) break;
256 if ( (LA(1)==NonTerminal
) ) {
258 if ( zzaArg(zztasp2
,1 ).left
!=NULL
) {
261 /* MR21a */ /* Avoid use of a malformed graph when CannotContinue */
262 /* MR21a */ /* is already set */
264 /* MR21a */ if (! (CannotContinue
&& g
.left
== NULL
)) {
265 /* MR21a */ g
= Or(g
, zzaArg(zztasp2
,1));
270 if ( (LA(1)==116) ) {
274 if ( (LA(1)==120) ) {
278 if ( (LA(1)==117) ) {
282 if ( (LA(1)==118) ) {
286 if ( (LA(1)==111) ) {
297 if ( class_nest_level
==0 )
298 warn("missing class definition for trailing '}'");
303 else break; /* MR6 code for exiting loop "for sure" */
321 if ( !((setwd1
[LA(1)]&0x8))) break;
322 if ( (LA(1)==Action
) ) {
325 UserAction
*ua
= newUserAction(LATEXT(1));
326 ua
->file
= action_file
; ua
->line
= action_line
;
327 if ( class_nest_level
>0 ) list_add(&class_after_actions
, ua
);
328 else list_add(&AfterActions
, ua
);
334 if ( (LA(1)==108) ) {
338 if ( (LA(1)==109) ) {
342 if ( (LA(1)==110) ) {
346 if ( (LA(1)==117) ) {
350 if ( (LA(1)==118) ) {
358 if ( (LA(1)==111) ) {
365 if ( class_nest_level
==0 )
366 warn("missing class definition for trailing '}'");
371 else break; /* MR6 code for exiting loop "for sure" */
385 zzmatch(Eof
); zzCONSUME
;
391 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
392 zzresynch(setwd1
, 0x10);
407 int go
=1; char name
[MaxRuleName
+1];
408 zzmatch(99); zzCONSUME
;
413 if ( (LA(1)==NonTerminal
) ) {
414 zzmatch(NonTerminal
);
415 if(go
) strncpy(name
,LATEXT(1),MaxRuleName
);
420 if ( (LA(1)==TokenTerm
) ) {
422 if(go
) strncpy(name
,LATEXT(1),MaxRuleName
);
426 else {zzFAIL(1,zzerr1
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
432 if ( CurrentClassName
[0]!='\0' && strcmp(CurrentClassName
,name
)!=0
434 err("only one grammar class allowed in this release");
437 else strcpy(CurrentClassName
, name
);
438 if ( !GenCC
) { err("class meta-op used without C++ option"); }
443 while ( (setwd1
[LA(1)]&0x20) ) {
444 zzsetmatch(zzerr2
, zzerr3
);
445 if (ClassDeclStuff
== NULL
) {
446 /* MR10 */ ClassDeclStuff
=(char *)calloc(MaxClassDeclStuff
+1,sizeof(char));
448 /* MR10 */ strncat(ClassDeclStuff
," ",MaxClassDeclStuff
);
449 /* MR10 */ strncat(ClassDeclStuff
,LATEXT(1),MaxClassDeclStuff
);
451 /* MR22 */ if (0 == strcmp(LATEXT(1),"public")) break;
452 /* MR22 */ if (0 == strcmp(LATEXT(1),"private")) break;
453 /* MR22 */ if (0 == strcmp(LATEXT(1),"protected")) break;
454 /* MR22 */ if (0 == strcmp(LATEXT(1),"virtual")) break;
455 /* MR22 */ if (0 == strcmp(LATEXT(1),",")) break;
456 /* MR22 */ if (0 == strcmp(LATEXT(1),":")) break;
457 /* MR22 */ if (BaseClassName
!= NULL
) break;
458 /* MR22 */ BaseClassName
=(char *)calloc(strlen(LATEXT(1))+1,sizeof(char));
459 /* MR22 */ require(BaseClassName
!=NULL
, "rule grammar: cannot allocate base class name");
460 /* MR22 */ strcpy(BaseClassName
,LATEXT(1));
461 /* MR22 */ } while (0);
472 no_classes_found
= 0;
473 if ( class_nest_level
>=1 ) {warn("cannot have nested classes");}
474 else class_nest_level
++;
482 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
483 zzresynch(setwd1
, 0x40);
501 RuleEntry
*q
; Junction
*p
; Graph r
; int f
, l
; ECnode
*e
;
502 set toksrefd
, rulesrefd
;
503 char *pdecl
=NULL
, *ret
=NULL
, *a
; CurRetDef
= CurParmDef
= NULL
;
505 CurElementLabels
= NULL
;
506 CurAstLabelsInActions
= NULL
; /* MR27 */
507 /* We want a new element label hash table for each rule */
508 if ( Elabel
!=NULL
) killHashTable(Elabel
);
509 Elabel
= newHashTable();
510 attribsRefdFromAction
= empty
;
511 zzmatch(NonTerminal
);
513 if ( hash_get(Rname
, LATEXT(1))!=NULL
) {
514 err(eMsg1("duplicate rule definition: '%s'",LATEXT(1)));
519 q
= (RuleEntry
*)hash_add(Rname
,
521 (Entry
*)newRuleEntry(LATEXT(1)));
525 f
= CurFile
; l
= zzline
;
533 if ( (LA(1)==103) ) {
535 if ( q
!=NULL
) q
->noAST
= TRUE
;
540 if ( (setwd1
[LA(1)]&0x80) ) {
542 else {zzFAIL(1,zzerr4
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
552 if ( (setwd2
[LA(1)]&0x1) ) {
557 if ( (LA(1)==104) ) {
558 zzmatch(104); zzCONSUME
;
561 if ( (LA(1)==PassAction
) ) {
563 else {zzFAIL(1,zzerr5
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
569 pdecl
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
570 require(pdecl
!=NULL
, "rule rule: cannot allocate param decl");
571 strcpy(pdecl
, LATEXT(1));
577 if ( (setwd2
[LA(1)]&0x2) ) {
579 else {zzFAIL(1,zzerr6
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
588 if ( (LA(1)==105) ) {
589 zzmatch(105); zzCONSUME
;
591 ret
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
592 require(ret
!=NULL
, "rule rule: cannot allocate ret type");
593 strcpy(ret
, LATEXT(1));
599 if ( (setwd2
[LA(1)]&0x4) ) {
601 else {zzFAIL(1,zzerr7
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
610 if ( (LA(1)==QuotedTerm
) ) {
612 if ( q
!=NULL
) q
->egroup
=mystrdup(LATEXT(1));
617 if ( (LA(1)==106) ) {
619 else {zzFAIL(1,zzerr8
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
625 if ( GenEClasseForRules
&& q
!=NULL
) {
627 require(e
!=NULL
, "cannot allocate error class node");
628 if ( q
->egroup
== NULL
) {a
= q
->str
; a
[0] = (char)toupper(a
[0]);}
630 if ( Tnum( a
) == 0 )
632 e
->tok
= addTname( a
);
633 list_add(&eclasses
, (char *)e
);
634 if ( q
->egroup
== NULL
) a
[0] = (char)tolower(a
[0]);
635 /* refers to itself */
636 list_add(&(e
->elist
), mystrdup(q
->str
));
639 warn(eMsg1("default errclass for '%s' would conflict with token/errclass/tokclass",a
));
640 if ( q
->egroup
== NULL
) a
[0] = (char)tolower(a
[0]);
645 if (BlkLevel
>= MAX_BLK_LEVEL
) fatal("Blocks nested too deeply");
646 /* MR23 */ CurBlockID_array
[BlkLevel
] = CurBlockID
;
647 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
652 block( &toksrefd
, &rulesrefd
);
653 r
= makeBlk(zzaArg(zztasp1
,7),0, NULL
/* pFirstSetSymbol */ );
654 CurRuleBlk
= (Junction
*)r
.left
;
655 CurRuleBlk
->blockid
= CurBlockID
;
656 CurRuleBlk
->jtype
= RuleBlk
;
657 if ( q
!=NULL
) CurRuleBlk
->rname
= q
->str
;
658 CurRuleBlk
->file
= f
;
659 CurRuleBlk
->line
= l
;
660 CurRuleBlk
->pdecl
= pdecl
;
661 CurRuleBlk
->ret
= ret
;
662 CurRuleBlk
->lock
= makelocks();
663 CurRuleBlk
->pred_lock
= makelocks();
664 CurRuleBlk
->tokrefs
= toksrefd
;
665 CurRuleBlk
->rulerefs
= rulesrefd
;
666 p
= newJunction(); /* add EndRule Node */
667 ((Junction
*)r
.right
)->p1
= (Node
*)p
;
668 r
.right
= (Node
*) p
;
670 p
->lock
= makelocks();
671 p
->pred_lock
= makelocks();
673 if ( q
!=NULL
) q
->rulenum
= NumRules
;
674 zzaArg(zztasp1
,7) = r
;
676 /* MR23 */ CurBlockID_array
[BlkLevel
] = (-1);
677 /* MR23 */ CurAltNum_array
[BlkLevel
] = (-1);
679 altFixup();leFixup();egFixup();
688 if ( (LA(1)==Action
) ) {
690 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
691 require(a
!=NULL
, "rule rule: cannot allocate error action");
692 strcpy(a
, LATEXT(1));
693 CurRuleBlk
->erraction
= a
;
698 if ( (setwd2
[LA(1)]&0x8) ) {
700 else {zzFAIL(1,zzerr9
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
709 while ( (LA(1)==133) ) {
710 eg
= exception_group();
713 list_add(&CurExGroups
, (void *)eg
);
714 if (eg
->label
== NULL
|| *eg
->label
=='\0' ) q
->has_rule_exception
= 1;
721 if ( q
==NULL
) zzaArg(zztasp1
,0 ).left
= NULL
; else zzaArg(zztasp1
,0) = zzaArg(zztasp1
,7);
722 CurRuleBlk
->exceptions
= CurExGroups
;
723 CurRuleBlk
->el_labels
= CurElementLabels
;
724 CurRuleNode
->ast_labels_in_actions
= CurAstLabelsInActions
;
731 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
732 zzresynch(setwd2
, 0x10);
748 zzmatch(108); zzCONSUME
;
751 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
752 require(a
!=NULL
, "rule laction: cannot allocate action");
753 strcpy(a
, LATEXT(1));
754 list_add(&LexActions
, a
);
762 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
763 zzresynch(setwd2
, 0x20);
779 zzmatch(109); zzCONSUME
;
782 /* MR1 */ if (! GenCC
) {
783 /* MR1 */ err("Use #lexmember only in C++ mode (to insert code in DLG class header");
785 /* MR1 */ a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
786 /* MR1 */ require(a
!=NULL
, "rule lmember: cannot allocate action");
787 /* MR1 */ strcpy(a
, LATEXT(1));
788 /* MR1 */ list_add(&LexMemberActions
, a
);
798 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
799 zzresynch(setwd2
, 0x40);
815 zzmatch(110); zzCONSUME
;
818 /* MR1 */ if (! GenCC
) {
819 /* MR1 */ err("Use #lexprefix only in C++ mode (to insert code in DLG class header");
821 /* MR1 */ a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
822 /* MR1 */ require(a
!=NULL
, "rule lprefix: cannot allocate action");
823 /* MR1 */ strcpy(a
, LATEXT(1));
824 /* MR1 */ list_add(&LexPrefixActions
, a
);
834 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
835 zzresynch(setwd2
, 0x80);
850 PredEntry
*predEntry
=NULL
;
852 Predicate
*predExpr
=NULL
;
853 char *predLiteral
=NULL
;
856 int predExprPresent
=0;
859 MR_usingPredNames
=1; /* will need to use -mrhoist version of genPredTree */
863 name
=mystrdup(LATEXT(1));
867 /* don't free - referenced in predicates */
869 CurPredName
=(char *)calloc(1,strlen(name
) + 10);
870 strcat(CurPredName
,"#pred ");
871 strcat(CurPredName
,name
);
873 predEntry
=(PredEntry
*) hash_get(Pname
,name
);
874 if (predEntry
!= NULL
) {
875 warnFL(eMsg1("#pred %s previously defined - ignored",name
),
876 FileStr
[action_file
],action_line
);
883 if ( (LA(1)==Pred
) ) {
885 predLiteral
=mystrdup(LATEXT(1));
886 save_line
=action_line
;
887 save_file
=action_file
;
894 if ( (setwd3
[LA(1)]&0x1) ) {
895 predExpr
= predOrExpr();
900 if ( (setwd3
[LA(1)]&0x2) ) {
902 else {zzFAIL(1,zzerr10
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
907 if (predLiteral
!= NULL
&& name
!= NULL
) {
910 * predExpr may be NULL due to syntax errors
911 * or simply omitted by the user
914 predEntry
=newPredEntry(name
);
915 predEntry
->file
=save_file
;
916 predEntry
->line
=save_line
;
917 predExpr
=MR_predFlatten(predExpr
);
918 predEntry
->predLiteral
=predLiteral
;
919 if (! predExprPresent
|| predExpr
== NULL
) {
921 predExpr
->expr
=predLiteral
;
922 predExpr
->source
=newActionNode();
923 predExpr
->source
->action
=predExpr
->expr
;
924 predExpr
->source
->rname
=CurPredName
;
925 predExpr
->source
->line
=action_line
;
926 predExpr
->source
->file
=action_file
;
927 predExpr
->source
->is_predicate
=1;
928 predExpr
->k
=predicateLookaheadDepth(predExpr
->source
);
930 predEntry
->pred
=predExpr
;
931 hash_add(Pname
,name
,(Entry
*)predEntry
);
934 predicate_free(predExpr
);
937 if ( (setwd3
[LA(1)]&0x4) ) {
938 save_line
=zzline
; save_file
=CurFile
;
939 predExpr
= predOrExpr();
941 if (predExpr
!= NULL
&& name
!= NULL
) {
942 predEntry
=newPredEntry(name
);
943 predEntry
->file
=CurFile
;
944 predEntry
->line
=zzline
;
945 predExpr
=MR_predFlatten(predExpr
);
946 predEntry
->pred
=predExpr
;
947 hash_add(Pname
,name
,(Entry
*)predEntry
);
950 predicate_free(predExpr
);
952 else {zzFAIL(1,zzerr11
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
961 if ( (LA(1)==107) ) {
962 zzmatch(107); zzCONSUME
;
965 if ( (setwd3
[LA(1)]&0x8) ) {
967 else {zzFAIL(1,zzerr12
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
976 predicate_free(predExpr
);
977 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
978 zzresynch(setwd3
, 0x10);
992 PCCTS_PURIFY(_retv
,sizeof(Predicate
* ))
997 Predicate
**tail
=NULL
;
998 predExpr
= predAndExpr();
1002 ORnode
->expr
=PRED_OR_LIST
;
1003 if (predExpr
!= NULL
) {
1004 ORnode
->down
=predExpr
;
1005 tail
=&predExpr
->right
;
1011 while ( (LA(1)==112) ) {
1012 zzmatch(112); zzCONSUME
;
1013 predExpr
= predAndExpr();
1016 if (predExpr
!= NULL
) {
1018 tail
=&predExpr
->right
;
1032 predicate_free(ORnode
);
1033 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1034 zzresynch(setwd3
, 0x20);
1049 PCCTS_PURIFY(_retv
,sizeof(Predicate
* ))
1053 Predicate
*predExpr
;
1054 Predicate
**tail
=NULL
;
1055 predExpr
= predPrimary();
1059 ANDnode
->expr
=PRED_AND_LIST
;
1060 if (predExpr
!= NULL
) {
1061 ANDnode
->down
=predExpr
;
1062 tail
=&predExpr
->right
;
1068 while ( (LA(1)==113) ) {
1069 zzmatch(113); zzCONSUME
;
1070 predExpr
= predPrimary();
1073 if (predExpr
!= NULL
) {
1075 tail
=&predExpr
->right
;
1089 predicate_free(ANDnode
);
1090 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1091 zzresynch(setwd3
, 0x40);
1106 PCCTS_PURIFY(_retv
,sizeof(Predicate
* ))
1111 PredEntry
*predEntry
=NULL
;
1112 Predicate
*predExpr
=NULL
;
1113 if ( (LA(1)==TokenTerm
) ) {
1115 name
=mystrdup(LATEXT(1));
1119 predEntry
=(PredEntry
*) hash_get(Pname
,name
);
1120 if (predEntry
== NULL
) {
1121 warnFL(eMsg1("no previously defined #pred with name \"%s\"",name
),
1122 FileStr
[CurFile
],zzline
);
1126 predExpr
=predicate_dup(predEntry
->pred
);
1127 predExpr
->predEntry
=predEntry
;
1132 if ( (LA(1)==114) ) {
1133 zzmatch(114); zzCONSUME
;
1134 predExpr
= predOrExpr();
1143 if ( (LA(1)==103) ) {
1144 zzmatch(103); zzCONSUME
;
1145 predExpr
= predPrimary();
1148 predExpr
->inverted
=!predExpr
->inverted
;
1151 else {zzFAIL(1,zzerr13
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1159 predicate_free(predExpr
);
1160 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1161 zzresynch(setwd3
, 0x80);
1177 zzmatch(116); zzCONSUME
;
1179 lexclass(mystrdup(LATEXT(1)));
1186 CannotContinue
=TRUE
;
1187 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1188 zzresynch(setwd4
, 0x1);
1203 char *t
=NULL
; ECnode
*e
; int go
=1; TermEntry
*p
;
1204 zzmatch(117); zzCONSUME
;
1210 if ( (LA(1)==TokenTerm
) ) {
1212 t
=mystrdup(LATEXT(1));
1217 if ( (LA(1)==QuotedTerm
) ) {
1218 zzmatch(QuotedTerm
);
1219 t
=mystrdup(LATEXT(1));
1223 else {zzFAIL(1,zzerr14
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1229 require(e
!=NULL
, "cannot allocate error class node");
1230 e
->lexclass
= CurrentLexClass
;
1231 if ( Tnum( (t
=StripQuotes(t
)) ) == 0 )
1233 if ( hash_get(Texpr
, t
) != NULL
)
1234 warn(eMsg1("errclass name conflicts with regular expression '%s'",t
));
1235 e
->tok
= addTname( t
);
1236 set_orel(e
->tok
, &imag_tokens
);
1237 require((p
=(TermEntry
*)hash_get(Tname
, t
)) != NULL
,
1238 "hash table mechanism is broken");
1239 p
->classname
= 1; /* entry is errclass name, not token */
1240 list_add(&eclasses
, (char *)e
);
1244 warn(eMsg1("redefinition of errclass or conflict w/token or tokclass '%s'; ignored",t
));
1248 zzmatch(102); zzCONSUME
;
1253 if ( (LA(1)==NonTerminal
) ) {
1254 zzmatch(NonTerminal
);
1255 if ( go
) t
=mystrdup(LATEXT(1));
1260 if ( (LA(1)==TokenTerm
) ) {
1262 if ( go
) t
=mystrdup(LATEXT(1));
1267 if ( (LA(1)==QuotedTerm
) ) {
1268 zzmatch(QuotedTerm
);
1269 if ( go
) t
=mystrdup(LATEXT(1));
1273 else {zzFAIL(1,zzerr15
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1279 if ( go
) list_add(&(e
->elist
), t
);
1284 while ( (setwd4
[LA(1)]&0x2) ) {
1289 if ( (LA(1)==NonTerminal
) ) {
1290 zzmatch(NonTerminal
);
1291 if ( go
) t
=mystrdup(LATEXT(1));
1296 if ( (LA(1)==TokenTerm
) ) {
1298 if ( go
) t
=mystrdup(LATEXT(1));
1303 if ( (LA(1)==QuotedTerm
) ) {
1304 zzmatch(QuotedTerm
);
1305 if ( go
) t
=mystrdup(LATEXT(1));
1309 else {zzFAIL(1,zzerr16
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1315 if ( go
) list_add(&(e
->elist
), t
);
1321 zzmatch(98); zzCONSUME
;
1326 CannotContinue
=TRUE
;
1327 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1328 zzresynch(setwd4
, 0x4);
1343 char *t
=NULL
; TCnode
*e
; int go
=1,tok
,totok
; TermEntry
*p
, *term
, *toterm
;
1344 char *akaString
=NULL
; int save_file
; int save_line
;
1346 zzmatch(118); zzCONSUME
;
1348 t
=mystrdup(LATEXT(1));
1352 require(e
!=NULL
, "cannot allocate token class node");
1353 e
->lexclass
= CurrentLexClass
;
1354 if ( Tnum( t
) == 0 )
1356 e
->tok
= addTname( t
);
1357 set_orel(e
->tok
, &imag_tokens
);
1358 set_orel(e
->tok
, &tokclasses
);
1359 require((p
=(TermEntry
*)hash_get(Tname
, t
)) != NULL
,
1360 "hash table mechanism is broken");
1361 p
->classname
= 1; /* entry is class name, not token */
1362 p
->tclass
= e
; /* save ptr to this tclass def */
1363 list_add(&tclasses
, (char *)e
);
1367 warn(eMsg1("redefinition of tokclass or conflict w/token '%s'; ignored",t
));
1375 if ( (LA(1)==114) ) {
1376 zzmatch(114); zzCONSUME
;
1377 zzmatch(QuotedTerm
);
1378 akaString
=mystrdup(StripQuotes(LATEXT(1)));
1379 /* MR11 */ save_file
=CurFile
;save_line
=zzline
;
1383 zzmatch(115); zzCONSUME
;
1386 if ( (LA(1)==102) ) {
1388 else {zzFAIL(1,zzerr17
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1394 /* MR23 */ if (p
!= NULL
&& akaString
!= NULL
) {
1395 /* MR23 */ if (p
->akaString
!= NULL
) {
1396 /* MR23 */ if (strcmp(p
->akaString
,akaString
) != 0) {
1397 /* MR23 */ warnFL(eMsg2("this #tokclass statment conflicts with a previous #tokclass %s(\"%s\") statement",
1398 /* MR23 */ t
,p
->akaString
),
1399 /* MR23 */ FileStr
[save_file
],save_line
);
1402 /* MR23 */ p
->akaString
=akaString
;
1406 zzmatch(102); zzCONSUME
;
1417 if ( (LA(1)==TokenTerm
) ) {
1420 term
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
1421 if ( term
==NULL
&& UserDefdTokens
) {
1422 err("implicit token definition not allowed with #tokdefs");
1425 else {t
=mystrdup(LATEXT(1)); tok
=addTname(LATEXT(1));}
1433 if ( (LA(1)==119) ) {
1434 zzmatch(119); zzCONSUME
;
1437 toterm
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
1438 if ( toterm
==NULL
&& UserDefdTokens
) {
1439 err("implicit token definition not allowed with #tokdefs");
1442 totext
=mystrdup(LATEXT(1)); totok
=addTname(LATEXT(1));
1449 if ( (setwd4
[LA(1)]&0x8) ) {
1451 else {zzFAIL(1,zzerr18
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1458 if ( (LA(1)==QuotedTerm
) ) {
1459 zzmatch(QuotedTerm
);
1461 term
= (TermEntry
*) hash_get(Texpr
, LATEXT(1));
1462 if ( term
==NULL
&& UserDefdTokens
) {
1463 err("implicit token definition not allowed with #tokdefs");
1466 else {t
=mystrdup(LATEXT(1)); tok
=addTexpr(LATEXT(1));}
1471 else {zzFAIL(1,zzerr19
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1477 if (totext
== NULL
) {
1478 list_add(&(e
->tlist
), t
);
1480 list_add(&(e
->tlist
),"..");
1481 list_add(&(e
->tlist
),t
);
1482 list_add(&(e
->tlist
),totext
);
1487 } while ( (setwd4
[LA(1)]&0x10) );
1491 zzmatch(98); zzCONSUME
;
1496 CannotContinue
=TRUE
;
1497 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1498 zzresynch(setwd4
, 0x20);
1513 char *t
=NULL
, *e
=NULL
, *a
=NULL
; int tnum
=0;
1514 char *akaString
=NULL
; TermEntry
*te
;int save_file
=0,save_line
=0;
1516 tokenActionActive
=1;
1523 if ( (LA(1)==TokenTerm
) ) {
1525 t
=mystrdup(LATEXT(1));
1532 if ( (LA(1)==114) ) {
1533 zzmatch(114); zzCONSUME
;
1534 zzmatch(QuotedTerm
);
1535 akaString
=mystrdup(StripQuotes(LATEXT(1)));
1536 /* MR11 */ save_file
=CurFile
;save_line
=zzline
;
1540 zzmatch(115); zzCONSUME
;
1543 if ( (setwd4
[LA(1)]&0x40) ) {
1545 else {zzFAIL(1,zzerr20
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1554 if ( (LA(1)==121) ) {
1555 zzmatch(121); zzCONSUME
;
1557 tnum
= atoi(LATEXT(1));
1562 if ( (setwd4
[LA(1)]&0x80) ) {
1564 else {zzFAIL(1,zzerr21
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1571 if ( (setwd5
[LA(1)]&0x1) ) {
1573 else {zzFAIL(1,zzerr22
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1582 if ( (LA(1)==QuotedTerm
) ) {
1583 zzmatch(QuotedTerm
);
1584 e
=mystrdup(LATEXT(1));
1589 if ( (setwd5
[LA(1)]&0x2) ) {
1591 else {zzFAIL(1,zzerr23
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1600 if ( (LA(1)==Action
) ) {
1603 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
1604 require(a
!=NULL
, "rule token: cannot allocate action");
1605 strcpy(a
, LATEXT(1));
1610 if ( (setwd5
[LA(1)]&0x4) ) {
1612 else {zzFAIL(1,zzerr24
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1621 if ( (LA(1)==107) ) {
1622 zzmatch(107); zzCONSUME
;
1625 if ( (setwd5
[LA(1)]&0x8) ) {
1627 else {zzFAIL(1,zzerr25
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1632 chkToken(t
, e
, a
, tnum
);
1634 te
=(TermEntry
*)hash_get(Tname
,t
);
1635 if (te
!= NULL
&& akaString
!= NULL
) {
1636 if (te
->akaString
!= NULL
) {
1637 if (strcmp(te
->akaString
,akaString
) != 0) {
1638 warnFL(eMsg2("this #token statment conflicts with a previous #token %s(\"%s\") statement",
1640 FileStr
[save_file
],save_line
);
1643 te
->akaString
=akaString
;
1651 CannotContinue
=TRUE
;
1652 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1653 zzresynch(setwd5
, 0x10);
1659 block(set
* toksrefd
,set
* rulesrefd
)
1661 block(toksrefd
,rulesrefd
)
1673 int saveinalt
= inAlt
;
1676 * rulesrefd
= empty
;
1677 set_clr(AST_nodes_refd_in_actions
);
1679 /* MR23 */ CurBlockID_array
[BlkLevel
] = CurBlockID
;
1681 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
1682 saveblah
= attribsRefdFromAction
;
1683 attribsRefdFromAction
= empty
;
1684 alt( toksrefd
,rulesrefd
);
1685 b
= g
= zzaArg(zztasp1
,1);
1687 if ( ((Junction
*)g
.left
)->p1
->ntype
== nAction
)
1689 ActionNode
*actionNode
=(ActionNode
*)
1690 ( ( (Junction
*)g
.left
) ->p1
);
1691 if (!actionNode
->is_predicate
)
1693 actionNode
->init_action
= TRUE
;
1694 /* MR12c */ if (actionNode
->noHoist
) {
1695 /* MR12c */ errFL("<<nohoist>> appears as init-action - use <<>> <<nohoist>>",
1696 /* MR12c */ FileStr
[actionNode
->file
],actionNode
->line
);
1700 ((Junction
*)g
.left
)->blockid
= CurBlockID
;
1705 while ( (LA(1)==133) ) {
1706 eg
= exception_group();
1710 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/
1711 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/
1712 list_add(&CurExGroups
, (void *)eg
);
1720 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
1725 while ( (LA(1)==123) ) {
1730 alt( toksrefd
,rulesrefd
);
1731 g
= Or(g
, zzaArg(zztasp2
,2));
1733 ((Junction
*)g
.left
)->blockid
= CurBlockID
;
1738 while ( (LA(1)==133) ) {
1739 eg
= exception_group();
1743 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/
1744 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/
1745 list_add(&CurExGroups
, (void *)eg
);
1753 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
1759 zzaArg(zztasp1
,0) = b
;
1760 attribsRefdFromAction
= saveblah
; inAlt
= saveinalt
;
1765 CannotContinue
=TRUE
;
1766 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1767 zzresynch(setwd5
, 0x20);
1773 alt(set
* toksrefd
,set
* rulesrefd
)
1775 alt(toksrefd
,rulesrefd
)
1784 int n
=0; Graph g
; int e_num
=0, old_not
=0; Node
*node
; set elems
, dif
;
1785 int first_on_line
= 1, use_def_MT_handler
= 0;
1786 g
.left
=NULL
; g
.right
=NULL
;
1795 if ( (LA(1)==88) ) {
1797 use_def_MT_handler
= 1;
1802 if ( (setwd5
[LA(1)]&0x40) ) {
1804 else {zzFAIL(1,zzerr26
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1814 while ( (setwd5
[LA(1)]&0x80) ) {
1820 if ( (LA(1)==124) ) {
1827 if ( (setwd6
[LA(1)]&0x1) ) {
1829 else {zzFAIL(1,zzerr27
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1834 node
= element( old_not
, first_on_line
, use_def_MT_handler
);
1836 if ( node
!=NULL
&& node
->ntype
!=nAction
) first_on_line
= 0;
1838 if ( zzaArg(zztasp2
,2 ).left
!=NULL
) {
1839 g
= Cat(g
, zzaArg(zztasp2
,2));
1842 if ( node
->ntype
!=nAction
) e_num
++;
1843 /* record record number of all rule and token refs */
1844 if ( node
->ntype
==nToken
) {
1845 TokNode
*tk
= (TokNode
*)((Junction
*)zzaArg(zztasp2
,2 ).left
)->p1
;
1847 set_orel(e_num
, &elems
);
1849 else if ( node
->ntype
==nRuleRef
) {
1850 RuleRefNode
*rn
= (RuleRefNode
*)((Junction
*)zzaArg(zztasp2
,2 ).left
)->p1
;
1852 set_orel(e_num
, rulesrefd
);
1861 if ( n
== 0 ) g
= emptyAlt();
1862 zzaArg(zztasp1
,0) = g
;
1863 /* We want to reduce number of LT(i) calls and the number of
1864 * local attribute variables in C++ mode (for moment, later we'll
1865 * do for C also). However, if trees are being built, they
1866 * require most of the attrib variables to create the tree nodes
1867 * with; therefore, we gen a token ptr for each token ref in C++
1869 if ( GenCC
&& !GenAST
)
1871 /* This now free's the temp set -ATG 5/6/95 */
1873 temp
= set_and(elems
, attribsRefdFromAction
);
1874 set_orin( toksrefd
, temp
);
1877 else set_orin( toksrefd
, elems
);
1879 dif
= set_dif(attribsRefdFromAction
, elems
);
1880 if ( set_deg(dif
)>0 )
1881 err("one or more $i in action(s) refer to non-token elements");
1885 set_free(attribsRefdFromAction
);
1891 CannotContinue
=TRUE
;
1892 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1893 zzresynch(setwd6
, 0x2);
1907 PCCTS_PURIFY(_retv
,sizeof(LabelEntry
* ))
1910 TermEntry
*t
=NULL
; LabelEntry
*l
=NULL
; RuleEntry
*r
=NULL
; char *lab
;
1912 lab
= mystrdup(LATEXT(1));
1916 UsedNewStyleLabel
= 1;
1917 if ( UsedOldStyleAttrib
) err("cannot mix with new-style labels with old-style $i");
1918 t
= (TermEntry
*) hash_get(Tname
, lab
);
1919 if ( t
==NULL
) t
= (TermEntry
*) hash_get(Texpr
, lab
);
1920 if ( t
==NULL
) r
= (RuleEntry
*) hash_get(Rname
, lab
);
1922 err(eMsg1("label definition clashes with token/tokclass definition: '%s'", lab
));
1925 else if ( r
!=NULL
) {
1926 err(eMsg1("label definition clashes with rule definition: '%s'", lab
));
1930 /* we don't clash with anybody else */
1931 l
= (LabelEntry
*) hash_get(Elabel
, lab
);
1932 if ( l
==NULL
) { /* ok to add new element label */
1933 l
= (LabelEntry
*)hash_add(Elabel
,
1935 (Entry
*)newLabelEntry(lab
));
1936 /* add to list of element labels for this rule */
1937 list_add(&CurElementLabels
, (void *)lab
);
1938 /* MR7 */ leAdd(l
); /* list of labels waiting for exception group definitions */
1942 err(eMsg1("label definitions must be unique per rule: '%s'", lab
));
1946 zzmatch(106); zzCONSUME
;
1951 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1952 zzresynch(setwd6
, 0x4);
1959 element(int old_not
,int first_on_line
,int use_def_MT_handler
)
1961 element(old_not
,first_on_line
,use_def_MT_handler
)
1964 int use_def_MT_handler
;
1970 PCCTS_PURIFY(_retv
,sizeof(Node
* ))
1975 Predicate
*pred
= NULL
;
1976 int local_use_def_MT_handler
=0;
1979 set toksrefd
, rulesrefd
;
1981 TokNode
*p
=NULL
; RuleRefNode
*q
; int approx
=0;
1982 LabelEntry
*label
=NULL
;
1986 int height
; /* MR11 */
1987 int equal_height
; /* MR11 */
1989 char* pFirstSetSymbol
= NULL
; /* MR21 */
1992 if ( (setwd6
[LA(1)]&0x8) ) {
1997 if ( (LA(1)==LABEL
) ) {
1998 label
= element_label();
2002 if ( (setwd6
[LA(1)]&0x10) ) {
2004 else {zzFAIL(1,zzerr28
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2013 if ( (LA(1)==TokenTerm
) ) {
2016 term
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
2017 if ( term
==NULL
&& UserDefdTokens
) {
2018 err("implicit token definition not allowed with #tokdefs");
2019 zzaRet
.left
= zzaRet
.right
= NULL
;
2022 zzaRet
= buildToken(LATEXT(1));
2023 p
=((TokNode
*)((Junction
*)zzaRet
.left
)->p1
);
2024 term
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
2025 require( term
!= NULL
, "hash table mechanism is broken");
2026 p
->tclass
= term
->tclass
;
2027 p
->complement
= old_not
;
2028 if ( label
!=NULL
) {
2029 p
->el_label
= label
->str
;
2030 label
->elem
= (Node
*)p
;
2039 if ( (LA(1)==119) ) {
2040 zzmatch(119); zzCONSUME
;
2045 if ( (LA(1)==QuotedTerm
) ) {
2046 zzmatch(QuotedTerm
);
2047 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2052 if ( (LA(1)==TokenTerm
) ) {
2054 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2058 else {zzFAIL(1,zzerr29
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2065 if ( (setwd6
[LA(1)]&0x20) ) {
2067 else {zzFAIL(1,zzerr30
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2073 if ( p
!=NULL
&& (p
->upper_range
!=0 || p
->tclass
|| old_not
) )
2074 list_add(&MetaTokenNodes
, (void *)p
);
2079 if ( (LA(1)==125) ) {
2081 if ( p
!=NULL
) p
->astnode
=ASTroot
;
2086 if ( (setwd6
[LA(1)]&0x40) ) {
2087 if ( p
!=NULL
) p
->astnode
=ASTchild
;
2090 if ( (LA(1)==103) ) {
2092 if ( p
!=NULL
) p
->astnode
=ASTexclude
;
2096 else {zzFAIL(1,zzerr31
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2106 if ( (LA(1)==88) ) {
2108 local_use_def_MT_handler
= 1;
2113 if ( (setwd6
[LA(1)]&0x80) ) {
2115 else {zzFAIL(1,zzerr32
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2121 if ( p
!=NULL
&& first_on_line
) {
2122 CurAltStart
= (Junction
*)zzaRet
.left
;
2123 altAdd(CurAltStart
); /* MR7 */
2124 p
->altstart
= CurAltStart
;
2127 p
->use_def_MT_handler
= use_def_MT_handler
|| local_use_def_MT_handler
;
2131 if ( (LA(1)==QuotedTerm
) ) {
2132 zzmatch(QuotedTerm
);
2134 term
= (TermEntry
*) hash_get(Texpr
, LATEXT(1));
2135 if ( term
==NULL
&& UserDefdTokens
) {
2136 err("implicit token definition not allowed with #tokdefs");
2137 zzaRet
.left
= zzaRet
.right
= NULL
;
2140 zzaRet
= buildToken(LATEXT(1)); p
=((TokNode
*)((Junction
*)zzaRet
.left
)->p1
);
2141 p
->complement
= old_not
;
2142 if ( label
!=NULL
) {
2143 p
->el_label
= label
->str
;
2144 label
->elem
= (Node
*)p
;
2153 if ( (LA(1)==119) ) {
2154 zzmatch(119); zzCONSUME
;
2159 if ( (LA(1)==QuotedTerm
) ) {
2160 zzmatch(QuotedTerm
);
2161 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2166 if ( (LA(1)==TokenTerm
) ) {
2168 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2172 else {zzFAIL(1,zzerr33
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2179 if ( (setwd7
[LA(1)]&0x1) ) {
2181 else {zzFAIL(1,zzerr34
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2190 if ( (LA(1)==125) ) {
2192 if ( p
!=NULL
) p
->astnode
=ASTroot
;
2197 if ( (setwd7
[LA(1)]&0x2) ) {
2198 if ( p
!=NULL
) p
->astnode
=ASTchild
;
2201 if ( (LA(1)==103) ) {
2203 if ( p
!=NULL
) p
->astnode
=ASTexclude
;
2207 else {zzFAIL(1,zzerr35
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2217 if ( (LA(1)==88) ) {
2219 local_use_def_MT_handler
= 1;
2224 if ( (setwd7
[LA(1)]&0x4) ) {
2226 else {zzFAIL(1,zzerr36
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2232 if ( p
!=NULL
&& (p
->upper_range
!=0 || p
->tclass
|| old_not
) )
2233 list_add(&MetaTokenNodes
, (void *)p
);
2235 if ( first_on_line
) {
2236 CurAltStart
= (Junction
*)zzaRet
.left
;
2237 altAdd(CurAltStart
); /* MR7 */
2238 p
->altstart
= CurAltStart
;
2241 p
->use_def_MT_handler
= use_def_MT_handler
|| local_use_def_MT_handler
;
2245 if ( (LA(1)==WildCard
) ) {
2246 if ( old_not
) warn("~ WILDCARD is an undefined operation (implies 'nothing')");
2248 zzaRet
= buildWildCard(LATEXT(1)); p
=((TokNode
*)((Junction
*)zzaRet
.left
)->p1
);
2255 if ( (LA(1)==125) ) {
2262 if ( (setwd7
[LA(1)]&0x8) ) {
2263 p
->astnode
=ASTchild
;
2266 if ( (LA(1)==103) ) {
2268 p
->astnode
=ASTexclude
;
2272 else {zzFAIL(1,zzerr37
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2278 list_add(&MetaTokenNodes
, (void *)p
);
2280 if ( first_on_line
) {
2281 CurAltStart
= (Junction
*)zzaRet
.left
;
2282 altAdd(CurAltStart
); /* MR7 */
2283 p
->altstart
= CurAltStart
;
2284 if ( label
!=NULL
) {
2285 p
->el_label
= label
->str
;
2286 label
->elem
= (Node
*)p
;
2292 if ( (LA(1)==NonTerminal
) ) {
2293 if ( old_not
) warn("~ NONTERMINAL is an undefined operation");
2294 zzmatch(NonTerminal
);
2295 zzaRet
= buildRuleRef(LATEXT(1));
2302 if ( (LA(1)==103) ) {
2304 q
= (RuleRefNode
*) ((Junction
*)zzaRet
.left
)->p1
;
2305 q
->astnode
=ASTexclude
;
2310 if ( (setwd7
[LA(1)]&0x10) ) {
2312 else {zzFAIL(1,zzerr38
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2321 if ( (setwd7
[LA(1)]&0x20) ) {
2326 if ( (LA(1)==104) ) {
2327 zzmatch(104); zzCONSUME
;
2330 if ( (LA(1)==PassAction
) ) {
2332 else {zzFAIL(1,zzerr39
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2337 zzmatch(PassAction
);
2338 addParm(((Junction
*)zzaRet
.left
)->p1
, LATEXT(1));
2343 if ( (setwd7
[LA(1)]&0x40) ) {
2345 else {zzFAIL(1,zzerr40
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2350 rr
=(RuleRefNode
*) ((Junction
*)zzaRet
.left
)->p1
;
2356 if ( (LA(1)==105) ) {
2357 zzmatch(105); zzCONSUME
;
2358 zzmatch(PassAction
);
2360 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2361 require(a
!=NULL
, "rule element: cannot allocate assignment");
2362 strcpy(a
, LATEXT(1));
2368 if ( (setwd7
[LA(1)]&0x80) ) {
2370 else {zzFAIL(1,zzerr41
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2376 if ( label
!=NULL
) {
2377 rr
->el_label
= label
->str
;
2378 label
->elem
= (Node
*)rr
;
2380 if ( first_on_line
) {
2381 CurAltStart
= (Junction
*)zzaRet
.left
;
2382 altAdd(CurAltStart
); /* MR7 */
2383 ((RuleRefNode
*)((Junction
*)zzaRet
.left
)->p1
)->altstart
= CurAltStart
;
2387 else {zzFAIL(1,zzerr42
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2396 if ( (LA(1)==Action
) ) {
2397 if ( old_not
) warn("~ ACTION is an undefined operation");
2399 zzaArg(zztasp1
,0) = buildAction(LATEXT(1),action_file
,action_line
, 0);
2402 if ( first_on_line
) { /* MR7 */
2403 CurAltStart
= (Junction
*)zzaArg(zztasp1
,0 ).left
; /* MR7 */
2404 altAdd(CurAltStart
); /* MR7 */
2406 _retv
= (Node
*) ((Junction
*)zzaArg(zztasp1
,0 ).left
)->p1
;
2409 if ( (LA(1)==Pred
) ) {
2410 if ( old_not
) warn("~ SEMANTIC-PREDICATE is an undefined operation");
2412 zzaArg(zztasp1
,0) = buildAction(LATEXT(1),action_file
,action_line
, 1);
2415 act
= (ActionNode
*) ((Junction
*)zzaArg(zztasp1
,0 ).left
)->p1
;
2416 if (numericActionLabel
) { /* MR10 */
2417 list_add(&NumericPredLabels
,act
); /* MR10 */
2418 numericActionLabel
=0; /* MR10 */
2425 if ( (LA(1)==PassAction
) ) {
2426 zzmatch(PassAction
);
2428 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2429 require(a
!=NULL
, "rule element: cannot allocate predicate fail action");
2430 strcpy(a
, LATEXT(1));
2436 if ( (setwd8
[LA(1)]&0x1) ) {
2438 else {zzFAIL(1,zzerr43
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2443 if ( first_on_line
) { /* MR7 */
2444 CurAltStart
= (Junction
*)zzaArg(zztasp1
,0 ).left
; /* MR7 */
2445 altAdd(CurAltStart
); /* MR7 */
2447 _retv
= (Node
*)act
;
2450 if ( (setwd8
[LA(1)]&0x2) ) {
2451 if ( old_not
) warn("~ BLOCK is an undefined operation");
2453 if (BlkLevel
>= MAX_BLK_LEVEL
) fatal("Blocks nested too deeply");
2454 /* MR23 */ CurBlockID_array
[BlkLevel
] = CurBlockID
;
2455 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
2460 if ( (LA(1)==Pragma
) ) {
2461 zzmatch(Pragma
); zzCONSUME
;
2466 if ( (LA(1)==126) ) {
2473 if ( (LA(1)==127) ) {
2480 if ( (LA(1)==128) ) {
2486 else {zzFAIL(1,zzerr44
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2494 if ( (setwd8
[LA(1)]&0x4) ) {
2496 else {zzFAIL(1,zzerr45
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2505 if ( (LA(1)==FirstSetSymbol
) ) {
2506 zzmatch(FirstSetSymbol
); zzCONSUME
;
2507 zzmatch(114); zzCONSUME
;
2512 if ( (LA(1)==NonTerminal
) ) {
2513 zzmatch(NonTerminal
);
2515 /* MR21 */ pFirstSetSymbol
= (char *) calloc(strlen(LATEXT(1))+1,
2516 /* MR21 */ sizeof(char));
2517 /* MR21 */ require(pFirstSetSymbol
!=NULL
,
2518 /* MR21 */ "cannot allocate first set name");
2519 /* MR21 */ strcpy(pFirstSetSymbol
, LATEXT(1));
2525 if ( (LA(1)==TokenTerm
) ) {
2528 /* MR21 */ pFirstSetSymbol
= (char *) calloc(strlen(LATEXT(1))+1,
2529 /* MR21 */ sizeof(char));
2530 /* MR21 */ require(pFirstSetSymbol
!=NULL
,
2531 /* MR21 */ "cannot allocate first set name");
2532 /* MR21 */ strcpy(pFirstSetSymbol
, LATEXT(1));
2537 else {zzFAIL(1,zzerr46
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2542 zzmatch(115); zzCONSUME
;
2545 if ( (setwd8
[LA(1)]&0x8) ) {
2547 else {zzFAIL(1,zzerr47
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2556 if ( (LA(1)==114) ) {
2557 zzmatch(114); zzCONSUME
;
2558 block( &toksrefd
,&rulesrefd
);
2560 blk
= zzaRet
= zzaArg(zztasp2
,2);
2561 /* MR23 */ CurBlockID_array
[BlkLevel
] = (-1);
2562 /* MR23 */ CurAltNum_array
[BlkLevel
] = (-1);
2570 if ( (LA(1)==129) ) {
2572 zzaRet
= makeLoop(zzaRet
,approx
,pFirstSetSymbol
);
2577 if ( (LA(1)==130) ) {
2579 zzaRet
= makePlus(zzaRet
,approx
,pFirstSetSymbol
);
2584 if ( (LA(1)==131) ) {
2585 zzmatch(131); zzCONSUME
;
2590 if ( (setwd8
[LA(1)]&0x10) ) {
2595 if ( (LA(1)==132) ) {
2602 if ( (LA(1)==113) ) {
2608 else {zzFAIL(1,zzerr48
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2614 zzaRet
= buildAction(LATEXT(1),action_file
,action_line
,1);
2617 act
= (ActionNode
*) ((Junction
*)zzaRet
.left
)->p1
;
2618 semDepth
=predicateLookaheadDepth(act
);
2619 if (numericActionLabel
) { /* MR10 */
2620 list_add(&NumericPredLabels
,act
); /* MR10 */
2621 numericActionLabel
=0; /* MR10 */
2628 if ( (LA(1)==PassAction
) ) {
2629 zzmatch(PassAction
);
2631 a
= (char *)calloc(strlen(LATEXT(1))+1, sizeof(char));
2632 require(a
!=NULL
, "rule element: cannot allocate predicate fail action");
2633 strcpy(a
, LATEXT(1));
2639 if ( (setwd8
[LA(1)]&0x20) ) {
2641 else {zzFAIL(1,zzerr49
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2646 if ( first_on_line
) { /* MR7 */
2647 CurAltStart
=(Junction
*)zzaRet
.left
; /* MR7 */
2648 altAdd(CurAltStart
); /* MR7 */
2650 _retv
= (Node
*)act
;
2652 pred
= computePredFromContextGuard(blk
,&predMsgDone
); /* MR10 */
2653 if ( pred
==NULL
) { /* MR10 */
2654 if ( !predMsgDone
) err("invalid or missing context guard"); /* MR10 */
2655 predMsgDone
=1; /* MR10 */
2657 act
->guardNodes
=(Junction
*)blk
.left
; /* MR11 */
2658 pred
->expr
= act
->action
;
2660 /* MR10 */ pred
->ampersandStyle
= ampersandStyle
; /* 0 means (g)? => ... 1 means (g)? && ... */
2661 /* MR13 */ if (pred
->tcontext
!= NULL
) {
2662 /* MR13 */ height
=MR_max_height_of_tree(pred
->tcontext
);
2663 /* MR13 */ equal_height
=MR_all_leaves_same_height(pred
->tcontext
,height
);
2664 /* MR13 */ if (! equal_height
) {
2665 /* MR13 */ errFL("in guarded predicates all tokens in the guard must be at the same height",
2666 /* MR13 */ FileStr
[act
->file
],act
->line
);
2669 /* MR10 */ if (ampersandStyle
) {
2670 /* MR10 */ act
->ampersandPred
= pred
;
2671 /* MR11 */ if (! HoistPredicateContext
) {
2672 /* MR11 */ errFL("without \"-prc on\" (guard)? && <<pred>>? ... doesn't make sense",
2673 /* MR11 */ FileStr
[act
->file
],act
->line
);
2676 /* MR10 */ act
->guardpred
= pred
;
2678 /* MR10 */ if (pred
->k
!= semDepth
) {
2679 /* MR10 */ warn(eMsgd2("length of guard (%d) does not match the length of semantic predicate (%d)",
2680 /* MR10 */ pred
->k
,semDepth
));
2685 if ( (setwd8
[LA(1)]&0x40) ) {
2686 zzaRet
= makeBlk(zzaRet
,approx
,pFirstSetSymbol
);
2688 ((Junction
*) ((Junction
*)zzaRet
.left
)->p1
)->guess
=1;
2689 if ( ! first_on_line
) {
2690 err("(...)? predicate must be first element of production");
2693 else {zzFAIL(1,zzerr50
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2700 if ( (setwd8
[LA(1)]&0x80) ) {
2701 zzaRet
= makeBlk(zzaRet
,approx
,pFirstSetSymbol
);
2703 else {zzFAIL(1,zzerr51
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2711 if ( pred
==NULL
&& !predMsgDone
) { /* MR10 */
2712 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->blockid
= CurBlockID
;
2713 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->tokrefs
= toksrefd
;
2714 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->rulerefs
= rulesrefd
;
2715 if ( first_on_line
) { /* MR7 */
2716 CurAltStart
= (Junction
*)((Junction
*)((Junction
*)zzaRet
.left
)->p1
); /* MR7 */
2717 altAdd(CurAltStart
); /* MR7 */
2719 _retv
= (Node
*) ((Junction
*)zzaRet
.left
)->p1
;
2723 if ( (LA(1)==102) ) {
2724 zzmatch(102); zzCONSUME
;
2725 block( &toksrefd
,&rulesrefd
);
2726 zzaRet
= makeOpt(zzaArg(zztasp2
,2),approx
,pFirstSetSymbol
);
2727 /* MR23 */ CurBlockID_array
[BlkLevel
] = (-1);
2728 /* MR23 */ CurAltNum_array
[BlkLevel
] = (-1);
2732 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->blockid
= CurBlockID
;
2733 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->tokrefs
= toksrefd
;
2734 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->rulerefs
= rulesrefd
;
2737 if ( first_on_line
) { /* MR7 */
2738 CurAltStart
= (Junction
*) ((Junction
*)((Junction
*)zzaRet
.left
)->p1
); /* MR7 */
2739 altAdd(CurAltStart
); /* MR7 */
2741 _retv
= (Node
*) ((Junction
*)zzaRet
.left
)->p1
;
2743 else {zzFAIL(1,zzerr52
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2750 if ( (LA(1)==129) ) {
2752 warn("don't you want a ')' with that '*'?"); CannotContinue
=TRUE
;
2757 if ( (LA(1)==130) ) {
2759 warn("don't you want a ')' with that '+'?"); CannotContinue
=TRUE
;
2764 if ( (LA(1)==105) ) {
2766 warn("'>' can only appear after a nonterminal"); CannotContinue
=TRUE
;
2771 if ( (LA(1)==PassAction
) ) {
2772 zzmatch(PassAction
);
2773 warn("[...] out of context 'rule > [...]'");
2774 CannotContinue
=TRUE
;
2778 else {zzFAIL(1,zzerr53
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2790 CannotContinue
=TRUE
;
2791 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
2792 zzresynch(setwd9
, 0x1);
2799 default_exception_handler(void)
2801 default_exception_handler()
2808 DefaultExGroup
= exception_group();
2814 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
2815 zzresynch(setwd9
, 0x2);
2821 exception_group(void)
2826 ExceptionGroup
* _retv
;
2829 PCCTS_PURIFY(_retv
,sizeof(ExceptionGroup
* ))
2832 ExceptionHandler
*h
; LabelEntry
*label
=NULL
; /* MR6 */
2833 FoundException
= 1; FoundExceptionGroup
= 1;
2835 _retv
= (ExceptionGroup
*)calloc(1, sizeof(ExceptionGroup
));
2843 if ( (LA(1)==PassAction
) ) {
2844 zzmatch(PassAction
);
2847 p
[strlen(p
)-1] = '\0'; /* kill trailing space */
2848 label
= (LabelEntry
*) hash_get(Elabel
, LATEXT(1)+1);
2851 err(eMsg1("unknown label in exception handler: '%s'", LATEXT(1)+1));
2857 if ( (setwd9
[LA(1)]&0x4) ) {
2859 else {zzFAIL(1,zzerr54
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2868 while ( (LA(1)==135) ) {
2869 h
= exception_handler();
2871 list_add(&(_retv
->handlers
), (void *)h
);
2881 if ( (LA(1)==134) ) {
2882 zzmatch(134); zzCONSUME
;
2883 zzmatch(106); zzCONSUME
;
2886 ExceptionHandler
*eh
= (ExceptionHandler
*)
2887 calloc(1, sizeof(ExceptionHandler
));
2888 char *a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2889 require(eh
!=NULL
, "exception: cannot allocate handler");
2890 require(a
!=NULL
, "exception: cannot allocate action");
2891 strcpy(a
, LATEXT(1));
2893 eh
->signalname
= (char *) calloc(strlen("default")+1, sizeof(char));
2894 require(eh
->signalname
!=NULL
, "exception: cannot allocate sig name");
2895 strcpy(eh
->signalname
, "default");
2896 list_add(&(_retv
->handlers
), (void *)eh
);
2902 if ( (setwd9
[LA(1)]&0x8) ) {
2904 else {zzFAIL(1,zzerr55
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2910 if ( label
!=NULL
) {
2911 /* Record ex group in sym tab for this label */
2912 if ( label
->ex_group
!=NULL
) {
2913 err(eMsg1("duplicate exception handler for label '%s'",label
->str
));
2915 label
->ex_group
= _retv
;
2916 /* Label the exception group itself */
2917 _retv
->label
= label
->str
;
2918 /* Make the labelled element pt to the exception also */
2919 /* MR6 */ if (label
->elem
== NULL
) {
2920 /* MR6 */ err(eMsg1("reference in exception handler to undefined label '%s'",label
->str
));
2922 switch ( label
->elem
->ntype
) {
2925 RuleRefNode
*r
= (RuleRefNode
*)label
->elem
;
2926 r
->ex_group
= _retv
;
2931 TokNode
*t
= (TokNode
*)label
->elem
;
2932 t
->ex_group
= _retv
;
2936 /* MR6 */ }; /* end test on label->elem */
2937 } /* end test on label->ex_group */
2939 } /* end test on exception label */
2942 /* MR7 */ if (BlkLevel
== 1 && label
== NULL
) {
2943 /* MR7 */ _retv
->forRule
=1;
2944 /* MR7 */ } else if (label
== NULL
) {
2945 /* MR7 */ _retv
->altID
= makeAltID(CurBlockID_array
[BlkLevel
], CurAltNum_array
[BlkLevel
]);
2946 /* MR7 */ egAdd(_retv
);
2948 /* MR7 */ _retv
->labelEntry
=label
;
2951 /* MR7 */ /* You may want to remove this exc from the rule list */
2952 /* MR7 */ /* and handle at the labeled element site. */
2954 /* MR7 */ if (label
!= NULL
) {
2955 /* MR7 */ _retv
= NULL
;
2961 CannotContinue
=TRUE
;
2962 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
2963 zzresynch(setwd9
, 0x10);
2970 exception_handler(void)
2975 ExceptionHandler
* _retv
;
2978 PCCTS_PURIFY(_retv
,sizeof(ExceptionHandler
* ))
2984 _retv
= (ExceptionHandler
*)calloc(1, sizeof(ExceptionHandler
));
2985 require(_retv
!=NULL
, "exception: cannot allocate handler");
2992 if ( (LA(1)==NonTerminal
) ) {
2993 zzmatch(NonTerminal
);
2995 _retv
->signalname
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2996 require(_retv
->signalname
!=NULL
, "exception: cannot allocate sig name");
2997 strcpy(_retv
->signalname
, LATEXT(1));
3002 if ( (LA(1)==TokenTerm
) ) {
3005 _retv
->signalname
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
3006 require(_retv
->signalname
!=NULL
, "exception: cannot allocate sig name");
3007 strcpy(_retv
->signalname
, LATEXT(1));
3011 else {zzFAIL(1,zzerr56
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3016 zzmatch(106); zzCONSUME
;
3021 _retv
->action
= NULL
;
3022 if ( (LA(1)==Action
) ) {
3025 _retv
->action
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
3026 require(_retv
->action
!=NULL
, "exception: cannot allocate action");
3027 strcpy(_retv
->action
, LATEXT(1));
3032 if ( (setwd9
[LA(1)]&0x20) ) {
3034 else {zzFAIL(1,zzerr57
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3043 CannotContinue
=TRUE
;
3044 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3045 zzresynch(setwd9
, 0x40);
3052 enum_file(char * fname
)
3062 if ( (setwd9
[LA(1)]&0x80) ) {
3067 if ( (LA(1)==143) ) {
3068 zzmatch(143); zzCONSUME
;
3069 zzmatch(ID
); zzCONSUME
;
3074 if ( (LA(1)==149) ) {
3075 zzmatch(149); zzCONSUME
;
3076 zzmatch(ID
); zzCONSUME
;
3079 if ( (setwd10
[LA(1)]&0x1) ) {
3081 else {zzFAIL(1,zzerr58
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3088 if ( (setwd10
[LA(1)]&0x2) ) {
3090 else {zzFAIL(1,zzerr59
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3099 if ( (LA(1)==151) ) {
3108 } while ( (LA(1)==151) );
3114 if ( (LA(1)==149) ) {
3117 else {zzFAIL(1,zzerr60
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3124 if ( (LA(1)==Eof
) ) {
3126 else {zzFAIL(1,zzerr61
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3132 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3133 zzresynch(setwd10
, 0x4);
3139 defines(char * fname
)
3149 int v
; int maxt
=(-1); char *t
;
3156 zzmatch(149); zzCONSUME
;
3158 t
= mystrdup(LATEXT(1));
3163 v
= atoi(LATEXT(1));
3164 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3166 /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
3167 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */
3168 /* MR2 Don't let #tokdefs be confused by */
3169 /* MR2 DLGminToken and DLGmaxToken */
3171 if ( ! isDLGmaxToken(t
)) { /* MR2 */
3173 if ( v
>maxt
) maxt
=v
;
3174 if ( Tnum( t
) == 0 ) {
3175 addForcedTname( t
, v
);
3177 warnFL(eMsg1("redefinition of token %s; ignored",t
), fname
,zzline
);
3183 } while ( (LA(1)==149) );
3187 TokenNum
= maxt
+ 1;
3192 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3193 zzresynch(setwd10
, 0x8);
3199 enum_def(char * fname
)
3209 int v
= 0; int maxt
=(-1); char *t
;
3210 zzmatch(151); zzCONSUME
;
3211 zzmatch(ID
); zzCONSUME
;
3212 zzmatch(152); zzCONSUME
;
3214 t
= mystrdup(LATEXT(1));
3221 if ( (LA(1)==153) ) {
3222 zzmatch(153); zzCONSUME
;
3229 if ( (setwd10
[LA(1)]&0x10) ) {
3232 else {zzFAIL(1,zzerr62
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3238 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3240 if ( v
>maxt
) maxt
=v
; /* MR3 */
3241 if ( Tnum( t
) == 0 ) addForcedTname( t
, v
);
3243 warnFL(eMsg1("redefinition of token %s; ignored",t
), fname
,zzline
);
3249 while ( (LA(1)==154) ) {
3250 zzmatch(154); zzCONSUME
;
3255 if ( (LA(1)==ID
)&&(isDLGmaxToken(LATEXT(1))) ) {
3256 if (!(isDLGmaxToken(LATEXT(1))) ) {zzfailed_pred(" isDLGmaxToken(LATEXT(1))",0 /* report */, { ; /* no user action */ } );}
3257 zzmatch(ID
); zzCONSUME
;
3262 if ( (LA(1)==153) ) {
3263 zzmatch(153); zzCONSUME
;
3264 zzmatch(INT
); zzCONSUME
;
3267 if ( (setwd10
[LA(1)]&0x20) ) {
3269 else {zzFAIL(1,zzerr63
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3276 if ( (LA(1)==ID
) ) {
3278 t
= mystrdup(LATEXT(1));
3285 if ( (LA(1)==153) ) {
3286 zzmatch(153); zzCONSUME
;
3293 if ( (setwd10
[LA(1)]&0x40) ) {
3296 else {zzFAIL(1,zzerr64
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3302 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3304 if ( v
>maxt
) maxt
=v
; /* MR3 */
3305 if ( Tnum( t
) == 0 ) addForcedTname( t
, v
);
3307 warnFL(eMsg1("redefinition of token %s; ignored",t
), fname
,zzline
);
3311 if ( (setwd10
[LA(1)]&0x80) ) {
3313 else {zzFAIL(1,zzerr65
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3324 zzmatch(155); zzCONSUME
;
3326 TokenNum
= maxt
+ 1;
3333 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3334 zzresynch(setwd11
, 0x1);
3339 /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
3340 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */
3341 /* MR2 Don't let #tokdefs be confused by */
3342 /* MR2 DLGminToken and DLGmaxToken */
3344 /* semantic check on DLGminToken and DLGmaxmaxToken in #tokdefs */
3347 static int isDLGmaxToken(char *Token
)
3349 static int isDLGmaxToken(Token
)
3353 static char checkStr1
[] = "DLGmaxToken";
3354 static char checkStr2
[] = "DLGminToken";
3356 if (strcmp(Token
, checkStr1
) == 0)
3358 else if (strcmp(Token
, checkStr2
) == 0)
3364 /* semantics of #token */
3367 chkToken(char *t
, char *e
, char *a
, int tnum
)
3369 chkToken(t
,e
,a
,tnum
)
3376 /* check to see that they don't try to redefine a token as a token class */
3378 p
= (TermEntry
*) hash_get(Tname
, t
);
3379 if ( p
!=NULL
&& p
->classname
) {
3380 err(eMsg1("redefinition of #tokclass '%s' to #token not allowed; ignored",t
));
3381 if ( a
!=NULL
) free((char *)a
);
3386 if ( t
==NULL
&& e
==NULL
) { /* none found */
3387 err("#token requires at least token name or rexpr");
3389 else if ( t
!=NULL
&& e
!=NULL
) { /* both found */
3390 if ( UserDefdTokens
) { /* if #tokdefs, must not define new */
3391 p
= (TermEntry
*) hash_get(Tname
, t
);
3393 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t
));
3399 if ( hasAction(e
) ) {
3400 err(eMsg1("redefinition of action for %s; ignored",e
));
3402 else setHasAction(e
, a
);
3405 else if ( t
!=NULL
) { /* only one found */
3406 if ( UserDefdTokens
) {
3407 p
= (TermEntry
*) hash_get(Tname
, t
);
3409 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t
));
3413 if ( Tnum( t
) == 0 ) addTname( t
);
3415 err(eMsg1("redefinition of token %s; ignored",t
));
3418 err(eMsg1("action cannot be attached to a token name (%s); ignored",t
));
3422 else if ( e
!=NULL
) {
3423 if ( Tnum( e
) == 0 ) addTexpr( e
);
3425 if ( hasAction(e
) ) {
3426 err(eMsg1("redefinition of action for expr %s; ignored",e
));
3428 else if ( a
==NULL
) {
3429 err(eMsg1("redefinition of expr %s; ignored",e
));
3432 if ( a
!=NULL
) setHasAction(e
, a
);
3435 /* if a token type number was specified, then add the token ID and 'tnum'
3436 * pair to the ForcedTokens list. (only applies if an id was given)
3438 if ( t
!=NULL
&& tnum
>0 )
3440 if ( set_el(tnum
, reserved_positions
) )
3442 err(eMsgd("a token has already been forced to token number %d; ignored", tnum
));
3446 list_add(&ForcedTokens
, newForcedToken(t
,tnum
));
3447 set_orel(tnum
, &reserved_positions
);
3454 match_token(char *s
, char **nxt
)
3461 if ( !(*s
>='A' && *s
<='Z') ) return 0;
3463 while ( (*s
>='a' && *s
<='z') ||
3464 (*s
>='A' && *s
<='Z') ||
3465 (*s
>='0' && *s
<='9') ||
3470 if ( *s
!=' ' && *s
!='}' ) return 0;
3477 match_rexpr(char *s
, char **nxt
)
3484 if ( *s
!='"' ) return 0;
3488 if ( *s
=='\n' || *s
=='\r' ) /* MR13 */
3489 warn("eoln found in regular expression");
3490 if ( *s
=='\\' ) s
++;
3498 * Walk a string "{ A .. Z }" where A..Z is a space separated list
3499 * of token references (either labels or reg exprs). Return a
3500 * string "inlineX_set" for some unique integer X. Basically,
3501 * we pretend as if we had seen "#tokclass inlineX { A .. Z }"
3502 * on the input stream outside of an action.
3513 fprintf(stderr
, "found consumeUntil( {...} )\n");
3514 while ( *s
==' ' || *s
=='\t' || *s
=='\n' || *s
=='\r' ) {s
++;}
3517 err("malformed consumeUntil( {...} ); missing '{'");
3521 while ( *s
==' ' || *s
=='\t' || *s
=='\n' || *s
=='\r' ) {s
++;}
3524 if ( match_token(s
,&nxt
) ) fprintf(stderr
, "found token %s\n", s
);
3525 else if ( match_rexpr(s
,&nxt
) ) fprintf(stderr
, "found rexpr %s\n", s
);
3527 err("invalid element in consumeUntil( {...} )");
3531 while ( *s
==' ' || *s
=='\t' || *s
=='\n' || *s
=='\r' ) {s
++;}
3533 return "inlineX_set";
3536 /* ANTLR-specific syntax error message generator
3537 * (define USER_ZZSYN when compiling so don't get 2 definitions)
3541 zzsyn(char *text
, int tok
, char *egroup
, SetWordType
*eset
, int etok
,
3542 int k
, char *bad_text
)
3544 zzsyn(text
, tok
, egroup
, eset
, etok
, k
, bad_text
)
3545 char *text
, *egroup
, *bad_text
;
3552 fprintf(stderr
, ErrHdr
, FileStr
[CurFile
]!=NULL
?FileStr
[CurFile
]:"stdin", zzline
);
3553 fprintf(stderr
, " syntax error at \"%s\"", (tok
==zzEOF_TOKEN
)?"EOF":text
);
3554 if ( !etok
&& !eset
) {fprintf(stderr
, "\n"); return;}
3555 if ( k
==1 ) fprintf(stderr
, " missing");
3558 fprintf(stderr
, "; \"%s\" not", bad_text
);
3559 if ( zzset_deg(eset
)>1 ) fprintf(stderr
, " in");
3561 if ( zzset_deg(eset
)>0 ) zzedecode(eset
);
3562 else fprintf(stderr
, " %s", zztokens
[etok
]);
3563 if ( strlen(egroup
) > (size_t)0 ) fprintf(stderr
, " in %s", egroup
);
3564 fprintf(stderr
, "\n");