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' */
46 static void chkToken(char *, char *, char *, int);
48 static void chkToken();
52 static int isDLGmaxToken(char *Token
); /* MR3 */
54 static int isDLGmaxToken(); /* MR3 */
57 static int class_nest_level
= 0;
59 /* MR20 G. Hobbelt extern definitions moved to antlr.h */
80 if ( !((setwd1
[LA(1)]&0x1))) break;
82 zzmatch(94); zzCONSUME
;
85 if ( HdrAction
==NULL
) {
86 HdrAction
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
87 require(HdrAction
!=NULL
, "rule grammar: cannot allocate header action");
88 strcpy(HdrAction
, LATEXT(1));
90 else warn("additional #header statement ignored");
96 zzmatch(95); zzCONSUME
;
99 if ( FirstAction
==NULL
) {
100 FirstAction
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
101 require(FirstAction
!=NULL
, "rule grammar: cannot allocate #first action");
102 strcpy(FirstAction
, LATEXT(1));
104 warn("additional #first statement ignored");
111 zzmatch(96); zzCONSUME
;
115 warn("#parser meta-op incompatible with -CC; ignored");
118 if ( strcmp(ParserName
,"zzparser")==0 ) {
119 ParserName
=StripQuotes(mystrdup(LATEXT(1)));
120 if ( RulePrefix
[0]!='\0' )
122 warn("#parser meta-op incompatible with '-gp prefix'; '-gp' ignored");
126 else warn("additional #parser statement ignored");
133 zzmatch(97); zzCONSUME
;
137 zzantlr_state st
; FILE *f
; struct zzdlg_state dst
;
138 UserTokenDefsFile
= mystrdup(LATEXT(1));
139 zzsave_antlr_state(&st
);
140 zzsave_dlg_state(&dst
);
141 fname
= mystrdup(LATEXT(1));
142 f
= fopen(StripQuotes(fname
), "r");
143 if ( f
==NULL
) {warn(eMsg1("cannot open token defs file '%s'", fname
+1));}
145 ANTLRm(enum_file(fname
+1), f
, PARSE_ENUM_FILE
);
148 zzrestore_antlr_state(&st
);
149 zzrestore_dlg_state(&dst
);
154 else break; /* MR6 code for exiting loop "for sure" */
168 if ( !((setwd1
[LA(1)]&0x2))) break;
169 if ( (LA(1)==Action
) ) {
172 UserAction
*ua
= newUserAction(LATEXT(1));
173 ua
->file
= action_file
; ua
->line
= action_line
;
174 if ( class_nest_level
>0 ) list_add(&class_before_actions
, ua
);
175 else list_add(&BeforeActions
, ua
);
181 if ( (LA(1)==108) ) {
185 if ( (LA(1)==109) ) {
189 if ( (LA(1)==110) ) {
193 if ( (LA(1)==116) ) {
197 if ( (LA(1)==120) ) {
201 if ( (LA(1)==117) ) {
205 if ( (LA(1)==118) ) {
209 if ( (LA(1)==111) ) {
213 if ( (LA(1)==133) ) {
214 default_exception_handler();
224 if ( class_nest_level
==0 )
225 warn("missing class definition for trailing '}'");
230 else break; /* MR6 code for exiting loop "for sure" */
248 g
=zzaArg(zztasp1
,3); SynDiag
= (Junction
*) zzaArg(zztasp1
,3 ).left
;
254 if ( !((setwd1
[LA(1)]&0x4))) break;
255 if ( (LA(1)==NonTerminal
) ) {
257 if ( zzaArg(zztasp2
,1 ).left
!=NULL
) {
260 /* MR21a */ /* Avoid use of a malformed graph when CannotContinue */
261 /* MR21a */ /* is already set */
263 /* MR21a */ if (! (CannotContinue
&& g
.left
== NULL
)) {
264 /* MR21a */ g
= Or(g
, zzaArg(zztasp2
,1));
269 if ( (LA(1)==116) ) {
273 if ( (LA(1)==120) ) {
277 if ( (LA(1)==117) ) {
281 if ( (LA(1)==118) ) {
285 if ( (LA(1)==111) ) {
296 if ( class_nest_level
==0 )
297 warn("missing class definition for trailing '}'");
302 else break; /* MR6 code for exiting loop "for sure" */
320 if ( !((setwd1
[LA(1)]&0x8))) break;
321 if ( (LA(1)==Action
) ) {
324 UserAction
*ua
= newUserAction(LATEXT(1));
325 ua
->file
= action_file
; ua
->line
= action_line
;
326 if ( class_nest_level
>0 ) list_add(&class_after_actions
, ua
);
327 else list_add(&AfterActions
, ua
);
333 if ( (LA(1)==108) ) {
337 if ( (LA(1)==109) ) {
341 if ( (LA(1)==110) ) {
345 if ( (LA(1)==117) ) {
349 if ( (LA(1)==118) ) {
357 if ( (LA(1)==111) ) {
364 if ( class_nest_level
==0 )
365 warn("missing class definition for trailing '}'");
370 else break; /* MR6 code for exiting loop "for sure" */
384 zzmatch(Eof
); zzCONSUME
;
390 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
391 zzresynch(setwd1
, 0x10);
406 int go
=1; char name
[MaxRuleName
+1];
407 zzmatch(99); zzCONSUME
;
412 if ( (LA(1)==NonTerminal
) ) {
413 zzmatch(NonTerminal
);
414 if(go
) strncpy(name
,LATEXT(1),MaxRuleName
);
419 if ( (LA(1)==TokenTerm
) ) {
421 if(go
) strncpy(name
,LATEXT(1),MaxRuleName
);
425 else {zzFAIL(1,zzerr1
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
431 if ( CurrentClassName
[0]!='\0' && strcmp(CurrentClassName
,name
)!=0
433 err("only one grammar class allowed in this release");
436 else strcpy(CurrentClassName
, name
);
437 if ( !GenCC
) { err("class meta-op used without C++ option"); }
442 while ( (setwd1
[LA(1)]&0x20) ) {
443 zzsetmatch(zzerr2
, zzerr3
);
444 if (ClassDeclStuff
== NULL
) {
445 /* MR10 */ ClassDeclStuff
=(char *)calloc(MaxClassDeclStuff
+1,sizeof(char));
447 /* MR10 */ strncat(ClassDeclStuff
," ",MaxClassDeclStuff
);
448 /* MR10 */ strncat(ClassDeclStuff
,LATEXT(1),MaxClassDeclStuff
);
450 /* MR22 */ if (0 == strcmp(LATEXT(1),"public")) break;
451 /* MR22 */ if (0 == strcmp(LATEXT(1),"private")) break;
452 /* MR22 */ if (0 == strcmp(LATEXT(1),"protected")) break;
453 /* MR22 */ if (0 == strcmp(LATEXT(1),"virtual")) break;
454 /* MR22 */ if (0 == strcmp(LATEXT(1),",")) break;
455 /* MR22 */ if (0 == strcmp(LATEXT(1),":")) break;
456 /* MR22 */ if (BaseClassName
!= NULL
) break;
457 /* MR22 */ BaseClassName
=(char *)calloc(strlen(LATEXT(1))+1,sizeof(char));
458 /* MR22 */ require(BaseClassName
!=NULL
, "rule grammar: cannot allocate base class name");
459 /* MR22 */ strcpy(BaseClassName
,LATEXT(1));
460 /* MR22 */ } while (0);
471 no_classes_found
= 0;
472 if ( class_nest_level
>=1 ) {warn("cannot have nested classes");}
473 else class_nest_level
++;
481 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
482 zzresynch(setwd1
, 0x40);
500 RuleEntry
*q
; Junction
*p
; Graph r
; int f
, l
; ECnode
*e
;
501 set toksrefd
, rulesrefd
;
502 char *pdecl
=NULL
, *ret
=NULL
, *a
; CurRetDef
= CurParmDef
= NULL
;
504 CurElementLabels
= NULL
;
505 CurAstLabelsInActions
= NULL
; /* MR27 */
506 /* We want a new element label hash table for each rule */
507 if ( Elabel
!=NULL
) killHashTable(Elabel
);
508 Elabel
= newHashTable();
509 attribsRefdFromAction
= empty
;
510 zzmatch(NonTerminal
);
512 if ( hash_get(Rname
, LATEXT(1))!=NULL
) {
513 err(eMsg1("duplicate rule definition: '%s'",LATEXT(1)));
518 q
= (RuleEntry
*)hash_add(Rname
,
520 (Entry
*)newRuleEntry(LATEXT(1)));
524 f
= CurFile
; l
= zzline
;
532 if ( (LA(1)==103) ) {
534 if ( q
!=NULL
) q
->noAST
= TRUE
;
539 if ( (setwd1
[LA(1)]&0x80) ) {
541 else {zzFAIL(1,zzerr4
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
551 if ( (setwd2
[LA(1)]&0x1) ) {
556 if ( (LA(1)==104) ) {
557 zzmatch(104); zzCONSUME
;
560 if ( (LA(1)==PassAction
) ) {
562 else {zzFAIL(1,zzerr5
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
568 pdecl
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
569 require(pdecl
!=NULL
, "rule rule: cannot allocate param decl");
570 strcpy(pdecl
, LATEXT(1));
576 if ( (setwd2
[LA(1)]&0x2) ) {
578 else {zzFAIL(1,zzerr6
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
587 if ( (LA(1)==105) ) {
588 zzmatch(105); zzCONSUME
;
590 ret
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
591 require(ret
!=NULL
, "rule rule: cannot allocate ret type");
592 strcpy(ret
, LATEXT(1));
598 if ( (setwd2
[LA(1)]&0x4) ) {
600 else {zzFAIL(1,zzerr7
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
609 if ( (LA(1)==QuotedTerm
) ) {
611 if ( q
!=NULL
) q
->egroup
=mystrdup(LATEXT(1));
616 if ( (LA(1)==106) ) {
618 else {zzFAIL(1,zzerr8
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
624 if ( GenEClasseForRules
&& q
!=NULL
) {
626 require(e
!=NULL
, "cannot allocate error class node");
627 if ( q
->egroup
== NULL
) {a
= q
->str
; a
[0] = (char)toupper(a
[0]);}
629 if ( Tnum( a
) == 0 )
631 e
->tok
= addTname( a
);
632 list_add(&eclasses
, (char *)e
);
633 if ( q
->egroup
== NULL
) a
[0] = (char)tolower(a
[0]);
634 /* refers to itself */
635 list_add(&(e
->elist
), mystrdup(q
->str
));
638 warn(eMsg1("default errclass for '%s' would conflict with token/errclass/tokclass",a
));
639 if ( q
->egroup
== NULL
) a
[0] = (char)tolower(a
[0]);
644 if (BlkLevel
>= MAX_BLK_LEVEL
) fatal("Blocks nested too deeply");
645 /* MR23 */ CurBlockID_array
[BlkLevel
] = CurBlockID
;
646 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
651 block( &toksrefd
, &rulesrefd
);
652 r
= makeBlk(zzaArg(zztasp1
,7),0, NULL
/* pFirstSetSymbol */ );
653 CurRuleBlk
= (Junction
*)r
.left
;
654 CurRuleBlk
->blockid
= CurBlockID
;
655 CurRuleBlk
->jtype
= RuleBlk
;
656 if ( q
!=NULL
) CurRuleBlk
->rname
= q
->str
;
657 CurRuleBlk
->file
= f
;
658 CurRuleBlk
->line
= l
;
659 CurRuleBlk
->pdecl
= pdecl
;
660 CurRuleBlk
->ret
= ret
;
661 CurRuleBlk
->lock
= makelocks();
662 CurRuleBlk
->pred_lock
= makelocks();
663 CurRuleBlk
->tokrefs
= toksrefd
;
664 CurRuleBlk
->rulerefs
= rulesrefd
;
665 p
= newJunction(); /* add EndRule Node */
666 ((Junction
*)r
.right
)->p1
= (Node
*)p
;
667 r
.right
= (Node
*) p
;
669 p
->lock
= makelocks();
670 p
->pred_lock
= makelocks();
672 if ( q
!=NULL
) q
->rulenum
= NumRules
;
673 zzaArg(zztasp1
,7) = r
;
675 /* MR23 */ CurBlockID_array
[BlkLevel
] = (-1);
676 /* MR23 */ CurAltNum_array
[BlkLevel
] = (-1);
678 altFixup();leFixup();egFixup();
687 if ( (LA(1)==Action
) ) {
689 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
690 require(a
!=NULL
, "rule rule: cannot allocate error action");
691 strcpy(a
, LATEXT(1));
692 CurRuleBlk
->erraction
= a
;
697 if ( (setwd2
[LA(1)]&0x8) ) {
699 else {zzFAIL(1,zzerr9
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
708 while ( (LA(1)==133) ) {
709 eg
= exception_group();
712 list_add(&CurExGroups
, (void *)eg
);
713 if (eg
->label
== NULL
|| *eg
->label
=='\0' ) q
->has_rule_exception
= 1;
720 if ( q
==NULL
) zzaArg(zztasp1
,0 ).left
= NULL
; else zzaArg(zztasp1
,0) = zzaArg(zztasp1
,7);
721 CurRuleBlk
->exceptions
= CurExGroups
;
722 CurRuleBlk
->el_labels
= CurElementLabels
;
723 CurRuleNode
->ast_labels_in_actions
= CurAstLabelsInActions
;
730 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
731 zzresynch(setwd2
, 0x10);
747 zzmatch(108); zzCONSUME
;
750 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
751 require(a
!=NULL
, "rule laction: cannot allocate action");
752 strcpy(a
, LATEXT(1));
753 list_add(&LexActions
, a
);
761 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
762 zzresynch(setwd2
, 0x20);
778 zzmatch(109); zzCONSUME
;
781 /* MR1 */ if (! GenCC
) {
782 /* MR1 */ err("Use #lexmember only in C++ mode (to insert code in DLG class header");
784 /* MR1 */ a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
785 /* MR1 */ require(a
!=NULL
, "rule lmember: cannot allocate action");
786 /* MR1 */ strcpy(a
, LATEXT(1));
787 /* MR1 */ list_add(&LexMemberActions
, a
);
797 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
798 zzresynch(setwd2
, 0x40);
814 zzmatch(110); zzCONSUME
;
817 /* MR1 */ if (! GenCC
) {
818 /* MR1 */ err("Use #lexprefix only in C++ mode (to insert code in DLG class header");
820 /* MR1 */ a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
821 /* MR1 */ require(a
!=NULL
, "rule lprefix: cannot allocate action");
822 /* MR1 */ strcpy(a
, LATEXT(1));
823 /* MR1 */ list_add(&LexPrefixActions
, a
);
833 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
834 zzresynch(setwd2
, 0x80);
849 PredEntry
*predEntry
=NULL
;
851 Predicate
*predExpr
=NULL
;
852 char *predLiteral
=NULL
;
855 int predExprPresent
=0;
858 MR_usingPredNames
=1; /* will need to use -mrhoist version of genPredTree */
862 name
=mystrdup(LATEXT(1));
866 /* don't free - referenced in predicates */
868 CurPredName
=(char *)calloc(1,strlen(name
) + 10);
869 strcat(CurPredName
,"#pred ");
870 strcat(CurPredName
,name
);
872 predEntry
=(PredEntry
*) hash_get(Pname
,name
);
873 if (predEntry
!= NULL
) {
874 warnFL(eMsg1("#pred %s previously defined - ignored",name
),
875 FileStr
[action_file
],action_line
);
882 if ( (LA(1)==Pred
) ) {
884 predLiteral
=mystrdup(LATEXT(1));
885 save_line
=action_line
;
886 save_file
=action_file
;
893 if ( (setwd3
[LA(1)]&0x1) ) {
894 predExpr
= predOrExpr();
899 if ( (setwd3
[LA(1)]&0x2) ) {
901 else {zzFAIL(1,zzerr10
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
906 if (predLiteral
!= NULL
&& name
!= NULL
) {
909 * predExpr may be NULL due to syntax errors
910 * or simply omitted by the user
913 predEntry
=newPredEntry(name
);
914 predEntry
->file
=save_file
;
915 predEntry
->line
=save_line
;
916 predExpr
=MR_predFlatten(predExpr
);
917 predEntry
->predLiteral
=predLiteral
;
918 if (! predExprPresent
|| predExpr
== NULL
) {
920 predExpr
->expr
=predLiteral
;
921 predExpr
->source
=newActionNode();
922 predExpr
->source
->action
=predExpr
->expr
;
923 predExpr
->source
->rname
=CurPredName
;
924 predExpr
->source
->line
=action_line
;
925 predExpr
->source
->file
=action_file
;
926 predExpr
->source
->is_predicate
=1;
927 predExpr
->k
=predicateLookaheadDepth(predExpr
->source
);
929 predEntry
->pred
=predExpr
;
930 hash_add(Pname
,name
,(Entry
*)predEntry
);
933 predicate_free(predExpr
);
936 if ( (setwd3
[LA(1)]&0x4) ) {
937 save_line
=zzline
; save_file
=CurFile
;
938 predExpr
= predOrExpr();
940 if (predExpr
!= NULL
&& name
!= NULL
) {
941 predEntry
=newPredEntry(name
);
942 predEntry
->file
=CurFile
;
943 predEntry
->line
=zzline
;
944 predExpr
=MR_predFlatten(predExpr
);
945 predEntry
->pred
=predExpr
;
946 hash_add(Pname
,name
,(Entry
*)predEntry
);
949 predicate_free(predExpr
);
951 else {zzFAIL(1,zzerr11
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
960 if ( (LA(1)==107) ) {
961 zzmatch(107); zzCONSUME
;
964 if ( (setwd3
[LA(1)]&0x8) ) {
966 else {zzFAIL(1,zzerr12
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
975 predicate_free(predExpr
);
976 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
977 zzresynch(setwd3
, 0x10);
991 PCCTS_PURIFY(_retv
,sizeof(Predicate
* ))
996 Predicate
**tail
=NULL
;
997 predExpr
= predAndExpr();
1001 ORnode
->expr
=PRED_OR_LIST
;
1002 if (predExpr
!= NULL
) {
1003 ORnode
->down
=predExpr
;
1004 tail
=&predExpr
->right
;
1010 while ( (LA(1)==112) ) {
1011 zzmatch(112); zzCONSUME
;
1012 predExpr
= predAndExpr();
1015 if (predExpr
!= NULL
) {
1017 tail
=&predExpr
->right
;
1031 predicate_free(ORnode
);
1032 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1033 zzresynch(setwd3
, 0x20);
1048 PCCTS_PURIFY(_retv
,sizeof(Predicate
* ))
1052 Predicate
*predExpr
;
1053 Predicate
**tail
=NULL
;
1054 predExpr
= predPrimary();
1058 ANDnode
->expr
=PRED_AND_LIST
;
1059 if (predExpr
!= NULL
) {
1060 ANDnode
->down
=predExpr
;
1061 tail
=&predExpr
->right
;
1067 while ( (LA(1)==113) ) {
1068 zzmatch(113); zzCONSUME
;
1069 predExpr
= predPrimary();
1072 if (predExpr
!= NULL
) {
1074 tail
=&predExpr
->right
;
1088 predicate_free(ANDnode
);
1089 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1090 zzresynch(setwd3
, 0x40);
1105 PCCTS_PURIFY(_retv
,sizeof(Predicate
* ))
1110 PredEntry
*predEntry
=NULL
;
1111 Predicate
*predExpr
=NULL
;
1112 if ( (LA(1)==TokenTerm
) ) {
1114 name
=mystrdup(LATEXT(1));
1118 predEntry
=(PredEntry
*) hash_get(Pname
,name
);
1119 if (predEntry
== NULL
) {
1120 warnFL(eMsg1("no previously defined #pred with name \"%s\"",name
),
1121 FileStr
[CurFile
],zzline
);
1125 predExpr
=predicate_dup(predEntry
->pred
);
1126 predExpr
->predEntry
=predEntry
;
1131 if ( (LA(1)==114) ) {
1132 zzmatch(114); zzCONSUME
;
1133 predExpr
= predOrExpr();
1142 if ( (LA(1)==103) ) {
1143 zzmatch(103); zzCONSUME
;
1144 predExpr
= predPrimary();
1147 predExpr
->inverted
=!predExpr
->inverted
;
1150 else {zzFAIL(1,zzerr13
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1158 predicate_free(predExpr
);
1159 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1160 zzresynch(setwd3
, 0x80);
1176 zzmatch(116); zzCONSUME
;
1178 lexclass(mystrdup(LATEXT(1)));
1185 CannotContinue
=TRUE
;
1186 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1187 zzresynch(setwd4
, 0x1);
1202 char *t
=NULL
; ECnode
*e
; int go
=1; TermEntry
*p
;
1203 zzmatch(117); zzCONSUME
;
1209 if ( (LA(1)==TokenTerm
) ) {
1211 t
=mystrdup(LATEXT(1));
1216 if ( (LA(1)==QuotedTerm
) ) {
1217 zzmatch(QuotedTerm
);
1218 t
=mystrdup(LATEXT(1));
1222 else {zzFAIL(1,zzerr14
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1228 require(e
!=NULL
, "cannot allocate error class node");
1229 e
->lexclass
= CurrentLexClass
;
1230 if ( Tnum( (t
=StripQuotes(t
)) ) == 0 )
1232 if ( hash_get(Texpr
, t
) != NULL
)
1233 warn(eMsg1("errclass name conflicts with regular expression '%s'",t
));
1234 e
->tok
= addTname( t
);
1235 set_orel(e
->tok
, &imag_tokens
);
1236 require((p
=(TermEntry
*)hash_get(Tname
, t
)) != NULL
,
1237 "hash table mechanism is broken");
1238 p
->classname
= 1; /* entry is errclass name, not token */
1239 list_add(&eclasses
, (char *)e
);
1243 warn(eMsg1("redefinition of errclass or conflict w/token or tokclass '%s'; ignored",t
));
1247 zzmatch(102); zzCONSUME
;
1252 if ( (LA(1)==NonTerminal
) ) {
1253 zzmatch(NonTerminal
);
1254 if ( go
) t
=mystrdup(LATEXT(1));
1259 if ( (LA(1)==TokenTerm
) ) {
1261 if ( go
) t
=mystrdup(LATEXT(1));
1266 if ( (LA(1)==QuotedTerm
) ) {
1267 zzmatch(QuotedTerm
);
1268 if ( go
) t
=mystrdup(LATEXT(1));
1272 else {zzFAIL(1,zzerr15
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1278 if ( go
) list_add(&(e
->elist
), t
);
1283 while ( (setwd4
[LA(1)]&0x2) ) {
1288 if ( (LA(1)==NonTerminal
) ) {
1289 zzmatch(NonTerminal
);
1290 if ( go
) t
=mystrdup(LATEXT(1));
1295 if ( (LA(1)==TokenTerm
) ) {
1297 if ( go
) t
=mystrdup(LATEXT(1));
1302 if ( (LA(1)==QuotedTerm
) ) {
1303 zzmatch(QuotedTerm
);
1304 if ( go
) t
=mystrdup(LATEXT(1));
1308 else {zzFAIL(1,zzerr16
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1314 if ( go
) list_add(&(e
->elist
), t
);
1320 zzmatch(98); zzCONSUME
;
1325 CannotContinue
=TRUE
;
1326 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1327 zzresynch(setwd4
, 0x4);
1342 char *t
=NULL
; TCnode
*e
; int go
=1,tok
,totok
; TermEntry
*p
, *term
, *toterm
;
1343 char *akaString
=NULL
; int save_file
; int save_line
;
1345 zzmatch(118); zzCONSUME
;
1347 t
=mystrdup(LATEXT(1));
1351 require(e
!=NULL
, "cannot allocate token class node");
1352 e
->lexclass
= CurrentLexClass
;
1353 if ( Tnum( t
) == 0 )
1355 e
->tok
= addTname( t
);
1356 set_orel(e
->tok
, &imag_tokens
);
1357 set_orel(e
->tok
, &tokclasses
);
1358 require((p
=(TermEntry
*)hash_get(Tname
, t
)) != NULL
,
1359 "hash table mechanism is broken");
1360 p
->classname
= 1; /* entry is class name, not token */
1361 p
->tclass
= e
; /* save ptr to this tclass def */
1362 list_add(&tclasses
, (char *)e
);
1366 warn(eMsg1("redefinition of tokclass or conflict w/token '%s'; ignored",t
));
1374 if ( (LA(1)==114) ) {
1375 zzmatch(114); zzCONSUME
;
1376 zzmatch(QuotedTerm
);
1377 akaString
=mystrdup(StripQuotes(LATEXT(1)));
1378 /* MR11 */ save_file
=CurFile
;save_line
=zzline
;
1382 zzmatch(115); zzCONSUME
;
1385 if ( (LA(1)==102) ) {
1387 else {zzFAIL(1,zzerr17
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1393 /* MR23 */ if (p
!= NULL
&& akaString
!= NULL
) {
1394 /* MR23 */ if (p
->akaString
!= NULL
) {
1395 /* MR23 */ if (strcmp(p
->akaString
,akaString
) != 0) {
1396 /* MR23 */ warnFL(eMsg2("this #tokclass statment conflicts with a previous #tokclass %s(\"%s\") statement",
1397 /* MR23 */ t
,p
->akaString
),
1398 /* MR23 */ FileStr
[save_file
],save_line
);
1401 /* MR23 */ p
->akaString
=akaString
;
1405 zzmatch(102); zzCONSUME
;
1416 if ( (LA(1)==TokenTerm
) ) {
1419 term
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
1420 if ( term
==NULL
&& UserDefdTokens
) {
1421 err("implicit token definition not allowed with #tokdefs");
1424 else {t
=mystrdup(LATEXT(1)); tok
=addTname(LATEXT(1));}
1432 if ( (LA(1)==119) ) {
1433 zzmatch(119); zzCONSUME
;
1436 toterm
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
1437 if ( toterm
==NULL
&& UserDefdTokens
) {
1438 err("implicit token definition not allowed with #tokdefs");
1441 totext
=mystrdup(LATEXT(1)); totok
=addTname(LATEXT(1));
1448 if ( (setwd4
[LA(1)]&0x8) ) {
1450 else {zzFAIL(1,zzerr18
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1457 if ( (LA(1)==QuotedTerm
) ) {
1458 zzmatch(QuotedTerm
);
1460 term
= (TermEntry
*) hash_get(Texpr
, LATEXT(1));
1461 if ( term
==NULL
&& UserDefdTokens
) {
1462 err("implicit token definition not allowed with #tokdefs");
1465 else {t
=mystrdup(LATEXT(1)); tok
=addTexpr(LATEXT(1));}
1470 else {zzFAIL(1,zzerr19
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1476 if (totext
== NULL
) {
1477 list_add(&(e
->tlist
), t
);
1479 list_add(&(e
->tlist
),"..");
1480 list_add(&(e
->tlist
),t
);
1481 list_add(&(e
->tlist
),totext
);
1486 } while ( (setwd4
[LA(1)]&0x10) );
1490 zzmatch(98); zzCONSUME
;
1495 CannotContinue
=TRUE
;
1496 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1497 zzresynch(setwd4
, 0x20);
1512 char *t
=NULL
, *e
=NULL
, *a
=NULL
; int tnum
=0;
1513 char *akaString
=NULL
; TermEntry
*te
;int save_file
=0,save_line
=0;
1515 tokenActionActive
=1;
1522 if ( (LA(1)==TokenTerm
) ) {
1524 t
=mystrdup(LATEXT(1));
1531 if ( (LA(1)==114) ) {
1532 zzmatch(114); zzCONSUME
;
1533 zzmatch(QuotedTerm
);
1534 akaString
=mystrdup(StripQuotes(LATEXT(1)));
1535 /* MR11 */ save_file
=CurFile
;save_line
=zzline
;
1539 zzmatch(115); zzCONSUME
;
1542 if ( (setwd4
[LA(1)]&0x40) ) {
1544 else {zzFAIL(1,zzerr20
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1553 if ( (LA(1)==121) ) {
1554 zzmatch(121); zzCONSUME
;
1556 tnum
= atoi(LATEXT(1));
1561 if ( (setwd4
[LA(1)]&0x80) ) {
1563 else {zzFAIL(1,zzerr21
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1570 if ( (setwd5
[LA(1)]&0x1) ) {
1572 else {zzFAIL(1,zzerr22
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1581 if ( (LA(1)==QuotedTerm
) ) {
1582 zzmatch(QuotedTerm
);
1583 e
=mystrdup(LATEXT(1));
1588 if ( (setwd5
[LA(1)]&0x2) ) {
1590 else {zzFAIL(1,zzerr23
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1599 if ( (LA(1)==Action
) ) {
1602 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
1603 require(a
!=NULL
, "rule token: cannot allocate action");
1604 strcpy(a
, LATEXT(1));
1609 if ( (setwd5
[LA(1)]&0x4) ) {
1611 else {zzFAIL(1,zzerr24
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1620 if ( (LA(1)==107) ) {
1621 zzmatch(107); zzCONSUME
;
1624 if ( (setwd5
[LA(1)]&0x8) ) {
1626 else {zzFAIL(1,zzerr25
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1631 chkToken(t
, e
, a
, tnum
);
1633 te
=(TermEntry
*)hash_get(Tname
,t
);
1634 if (te
!= NULL
&& akaString
!= NULL
) {
1635 if (te
->akaString
!= NULL
) {
1636 if (strcmp(te
->akaString
,akaString
) != 0) {
1637 warnFL(eMsg2("this #token statment conflicts with a previous #token %s(\"%s\") statement",
1639 FileStr
[save_file
],save_line
);
1642 te
->akaString
=akaString
;
1650 CannotContinue
=TRUE
;
1651 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1652 zzresynch(setwd5
, 0x10);
1658 block(set
* toksrefd
,set
* rulesrefd
)
1660 block(toksrefd
,rulesrefd
)
1672 int saveinalt
= inAlt
;
1675 * rulesrefd
= empty
;
1676 set_clr(AST_nodes_refd_in_actions
);
1678 /* MR23 */ CurBlockID_array
[BlkLevel
] = CurBlockID
;
1680 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
1681 saveblah
= attribsRefdFromAction
;
1682 attribsRefdFromAction
= empty
;
1683 alt( toksrefd
,rulesrefd
);
1684 b
= g
= zzaArg(zztasp1
,1);
1686 if ( ((Junction
*)g
.left
)->p1
->ntype
== nAction
)
1688 ActionNode
*actionNode
=(ActionNode
*)
1689 ( ( (Junction
*)g
.left
) ->p1
);
1690 if (!actionNode
->is_predicate
)
1692 actionNode
->init_action
= TRUE
;
1693 /* MR12c */ if (actionNode
->noHoist
) {
1694 /* MR12c */ errFL("<<nohoist>> appears as init-action - use <<>> <<nohoist>>",
1695 /* MR12c */ FileStr
[actionNode
->file
],actionNode
->line
);
1699 ((Junction
*)g
.left
)->blockid
= CurBlockID
;
1704 while ( (LA(1)==133) ) {
1705 eg
= exception_group();
1709 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/
1710 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/
1711 list_add(&CurExGroups
, (void *)eg
);
1719 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
1724 while ( (LA(1)==123) ) {
1729 alt( toksrefd
,rulesrefd
);
1730 g
= Or(g
, zzaArg(zztasp2
,2));
1732 ((Junction
*)g
.left
)->blockid
= CurBlockID
;
1737 while ( (LA(1)==133) ) {
1738 eg
= exception_group();
1742 /* MR7 ***** eg->altID = makeAltID(CurBlockID,CurAltNum); *****/
1743 /* MR7 ***** CurAltStart->exception_label = eg->altID; *****/
1744 list_add(&CurExGroups
, (void *)eg
);
1752 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
1758 zzaArg(zztasp1
,0) = b
;
1759 attribsRefdFromAction
= saveblah
; inAlt
= saveinalt
;
1764 CannotContinue
=TRUE
;
1765 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1766 zzresynch(setwd5
, 0x20);
1772 alt(set
* toksrefd
,set
* rulesrefd
)
1774 alt(toksrefd
,rulesrefd
)
1783 int n
=0; Graph g
; int e_num
=0, old_not
=0; Node
*node
; set elems
, dif
;
1784 int first_on_line
= 1, use_def_MT_handler
= 0;
1785 g
.left
=NULL
; g
.right
=NULL
;
1794 if ( (LA(1)==88) ) {
1796 use_def_MT_handler
= 1;
1801 if ( (setwd5
[LA(1)]&0x40) ) {
1803 else {zzFAIL(1,zzerr26
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1813 while ( (setwd5
[LA(1)]&0x80) ) {
1819 if ( (LA(1)==124) ) {
1826 if ( (setwd6
[LA(1)]&0x1) ) {
1828 else {zzFAIL(1,zzerr27
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
1833 node
= element( old_not
, first_on_line
, use_def_MT_handler
);
1835 if ( node
!=NULL
&& node
->ntype
!=nAction
) first_on_line
= 0;
1837 if ( zzaArg(zztasp2
,2 ).left
!=NULL
) {
1838 g
= Cat(g
, zzaArg(zztasp2
,2));
1841 if ( node
->ntype
!=nAction
) e_num
++;
1842 /* record record number of all rule and token refs */
1843 if ( node
->ntype
==nToken
) {
1844 TokNode
*tk
= (TokNode
*)((Junction
*)zzaArg(zztasp2
,2 ).left
)->p1
;
1846 set_orel(e_num
, &elems
);
1848 else if ( node
->ntype
==nRuleRef
) {
1849 RuleRefNode
*rn
= (RuleRefNode
*)((Junction
*)zzaArg(zztasp2
,2 ).left
)->p1
;
1851 set_orel(e_num
, rulesrefd
);
1860 if ( n
== 0 ) g
= emptyAlt();
1861 zzaArg(zztasp1
,0) = g
;
1862 /* We want to reduce number of LT(i) calls and the number of
1863 * local attribute variables in C++ mode (for moment, later we'll
1864 * do for C also). However, if trees are being built, they
1865 * require most of the attrib variables to create the tree nodes
1866 * with; therefore, we gen a token ptr for each token ref in C++
1868 if ( GenCC
&& !GenAST
)
1870 /* This now free's the temp set -ATG 5/6/95 */
1872 temp
= set_and(elems
, attribsRefdFromAction
);
1873 set_orin( toksrefd
, temp
);
1876 else set_orin( toksrefd
, elems
);
1878 dif
= set_dif(attribsRefdFromAction
, elems
);
1879 if ( set_deg(dif
)>0 )
1880 err("one or more $i in action(s) refer to non-token elements");
1884 set_free(attribsRefdFromAction
);
1890 CannotContinue
=TRUE
;
1891 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1892 zzresynch(setwd6
, 0x2);
1906 PCCTS_PURIFY(_retv
,sizeof(LabelEntry
* ))
1909 TermEntry
*t
=NULL
; LabelEntry
*l
=NULL
; RuleEntry
*r
=NULL
; char *lab
;
1911 lab
= mystrdup(LATEXT(1));
1915 UsedNewStyleLabel
= 1;
1916 if ( UsedOldStyleAttrib
) err("cannot mix with new-style labels with old-style $i");
1917 t
= (TermEntry
*) hash_get(Tname
, lab
);
1918 if ( t
==NULL
) t
= (TermEntry
*) hash_get(Texpr
, lab
);
1919 if ( t
==NULL
) r
= (RuleEntry
*) hash_get(Rname
, lab
);
1921 err(eMsg1("label definition clashes with token/tokclass definition: '%s'", lab
));
1924 else if ( r
!=NULL
) {
1925 err(eMsg1("label definition clashes with rule definition: '%s'", lab
));
1929 /* we don't clash with anybody else */
1930 l
= (LabelEntry
*) hash_get(Elabel
, lab
);
1931 if ( l
==NULL
) { /* ok to add new element label */
1932 l
= (LabelEntry
*)hash_add(Elabel
,
1934 (Entry
*)newLabelEntry(lab
));
1935 /* add to list of element labels for this rule */
1936 list_add(&CurElementLabels
, (void *)lab
);
1937 /* MR7 */ leAdd(l
); /* list of labels waiting for exception group definitions */
1941 err(eMsg1("label definitions must be unique per rule: '%s'", lab
));
1945 zzmatch(106); zzCONSUME
;
1950 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
1951 zzresynch(setwd6
, 0x4);
1958 element(int old_not
,int first_on_line
,int use_def_MT_handler
)
1960 element(old_not
,first_on_line
,use_def_MT_handler
)
1963 int use_def_MT_handler
;
1969 PCCTS_PURIFY(_retv
,sizeof(Node
* ))
1974 Predicate
*pred
= NULL
;
1975 int local_use_def_MT_handler
=0;
1978 set toksrefd
, rulesrefd
;
1980 TokNode
*p
=NULL
; RuleRefNode
*q
; int approx
=0;
1981 LabelEntry
*label
=NULL
;
1985 int height
; /* MR11 */
1986 int equal_height
; /* MR11 */
1988 char* pFirstSetSymbol
= NULL
; /* MR21 */
1991 if ( (setwd6
[LA(1)]&0x8) ) {
1996 if ( (LA(1)==LABEL
) ) {
1997 label
= element_label();
2001 if ( (setwd6
[LA(1)]&0x10) ) {
2003 else {zzFAIL(1,zzerr28
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2012 if ( (LA(1)==TokenTerm
) ) {
2015 term
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
2016 if ( term
==NULL
&& UserDefdTokens
) {
2017 err("implicit token definition not allowed with #tokdefs");
2018 zzaRet
.left
= zzaRet
.right
= NULL
;
2021 zzaRet
= buildToken(LATEXT(1));
2022 p
=((TokNode
*)((Junction
*)zzaRet
.left
)->p1
);
2023 term
= (TermEntry
*) hash_get(Tname
, LATEXT(1));
2024 require( term
!= NULL
, "hash table mechanism is broken");
2025 p
->tclass
= term
->tclass
;
2026 p
->complement
= old_not
;
2027 if ( label
!=NULL
) {
2028 p
->el_label
= label
->str
;
2029 label
->elem
= (Node
*)p
;
2038 if ( (LA(1)==119) ) {
2039 zzmatch(119); zzCONSUME
;
2044 if ( (LA(1)==QuotedTerm
) ) {
2045 zzmatch(QuotedTerm
);
2046 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2051 if ( (LA(1)==TokenTerm
) ) {
2053 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2057 else {zzFAIL(1,zzerr29
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2064 if ( (setwd6
[LA(1)]&0x20) ) {
2066 else {zzFAIL(1,zzerr30
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2072 if ( p
!=NULL
&& (p
->upper_range
!=0 || p
->tclass
|| old_not
) )
2073 list_add(&MetaTokenNodes
, (void *)p
);
2078 if ( (LA(1)==125) ) {
2080 if ( p
!=NULL
) p
->astnode
=ASTroot
;
2085 if ( (setwd6
[LA(1)]&0x40) ) {
2086 if ( p
!=NULL
) p
->astnode
=ASTchild
;
2089 if ( (LA(1)==103) ) {
2091 if ( p
!=NULL
) p
->astnode
=ASTexclude
;
2095 else {zzFAIL(1,zzerr31
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2105 if ( (LA(1)==88) ) {
2107 local_use_def_MT_handler
= 1;
2112 if ( (setwd6
[LA(1)]&0x80) ) {
2114 else {zzFAIL(1,zzerr32
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2120 if ( p
!=NULL
&& first_on_line
) {
2121 CurAltStart
= (Junction
*)zzaRet
.left
;
2122 altAdd(CurAltStart
); /* MR7 */
2123 p
->altstart
= CurAltStart
;
2126 p
->use_def_MT_handler
= use_def_MT_handler
|| local_use_def_MT_handler
;
2130 if ( (LA(1)==QuotedTerm
) ) {
2131 zzmatch(QuotedTerm
);
2133 term
= (TermEntry
*) hash_get(Texpr
, LATEXT(1));
2134 if ( term
==NULL
&& UserDefdTokens
) {
2135 err("implicit token definition not allowed with #tokdefs");
2136 zzaRet
.left
= zzaRet
.right
= NULL
;
2139 zzaRet
= buildToken(LATEXT(1)); p
=((TokNode
*)((Junction
*)zzaRet
.left
)->p1
);
2140 p
->complement
= old_not
;
2141 if ( label
!=NULL
) {
2142 p
->el_label
= label
->str
;
2143 label
->elem
= (Node
*)p
;
2152 if ( (LA(1)==119) ) {
2153 zzmatch(119); zzCONSUME
;
2158 if ( (LA(1)==QuotedTerm
) ) {
2159 zzmatch(QuotedTerm
);
2160 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2165 if ( (LA(1)==TokenTerm
) ) {
2167 if ( p
!=NULL
) setUpperRange(p
, LATEXT(1));
2171 else {zzFAIL(1,zzerr33
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2178 if ( (setwd7
[LA(1)]&0x1) ) {
2180 else {zzFAIL(1,zzerr34
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2189 if ( (LA(1)==125) ) {
2191 if ( p
!=NULL
) p
->astnode
=ASTroot
;
2196 if ( (setwd7
[LA(1)]&0x2) ) {
2197 if ( p
!=NULL
) p
->astnode
=ASTchild
;
2200 if ( (LA(1)==103) ) {
2202 if ( p
!=NULL
) p
->astnode
=ASTexclude
;
2206 else {zzFAIL(1,zzerr35
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2216 if ( (LA(1)==88) ) {
2218 local_use_def_MT_handler
= 1;
2223 if ( (setwd7
[LA(1)]&0x4) ) {
2225 else {zzFAIL(1,zzerr36
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2231 if ( p
!=NULL
&& (p
->upper_range
!=0 || p
->tclass
|| old_not
) )
2232 list_add(&MetaTokenNodes
, (void *)p
);
2234 if ( first_on_line
) {
2235 CurAltStart
= (Junction
*)zzaRet
.left
;
2236 altAdd(CurAltStart
); /* MR7 */
2237 p
->altstart
= CurAltStart
;
2240 p
->use_def_MT_handler
= use_def_MT_handler
|| local_use_def_MT_handler
;
2244 if ( (LA(1)==WildCard
) ) {
2245 if ( old_not
) warn("~ WILDCARD is an undefined operation (implies 'nothing')");
2247 zzaRet
= buildWildCard(LATEXT(1)); p
=((TokNode
*)((Junction
*)zzaRet
.left
)->p1
);
2254 if ( (LA(1)==125) ) {
2261 if ( (setwd7
[LA(1)]&0x8) ) {
2262 p
->astnode
=ASTchild
;
2265 if ( (LA(1)==103) ) {
2267 p
->astnode
=ASTexclude
;
2271 else {zzFAIL(1,zzerr37
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2277 list_add(&MetaTokenNodes
, (void *)p
);
2279 if ( first_on_line
) {
2280 CurAltStart
= (Junction
*)zzaRet
.left
;
2281 altAdd(CurAltStart
); /* MR7 */
2282 p
->altstart
= CurAltStart
;
2283 if ( label
!=NULL
) {
2284 p
->el_label
= label
->str
;
2285 label
->elem
= (Node
*)p
;
2291 if ( (LA(1)==NonTerminal
) ) {
2292 if ( old_not
) warn("~ NONTERMINAL is an undefined operation");
2293 zzmatch(NonTerminal
);
2294 zzaRet
= buildRuleRef(LATEXT(1));
2301 if ( (LA(1)==103) ) {
2303 q
= (RuleRefNode
*) ((Junction
*)zzaRet
.left
)->p1
;
2304 q
->astnode
=ASTexclude
;
2309 if ( (setwd7
[LA(1)]&0x10) ) {
2311 else {zzFAIL(1,zzerr38
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2320 if ( (setwd7
[LA(1)]&0x20) ) {
2325 if ( (LA(1)==104) ) {
2326 zzmatch(104); zzCONSUME
;
2329 if ( (LA(1)==PassAction
) ) {
2331 else {zzFAIL(1,zzerr39
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2336 zzmatch(PassAction
);
2337 addParm(((Junction
*)zzaRet
.left
)->p1
, LATEXT(1));
2342 if ( (setwd7
[LA(1)]&0x40) ) {
2344 else {zzFAIL(1,zzerr40
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2349 rr
=(RuleRefNode
*) ((Junction
*)zzaRet
.left
)->p1
;
2355 if ( (LA(1)==105) ) {
2356 zzmatch(105); zzCONSUME
;
2357 zzmatch(PassAction
);
2359 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2360 require(a
!=NULL
, "rule element: cannot allocate assignment");
2361 strcpy(a
, LATEXT(1));
2367 if ( (setwd7
[LA(1)]&0x80) ) {
2369 else {zzFAIL(1,zzerr41
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2375 if ( label
!=NULL
) {
2376 rr
->el_label
= label
->str
;
2377 label
->elem
= (Node
*)rr
;
2379 if ( first_on_line
) {
2380 CurAltStart
= (Junction
*)zzaRet
.left
;
2381 altAdd(CurAltStart
); /* MR7 */
2382 ((RuleRefNode
*)((Junction
*)zzaRet
.left
)->p1
)->altstart
= CurAltStart
;
2386 else {zzFAIL(1,zzerr42
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2395 if ( (LA(1)==Action
) ) {
2396 if ( old_not
) warn("~ ACTION is an undefined operation");
2398 zzaArg(zztasp1
,0) = buildAction(LATEXT(1),action_file
,action_line
, 0);
2401 if ( first_on_line
) { /* MR7 */
2402 CurAltStart
= (Junction
*)zzaArg(zztasp1
,0 ).left
; /* MR7 */
2403 altAdd(CurAltStart
); /* MR7 */
2405 _retv
= (Node
*) ((Junction
*)zzaArg(zztasp1
,0 ).left
)->p1
;
2408 if ( (LA(1)==Pred
) ) {
2409 if ( old_not
) warn("~ SEMANTIC-PREDICATE is an undefined operation");
2411 zzaArg(zztasp1
,0) = buildAction(LATEXT(1),action_file
,action_line
, 1);
2414 act
= (ActionNode
*) ((Junction
*)zzaArg(zztasp1
,0 ).left
)->p1
;
2415 if (numericActionLabel
) { /* MR10 */
2416 list_add(&NumericPredLabels
,act
); /* MR10 */
2417 numericActionLabel
=0; /* MR10 */
2424 if ( (LA(1)==PassAction
) ) {
2425 zzmatch(PassAction
);
2427 a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2428 require(a
!=NULL
, "rule element: cannot allocate predicate fail action");
2429 strcpy(a
, LATEXT(1));
2435 if ( (setwd8
[LA(1)]&0x1) ) {
2437 else {zzFAIL(1,zzerr43
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2442 if ( first_on_line
) { /* MR7 */
2443 CurAltStart
= (Junction
*)zzaArg(zztasp1
,0 ).left
; /* MR7 */
2444 altAdd(CurAltStart
); /* MR7 */
2446 _retv
= (Node
*)act
;
2449 if ( (setwd8
[LA(1)]&0x2) ) {
2450 if ( old_not
) warn("~ BLOCK is an undefined operation");
2452 if (BlkLevel
>= MAX_BLK_LEVEL
) fatal("Blocks nested too deeply");
2453 /* MR23 */ CurBlockID_array
[BlkLevel
] = CurBlockID
;
2454 /* MR23 */ CurAltNum_array
[BlkLevel
] = CurAltNum
;
2459 if ( (LA(1)==Pragma
) ) {
2460 zzmatch(Pragma
); zzCONSUME
;
2465 if ( (LA(1)==126) ) {
2472 if ( (LA(1)==127) ) {
2479 if ( (LA(1)==128) ) {
2485 else {zzFAIL(1,zzerr44
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2493 if ( (setwd8
[LA(1)]&0x4) ) {
2495 else {zzFAIL(1,zzerr45
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2504 if ( (LA(1)==FirstSetSymbol
) ) {
2505 zzmatch(FirstSetSymbol
); zzCONSUME
;
2506 zzmatch(114); zzCONSUME
;
2511 if ( (LA(1)==NonTerminal
) ) {
2512 zzmatch(NonTerminal
);
2514 /* MR21 */ pFirstSetSymbol
= (char *) calloc(strlen(LATEXT(1))+1,
2515 /* MR21 */ sizeof(char));
2516 /* MR21 */ require(pFirstSetSymbol
!=NULL
,
2517 /* MR21 */ "cannot allocate first set name");
2518 /* MR21 */ strcpy(pFirstSetSymbol
, LATEXT(1));
2524 if ( (LA(1)==TokenTerm
) ) {
2527 /* MR21 */ pFirstSetSymbol
= (char *) calloc(strlen(LATEXT(1))+1,
2528 /* MR21 */ sizeof(char));
2529 /* MR21 */ require(pFirstSetSymbol
!=NULL
,
2530 /* MR21 */ "cannot allocate first set name");
2531 /* MR21 */ strcpy(pFirstSetSymbol
, LATEXT(1));
2536 else {zzFAIL(1,zzerr46
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2541 zzmatch(115); zzCONSUME
;
2544 if ( (setwd8
[LA(1)]&0x8) ) {
2546 else {zzFAIL(1,zzerr47
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2555 if ( (LA(1)==114) ) {
2556 zzmatch(114); zzCONSUME
;
2557 block( &toksrefd
,&rulesrefd
);
2559 blk
= zzaRet
= zzaArg(zztasp2
,2);
2560 /* MR23 */ CurBlockID_array
[BlkLevel
] = (-1);
2561 /* MR23 */ CurAltNum_array
[BlkLevel
] = (-1);
2569 if ( (LA(1)==129) ) {
2571 zzaRet
= makeLoop(zzaRet
,approx
,pFirstSetSymbol
);
2576 if ( (LA(1)==130) ) {
2578 zzaRet
= makePlus(zzaRet
,approx
,pFirstSetSymbol
);
2583 if ( (LA(1)==131) ) {
2584 zzmatch(131); zzCONSUME
;
2589 if ( (setwd8
[LA(1)]&0x10) ) {
2594 if ( (LA(1)==132) ) {
2601 if ( (LA(1)==113) ) {
2607 else {zzFAIL(1,zzerr48
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2613 zzaRet
= buildAction(LATEXT(1),action_file
,action_line
,1);
2616 act
= (ActionNode
*) ((Junction
*)zzaRet
.left
)->p1
;
2617 semDepth
=predicateLookaheadDepth(act
);
2618 if (numericActionLabel
) { /* MR10 */
2619 list_add(&NumericPredLabels
,act
); /* MR10 */
2620 numericActionLabel
=0; /* MR10 */
2627 if ( (LA(1)==PassAction
) ) {
2628 zzmatch(PassAction
);
2630 a
= (char *)calloc(strlen(LATEXT(1))+1, sizeof(char));
2631 require(a
!=NULL
, "rule element: cannot allocate predicate fail action");
2632 strcpy(a
, LATEXT(1));
2638 if ( (setwd8
[LA(1)]&0x20) ) {
2640 else {zzFAIL(1,zzerr49
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2645 if ( first_on_line
) { /* MR7 */
2646 CurAltStart
=(Junction
*)zzaRet
.left
; /* MR7 */
2647 altAdd(CurAltStart
); /* MR7 */
2649 _retv
= (Node
*)act
;
2651 pred
= computePredFromContextGuard(blk
,&predMsgDone
); /* MR10 */
2652 if ( pred
==NULL
) { /* MR10 */
2653 if ( !predMsgDone
) err("invalid or missing context guard"); /* MR10 */
2654 predMsgDone
=1; /* MR10 */
2656 act
->guardNodes
=(Junction
*)blk
.left
; /* MR11 */
2657 pred
->expr
= act
->action
;
2659 /* MR10 */ pred
->ampersandStyle
= ampersandStyle
; /* 0 means (g)? => ... 1 means (g)? && ... */
2660 /* MR13 */ if (pred
->tcontext
!= NULL
) {
2661 /* MR13 */ height
=MR_max_height_of_tree(pred
->tcontext
);
2662 /* MR13 */ equal_height
=MR_all_leaves_same_height(pred
->tcontext
,height
);
2663 /* MR13 */ if (! equal_height
) {
2664 /* MR13 */ errFL("in guarded predicates all tokens in the guard must be at the same height",
2665 /* MR13 */ FileStr
[act
->file
],act
->line
);
2668 /* MR10 */ if (ampersandStyle
) {
2669 /* MR10 */ act
->ampersandPred
= pred
;
2670 /* MR11 */ if (! HoistPredicateContext
) {
2671 /* MR11 */ errFL("without \"-prc on\" (guard)? && <<pred>>? ... doesn't make sense",
2672 /* MR11 */ FileStr
[act
->file
],act
->line
);
2675 /* MR10 */ act
->guardpred
= pred
;
2677 /* MR10 */ if (pred
->k
!= semDepth
) {
2678 /* MR10 */ warn(eMsgd2("length of guard (%d) does not match the length of semantic predicate (%d)",
2679 /* MR10 */ pred
->k
,semDepth
));
2684 if ( (setwd8
[LA(1)]&0x40) ) {
2685 zzaRet
= makeBlk(zzaRet
,approx
,pFirstSetSymbol
);
2687 ((Junction
*) ((Junction
*)zzaRet
.left
)->p1
)->guess
=1;
2688 if ( ! first_on_line
) {
2689 err("(...)? predicate must be first element of production");
2692 else {zzFAIL(1,zzerr50
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2699 if ( (setwd8
[LA(1)]&0x80) ) {
2700 zzaRet
= makeBlk(zzaRet
,approx
,pFirstSetSymbol
);
2702 else {zzFAIL(1,zzerr51
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2710 if ( pred
==NULL
&& !predMsgDone
) { /* MR10 */
2711 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->blockid
= CurBlockID
;
2712 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->tokrefs
= toksrefd
;
2713 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->rulerefs
= rulesrefd
;
2714 if ( first_on_line
) { /* MR7 */
2715 CurAltStart
= (Junction
*)((Junction
*)((Junction
*)zzaRet
.left
)->p1
); /* MR7 */
2716 altAdd(CurAltStart
); /* MR7 */
2718 _retv
= (Node
*) ((Junction
*)zzaRet
.left
)->p1
;
2722 if ( (LA(1)==102) ) {
2723 zzmatch(102); zzCONSUME
;
2724 block( &toksrefd
,&rulesrefd
);
2725 zzaRet
= makeOpt(zzaArg(zztasp2
,2),approx
,pFirstSetSymbol
);
2726 /* MR23 */ CurBlockID_array
[BlkLevel
] = (-1);
2727 /* MR23 */ CurAltNum_array
[BlkLevel
] = (-1);
2731 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->blockid
= CurBlockID
;
2732 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->tokrefs
= toksrefd
;
2733 ((Junction
*)((Junction
*)zzaRet
.left
)->p1
)->rulerefs
= rulesrefd
;
2736 if ( first_on_line
) { /* MR7 */
2737 CurAltStart
= (Junction
*) ((Junction
*)((Junction
*)zzaRet
.left
)->p1
); /* MR7 */
2738 altAdd(CurAltStart
); /* MR7 */
2740 _retv
= (Node
*) ((Junction
*)zzaRet
.left
)->p1
;
2742 else {zzFAIL(1,zzerr52
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2749 if ( (LA(1)==129) ) {
2751 warn("don't you want a ')' with that '*'?"); CannotContinue
=TRUE
;
2756 if ( (LA(1)==130) ) {
2758 warn("don't you want a ')' with that '+'?"); CannotContinue
=TRUE
;
2763 if ( (LA(1)==105) ) {
2765 warn("'>' can only appear after a nonterminal"); CannotContinue
=TRUE
;
2770 if ( (LA(1)==PassAction
) ) {
2771 zzmatch(PassAction
);
2772 warn("[...] out of context 'rule > [...]'");
2773 CannotContinue
=TRUE
;
2777 else {zzFAIL(1,zzerr53
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2789 CannotContinue
=TRUE
;
2790 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
2791 zzresynch(setwd9
, 0x1);
2798 default_exception_handler(void)
2800 default_exception_handler()
2807 DefaultExGroup
= exception_group();
2813 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
2814 zzresynch(setwd9
, 0x2);
2820 exception_group(void)
2825 ExceptionGroup
* _retv
;
2828 PCCTS_PURIFY(_retv
,sizeof(ExceptionGroup
* ))
2831 ExceptionHandler
*h
; LabelEntry
*label
=NULL
; /* MR6 */
2832 FoundException
= 1; FoundExceptionGroup
= 1;
2834 _retv
= (ExceptionGroup
*)calloc(1, sizeof(ExceptionGroup
));
2842 if ( (LA(1)==PassAction
) ) {
2843 zzmatch(PassAction
);
2846 p
[strlen(p
)-1] = '\0'; /* kill trailing space */
2847 label
= (LabelEntry
*) hash_get(Elabel
, LATEXT(1)+1);
2850 err(eMsg1("unknown label in exception handler: '%s'", LATEXT(1)+1));
2856 if ( (setwd9
[LA(1)]&0x4) ) {
2858 else {zzFAIL(1,zzerr54
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2867 while ( (LA(1)==135) ) {
2868 h
= exception_handler();
2870 list_add(&(_retv
->handlers
), (void *)h
);
2880 if ( (LA(1)==134) ) {
2881 zzmatch(134); zzCONSUME
;
2882 zzmatch(106); zzCONSUME
;
2885 ExceptionHandler
*eh
= (ExceptionHandler
*)
2886 calloc(1, sizeof(ExceptionHandler
));
2887 char *a
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2888 require(eh
!=NULL
, "exception: cannot allocate handler");
2889 require(a
!=NULL
, "exception: cannot allocate action");
2890 strcpy(a
, LATEXT(1));
2892 eh
->signalname
= (char *) calloc(strlen("default")+1, sizeof(char));
2893 require(eh
->signalname
!=NULL
, "exception: cannot allocate sig name");
2894 strcpy(eh
->signalname
, "default");
2895 list_add(&(_retv
->handlers
), (void *)eh
);
2901 if ( (setwd9
[LA(1)]&0x8) ) {
2903 else {zzFAIL(1,zzerr55
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
2909 if ( label
!=NULL
) {
2910 /* Record ex group in sym tab for this label */
2911 if ( label
->ex_group
!=NULL
) {
2912 err(eMsg1("duplicate exception handler for label '%s'",label
->str
));
2914 label
->ex_group
= _retv
;
2915 /* Label the exception group itself */
2916 _retv
->label
= label
->str
;
2917 /* Make the labelled element pt to the exception also */
2918 /* MR6 */ if (label
->elem
== NULL
) {
2919 /* MR6 */ err(eMsg1("reference in exception handler to undefined label '%s'",label
->str
));
2921 switch ( label
->elem
->ntype
) {
2924 RuleRefNode
*r
= (RuleRefNode
*)label
->elem
;
2925 r
->ex_group
= _retv
;
2930 TokNode
*t
= (TokNode
*)label
->elem
;
2931 t
->ex_group
= _retv
;
2935 /* MR6 */ }; /* end test on label->elem */
2936 } /* end test on label->ex_group */
2938 } /* end test on exception label */
2941 /* MR7 */ if (BlkLevel
== 1 && label
== NULL
) {
2942 /* MR7 */ _retv
->forRule
=1;
2943 /* MR7 */ } else if (label
== NULL
) {
2944 /* MR7 */ _retv
->altID
= makeAltID(CurBlockID_array
[BlkLevel
], CurAltNum_array
[BlkLevel
]);
2945 /* MR7 */ egAdd(_retv
);
2947 /* MR7 */ _retv
->labelEntry
=label
;
2950 /* MR7 */ /* You may want to remove this exc from the rule list */
2951 /* MR7 */ /* and handle at the labeled element site. */
2953 /* MR7 */ if (label
!= NULL
) {
2954 /* MR7 */ _retv
= NULL
;
2960 CannotContinue
=TRUE
;
2961 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
2962 zzresynch(setwd9
, 0x10);
2969 exception_handler(void)
2974 ExceptionHandler
* _retv
;
2977 PCCTS_PURIFY(_retv
,sizeof(ExceptionHandler
* ))
2983 _retv
= (ExceptionHandler
*)calloc(1, sizeof(ExceptionHandler
));
2984 require(_retv
!=NULL
, "exception: cannot allocate handler");
2991 if ( (LA(1)==NonTerminal
) ) {
2992 zzmatch(NonTerminal
);
2994 _retv
->signalname
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
2995 require(_retv
->signalname
!=NULL
, "exception: cannot allocate sig name");
2996 strcpy(_retv
->signalname
, LATEXT(1));
3001 if ( (LA(1)==TokenTerm
) ) {
3004 _retv
->signalname
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
3005 require(_retv
->signalname
!=NULL
, "exception: cannot allocate sig name");
3006 strcpy(_retv
->signalname
, LATEXT(1));
3010 else {zzFAIL(1,zzerr56
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3015 zzmatch(106); zzCONSUME
;
3020 _retv
->action
= NULL
;
3021 if ( (LA(1)==Action
) ) {
3024 _retv
->action
= (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
3025 require(_retv
->action
!=NULL
, "exception: cannot allocate action");
3026 strcpy(_retv
->action
, LATEXT(1));
3031 if ( (setwd9
[LA(1)]&0x20) ) {
3033 else {zzFAIL(1,zzerr57
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3042 CannotContinue
=TRUE
;
3043 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3044 zzresynch(setwd9
, 0x40);
3051 enum_file(char * fname
)
3061 if ( (setwd9
[LA(1)]&0x80) ) {
3066 if ( (LA(1)==143) ) {
3067 zzmatch(143); zzCONSUME
;
3068 zzmatch(ID
); zzCONSUME
;
3073 if ( (LA(1)==149) ) {
3074 zzmatch(149); zzCONSUME
;
3075 zzmatch(ID
); zzCONSUME
;
3078 if ( (setwd10
[LA(1)]&0x1) ) {
3080 else {zzFAIL(1,zzerr58
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3087 if ( (setwd10
[LA(1)]&0x2) ) {
3089 else {zzFAIL(1,zzerr59
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3098 if ( (LA(1)==151) ) {
3107 } while ( (LA(1)==151) );
3113 if ( (LA(1)==149) ) {
3116 else {zzFAIL(1,zzerr60
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3123 if ( (LA(1)==Eof
) ) {
3125 else {zzFAIL(1,zzerr61
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3131 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3132 zzresynch(setwd10
, 0x4);
3138 defines(char * fname
)
3148 int v
; int maxt
=(-1); char *t
;
3155 zzmatch(149); zzCONSUME
;
3157 t
= mystrdup(LATEXT(1));
3162 v
= atoi(LATEXT(1));
3163 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3165 /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
3166 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */
3167 /* MR2 Don't let #tokdefs be confused by */
3168 /* MR2 DLGminToken and DLGmaxToken */
3170 if ( ! isDLGmaxToken(t
)) { /* MR2 */
3172 if ( v
>maxt
) maxt
=v
;
3173 if ( Tnum( t
) == 0 ) {
3174 addForcedTname( t
, v
);
3176 warnFL(eMsg1("redefinition of token %s; ignored",t
), fname
,zzline
);
3182 } while ( (LA(1)==149) );
3186 TokenNum
= maxt
+ 1;
3191 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3192 zzresynch(setwd10
, 0x8);
3198 enum_def(char * fname
)
3208 int v
= 0; int maxt
=(-1); char *t
;
3209 zzmatch(151); zzCONSUME
;
3210 zzmatch(ID
); zzCONSUME
;
3211 zzmatch(152); zzCONSUME
;
3213 t
= mystrdup(LATEXT(1));
3220 if ( (LA(1)==153) ) {
3221 zzmatch(153); zzCONSUME
;
3228 if ( (setwd10
[LA(1)]&0x10) ) {
3231 else {zzFAIL(1,zzerr62
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3237 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3239 if ( v
>maxt
) maxt
=v
; /* MR3 */
3240 if ( Tnum( t
) == 0 ) addForcedTname( t
, v
);
3242 warnFL(eMsg1("redefinition of token %s; ignored",t
), fname
,zzline
);
3248 while ( (LA(1)==154) ) {
3249 zzmatch(154); zzCONSUME
;
3254 if ( (LA(1)==ID
)&&(isDLGmaxToken(LATEXT(1))) ) {
3255 if (!(isDLGmaxToken(LATEXT(1))) ) {zzfailed_pred(" isDLGmaxToken(LATEXT(1))",0 /* report */, { 0; /* no user action */ } );}
3256 zzmatch(ID
); zzCONSUME
;
3261 if ( (LA(1)==153) ) {
3262 zzmatch(153); zzCONSUME
;
3263 zzmatch(INT
); zzCONSUME
;
3266 if ( (setwd10
[LA(1)]&0x20) ) {
3268 else {zzFAIL(1,zzerr63
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3275 if ( (LA(1)==ID
) ) {
3277 t
= mystrdup(LATEXT(1));
3284 if ( (LA(1)==153) ) {
3285 zzmatch(153); zzCONSUME
;
3292 if ( (setwd10
[LA(1)]&0x40) ) {
3295 else {zzFAIL(1,zzerr64
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3301 /* fprintf(stderr, "#token %s=%d\n", t, v);*/
3303 if ( v
>maxt
) maxt
=v
; /* MR3 */
3304 if ( Tnum( t
) == 0 ) addForcedTname( t
, v
);
3306 warnFL(eMsg1("redefinition of token %s; ignored",t
), fname
,zzline
);
3310 if ( (setwd10
[LA(1)]&0x80) ) {
3312 else {zzFAIL(1,zzerr65
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
3323 zzmatch(155); zzCONSUME
;
3325 TokenNum
= maxt
+ 1;
3332 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
3333 zzresynch(setwd11
, 0x1);
3338 /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
3339 /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs */
3340 /* MR2 Don't let #tokdefs be confused by */
3341 /* MR2 DLGminToken and DLGmaxToken */
3343 /* semantic check on DLGminToken and DLGmaxmaxToken in #tokdefs */
3346 static int isDLGmaxToken(char *Token
)
3348 static int isDLGmaxToken(Token
)
3352 static char checkStr1
[] = "DLGmaxToken";
3353 static char checkStr2
[] = "DLGminToken";
3355 if (strcmp(Token
, checkStr1
) == 0)
3357 else if (strcmp(Token
, checkStr2
) == 0)
3363 /* semantics of #token */
3366 chkToken(char *t
, char *e
, char *a
, int tnum
)
3368 chkToken(t
,e
,a
,tnum
)
3375 /* check to see that they don't try to redefine a token as a token class */
3377 p
= (TermEntry
*) hash_get(Tname
, t
);
3378 if ( p
!=NULL
&& p
->classname
) {
3379 err(eMsg1("redefinition of #tokclass '%s' to #token not allowed; ignored",t
));
3380 if ( a
!=NULL
) free((char *)a
);
3385 if ( t
==NULL
&& e
==NULL
) { /* none found */
3386 err("#token requires at least token name or rexpr");
3388 else if ( t
!=NULL
&& e
!=NULL
) { /* both found */
3389 if ( UserDefdTokens
) { /* if #tokdefs, must not define new */
3390 p
= (TermEntry
*) hash_get(Tname
, t
);
3392 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t
));
3398 if ( hasAction(e
) ) {
3399 err(eMsg1("redefinition of action for %s; ignored",e
));
3401 else setHasAction(e
, a
);
3404 else if ( t
!=NULL
) { /* only one found */
3405 if ( UserDefdTokens
) {
3406 p
= (TermEntry
*) hash_get(Tname
, t
);
3408 err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t
));
3412 if ( Tnum( t
) == 0 ) addTname( t
);
3414 err(eMsg1("redefinition of token %s; ignored",t
));
3417 err(eMsg1("action cannot be attached to a token name (%s); ignored",t
));
3421 else if ( e
!=NULL
) {
3422 if ( Tnum( e
) == 0 ) addTexpr( e
);
3424 if ( hasAction(e
) ) {
3425 err(eMsg1("redefinition of action for expr %s; ignored",e
));
3427 else if ( a
==NULL
) {
3428 err(eMsg1("redefinition of expr %s; ignored",e
));
3431 if ( a
!=NULL
) setHasAction(e
, a
);
3434 /* if a token type number was specified, then add the token ID and 'tnum'
3435 * pair to the ForcedTokens list. (only applies if an id was given)
3437 if ( t
!=NULL
&& tnum
>0 )
3439 if ( set_el(tnum
, reserved_positions
) )
3441 err(eMsgd("a token has already been forced to token number %d; ignored", tnum
));
3445 list_add(&ForcedTokens
, newForcedToken(t
,tnum
));
3446 set_orel(tnum
, &reserved_positions
);
3453 match_token(char *s
, char **nxt
)
3460 if ( !(*s
>='A' && *s
<='Z') ) return 0;
3462 while ( (*s
>='a' && *s
<='z') ||
3463 (*s
>='A' && *s
<='Z') ||
3464 (*s
>='0' && *s
<='9') ||
3469 if ( *s
!=' ' && *s
!='}' ) return 0;
3476 match_rexpr(char *s
, char **nxt
)
3483 if ( *s
!='"' ) return 0;
3487 if ( *s
=='\n' || *s
=='\r' ) /* MR13 */
3488 warn("eoln found in regular expression");
3489 if ( *s
=='\\' ) s
++;
3497 * Walk a string "{ A .. Z }" where A..Z is a space separated list
3498 * of token references (either labels or reg exprs). Return a
3499 * string "inlineX_set" for some unique integer X. Basically,
3500 * we pretend as if we had seen "#tokclass inlineX { A .. Z }"
3501 * on the input stream outside of an action.
3512 fprintf(stderr
, "found consumeUntil( {...} )\n");
3513 while ( *s
==' ' || *s
=='\t' || *s
=='\n' || *s
=='\r' ) {s
++;}
3516 err("malformed consumeUntil( {...} ); missing '{'");
3520 while ( *s
==' ' || *s
=='\t' || *s
=='\n' || *s
=='\r' ) {s
++;}
3523 if ( match_token(s
,&nxt
) ) fprintf(stderr
, "found token %s\n", s
);
3524 else if ( match_rexpr(s
,&nxt
) ) fprintf(stderr
, "found rexpr %s\n", s
);
3526 err("invalid element in consumeUntil( {...} )");
3530 while ( *s
==' ' || *s
=='\t' || *s
=='\n' || *s
=='\r' ) {s
++;}
3532 return "inlineX_set";
3535 /* ANTLR-specific syntax error message generator
3536 * (define USER_ZZSYN when compiling so don't get 2 definitions)
3540 zzsyn(char *text
, int tok
, char *egroup
, SetWordType
*eset
, int etok
,
3541 int k
, char *bad_text
)
3543 zzsyn(text
, tok
, egroup
, eset
, etok
, k
, bad_text
)
3544 char *text
, *egroup
, *bad_text
;
3551 fprintf(stderr
, ErrHdr
, FileStr
[CurFile
]!=NULL
?FileStr
[CurFile
]:"stdin", zzline
);
3552 fprintf(stderr
, " syntax error at \"%s\"", (tok
==zzEOF_TOKEN
)?"EOF":text
);
3553 if ( !etok
&& !eset
) {fprintf(stderr
, "\n"); return;}
3554 if ( k
==1 ) fprintf(stderr
, " missing");
3557 fprintf(stderr
, "; \"%s\" not", bad_text
);
3558 if ( zzset_deg(eset
)>1 ) fprintf(stderr
, " in");
3560 if ( zzset_deg(eset
)>0 ) zzedecode(eset
);
3561 else fprintf(stderr
, " %s", zztokens
[etok
]);
3562 if ( strlen(egroup
) > (size_t)0 ) fprintf(stderr
, " in %s", egroup
);
3563 fprintf(stderr
, "\n");