2 /* parser.dlg -- DLG Description of scanner
4 * Generated from: antlr.g
6 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
7 * Purdue University Electrical Engineering
8 * With AHPCRC, University of Minnesota
9 * ANTLR Version 1.33MR33
12 #define ANTLR_VERSION 13333
14 #include "pccts_stdio.h"
22 #define zzcr_attr(attr,tok,t)
35 (*zzerr)("invalid token");
43 /* maintained, but not used for now */
44 set AST_nodes_refd_in_actions = set_init;
46 set attribsRefdFromAction = set_init; /* MR20 */
47 int UsedOldStyleAttrib = 0;
48 int UsedNewStyleLabel = 0;
50 char *inline_set(char *);
55 /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */
56 /* MR1 in DLG action */
58 int tokenActionActive=0; /* MR1 */
68 getFileNameFromTheLineInfo(char *toStr, char *fromStr)
70 getFileNameFromTheLineInfo(toStr, fromStr)
71 char *toStr, *fromStr;
76 if (!fromStr || !toStr) return toStr;
78 /* find the first " */
82 (fromStr[i] != '\n') &&
83 (fromStr[i] != '\r') &&
87 if ( (i == MaxFileName) ||
88 (fromStr[i] == '\n') ||
89 (fromStr[i] == '\r') ) {
93 /* find the second " */
97 (fromStr[j] != '\n') &&
98 (fromStr[j] != '\r') &&
102 if ((j == MaxFileName) ||
103 (fromStr[j] == '\n') ||
104 (fromStr[j] == '\r') ) {
108 /* go back until the last / or \ */
111 (fromStr[k] != '\"') &&
112 (fromStr[k] != '/') &&
113 (fromStr[k] != '\\');
116 /* copy the string after " / or \ into toStr */
118 for (i=k+1; fromStr[i] != '\"'; i++) {
119 toStr[i-k-1] = fromStr[i];
127 /* MR14 end of a block to support #line in antlr source code */
135 void mark_label_used_in_sem_pred(LabelEntry *le) /* MR10 */
137 void mark_label_used_in_sem_pred(le) /* MR10 */
142 require (le->elem->ntype == nToken,"mark_label_used... ntype != nToken");
143 tn=(TokNode *)le->elem;
144 require (tn->label != 0,"mark_label_used... TokNode has no label");
145 tn->label_used_in_semantic_pred=1;
155 /* L o o k F o r A n o t h e r F i l e */
158 new_input = NextFile();
159 if ( new_input == NULL ) { NLA=Eof; return; }
163 zzskip(); /* Skip the Eof (@) char i.e continue */
182 zzmode(ACTIONS); zzmore();
190 action_file=CurFile; action_line=zzline;
191 zzmode(ACTIONS); zzmore();
192 list_free(&CurActionLabels,0); /* MR10 */
193 numericActionLabel=0; /* MR10 */
201 zzmode(STRINGS); zzmore();
207 zzmode(COMMENTS); zzskip();
213 warn("Missing /*; found dangling */"); zzskip();
219 zzmode(CPP_COMMENTS); zzskip();
222 #line[\ \t]* [0-9]+ {[\ \t]* \"~[\"]+\" ([\ \t]* [0-9]*)* } (\n|\r|\r\n)
226 zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore();
227 getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr);
230 #line ~[\n\r]* (\n|\r|\r\n)
240 warn("Missing <<; found dangling \>\>"); zzskip();
251 FoundException = 1; /* MR6 */
262 NLA = FirstSetSymbol;
469 while ( zzchar==' ' || zzchar=='\t' ) {
472 if ( zzchar == ':' && inAlt ) NLA = LABEL;
479 while ( zzchar==' ' || zzchar=='\t' ) {
482 if ( zzchar == ':' && inAlt ) NLA = LABEL;
488 warn(eMsg1("unknown meta-op: %s",LATEXT(1))); zzskip();
510 warn("eoln found in string");
543 zzmode(ACTIONS); zzmore();
551 warn("eoln found in string (in user action)");
584 zzmode(ACTIONS); zzmore();
592 warn("eoln found in char literal (in user action)");
619 zzmode(ACTIONS); zzmore();
631 zzline++; zzmore(); DAWDLE;
651 zzmode(PARSE_ENUM_FILE);
664 zzline++; zzmore(); DAWDLE;
674 %%TOK_DEF_CPP_COMMENTS
684 zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); DAWDLE;
694 %%ACTION_CPP_COMMENTS
704 zzline++; zzmode(ACTIONS); zzmore(); DAWDLE;
724 zzline++; zzmode(START); zzskip(); DAWDLE;
744 zzmode(START); zzskip();
756 zzline++; zzskip(); DAWDLE;
776 /* these do not nest */
783 err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE));
786 /* MR1 10-Apr-97 MR1 Previously unable to put right shift operator */
787 /* MR1 in DLG action */
788 /* MR1 Doesn't matter what kind of action it is - reset*/
790 tokenActionActive=0; /* MR1 */
796 /* these do not nest */
802 err( eMsgd("predicate buffer overflow; size %d",ZZLEXBUFSIZE));
805 /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
808 /* MR10 */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
811 /* MRxx */ list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
813 /* MR10 */ list_apply(CurActionLabels,mark_label_used_in_sem_pred);
822 if ( topint() == ']' ) {
824 if ( istackempty() ) /* terminate action */
830 err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE));
834 /* terminate $[..] and #[..] */
835 if ( GenCC ) zzreplstr("))");
840 else if ( topint() == '|' ) { /* end of simple [...] */
847 consumeUntil\( [\ \t]* \{~[\}]+\} [\ \t]* \)
852 zzreplstr(inline_set(zzbegexpr+
853 strlen("consumeUntil(")));
856 consumeUntil\( ~[\)]+ \)
865 zzline++; zzmore(); DAWDLE;
883 if ( !GenCC ) {zzreplstr("zzaRet"); zzmore();}
884 else err("$$ use invalid in C++ mode");
890 if ( !GenCC ) {zzreplstr("zzempty_attr"); zzmore();}
891 else err("$[] use invalid in C++ mode");
899 if ( !GenCC ) zzreplstr("zzconstr_attr(");
900 else err("$[..] use invalid in C++ mode");
908 static char buf[100];
909 numericActionLabel=1; /* MR10 */
910 if ( strlen(zzbegexpr)>(size_t)85 )
911 fatal("$i attrib ref too big");
912 set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction);
913 if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s)",
914 BlkLevel-1,zzbegexpr+1);
915 else sprintf(buf,"_t%d%s",
916 BlkLevel-1,zzbegexpr+1);
919 UsedOldStyleAttrib = 1;
920 if ( UsedNewStyleLabel )
921 err("cannot mix old-style $i with new-style labels");
929 static char buf[100];
930 numericActionLabel=1; /* MR10 */
931 if ( strlen(zzbegexpr)>(size_t)85 )
932 fatal("$i.field attrib ref too big");
933 zzbegexpr[strlen(zzbegexpr)-1] = ' ';
934 set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction);
935 if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s).",
936 BlkLevel-1,zzbegexpr+1);
937 else sprintf(buf,"_t%d%s.",
938 BlkLevel-1,zzbegexpr+1);
941 UsedOldStyleAttrib = 1;
942 if ( UsedNewStyleLabel )
943 err("cannot mix old-style $i with new-style labels");
951 static char buf[100];
952 static char i[20], j[20];
954 numericActionLabel=1; /* MR10 */
955 if (strlen(zzbegexpr)>(size_t)85) fatal("$i.j attrib ref too big");
956 for (p=zzbegexpr+1,q= &i[0]; *p!='.'; p++) {
958 fatalFL("i of $i.j attrib ref too big",
959 FileStr[CurFile], zzline );
963 for (p++, q= &j[0]; *p!='\0'; p++) {
965 fatalFL("j of $i.j attrib ref too big",
966 FileStr[CurFile], zzline );
970 if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%s,%s)",i,j);
971 else sprintf(buf,"_t%s%s",i,j);
974 UsedOldStyleAttrib = 1;
975 if ( UsedNewStyleLabel )
976 err("cannot mix old-style $i with new-style labels");
980 $[_a-zA-Z][_a-zA-Z0-9]*
983 { static char buf[300]; LabelEntry *el;
985 if ( CurRule != NULL &&
986 strcmp(CurRule, &zzbegexpr[1])==0 ) {
987 if ( !GenCC ) zzreplstr("zzaRet");
989 else if ( CurRetDef != NULL &&
990 strmember(CurRetDef, &zzbegexpr[1])) {
991 if ( hasMultipleOperands( CurRetDef ) ) {
992 require (strlen(zzbegexpr)<=(size_t)285,
993 "$retval attrib ref too big");
994 sprintf(buf,"_retv.%s",&zzbegexpr[1]);
997 else zzreplstr("_retv");
999 else if ( CurParmDef != NULL &&
1000 strmember(CurParmDef, &zzbegexpr[1])) {
1003 else if ( Elabel==NULL ) {
1004 { err("$-variables in actions outside of rules are not allowed"); }
1005 } else if ( (el=(LabelEntry *)hash_get(Elabel, &zzbegexpr[1]))!=NULL ) {
1007 /* MR10 */ /* element labels might exist without an elem when */
1008 /* MR10 */ /* it is a forward reference (to a rule) */
1010 /* MR10 */ if ( GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) )
1011 /* MR10 */ { err(eMsg1("There are no token ptrs for rule references: '$%s'",&zzbegexpr[1])); }
1013 /* MR10 */ if ( !GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) && GenAST) {
1014 /* MR10 */ err("You can no longer use attributes returned by rules when also using ASTs");
1015 /* MR10 */ err(" Use upward inheritance (\"rule >[Attrib a] : ... <<$a=...\>\>\")");
1018 /* MR10 */ /* keep track of <<... $label ...>> for semantic predicates in guess mode */
1019 /* MR10 */ /* element labels contain pointer to the owners node */
1021 /* MR10 */ if (el->elem != NULL && el->elem->ntype == nToken) {
1022 /* MR10 */ list_add(&CurActionLabels,el);
1026 warn(eMsg1("$%s not parameter, return value, (defined) element label",&zzbegexpr[1]));
1034 zzreplstr("(*_root)"); zzmore(); chkGTFlag();
1041 if (NewAST) zzreplstr("(newAST)");
1042 else zzreplstr("(new AST)");}
1043 else {zzreplstr("zzastnew()");} zzmore();
1050 zzreplstr("NULL"); zzmore(); chkGTFlag();
1057 static char buf[100];
1058 if ( strlen(zzbegexpr)>(size_t)85 )
1059 fatal("#i AST ref too big");
1060 if ( GenCC ) sprintf(buf,"_ast%d%s",BlkLevel-1,zzbegexpr+1);
1061 else sprintf(buf,"zzastArg(%s)",zzbegexpr+1);
1064 set_orel(atoi(zzbegexpr+1), &AST_nodes_refd_in_actions);
1069 #line[\ \t]* [0-9]+ {[\ \t]* \"~[\"]+\" ([\ \t]* [0-9]*)* } (\n|\r|\r\n)
1073 zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore();
1074 getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr);
1077 #line ~[\n\r]* (\n|\r|\r\n)
1084 #[_a-zA-Z][_a-zA-Z0-9]*
1088 if ( !(strcmp(zzbegexpr, "#ifdef")==0 ||
1089 strcmp(zzbegexpr, "#if")==0 ||
1090 strcmp(zzbegexpr, "#else")==0 ||
1091 strcmp(zzbegexpr, "#endif")==0 ||
1092 strcmp(zzbegexpr, "#ifndef")==0 ||
1093 strcmp(zzbegexpr, "#define")==0 ||
1094 strcmp(zzbegexpr, "#pragma")==0 ||
1095 strcmp(zzbegexpr, "#undef")==0 ||
1096 strcmp(zzbegexpr, "#import")==0 ||
1097 strcmp(zzbegexpr, "#line")==0 ||
1098 strcmp(zzbegexpr, "#include")==0 ||
1099 strcmp(zzbegexpr, "#error")==0) )
1101 static char buf[100];
1102 sprintf(buf, "%s_ast", zzbegexpr+1);
1103 /* MR27 */ list_add(&CurAstLabelsInActions, mystrdup(zzbegexpr+1));
1116 if (NewAST) zzreplstr("(newAST(");
1117 else zzreplstr("(new AST("); }
1118 else zzreplstr("zzmk_ast(zzastnew(),");
1129 if (tmakeInParser) {
1130 zzreplstr("tmake(");
1133 zzreplstr("ASTBase::tmake(");
1137 zzreplstr("zztmake(");
1153 if ( istackempty() )
1155 else if ( topint()==')' ) {
1158 else if ( topint()=='}' ) {
1160 /* terminate #(..) */
1161 zzreplstr(", NULL)");
1170 pushint('|'); /* look for '|' to terminate simple [...] */
1185 zzreplstr("]"); zzmore();
1191 zzreplstr(")"); zzmore();
1197 if (! tokenActionActive) zzreplstr(">"); /* MR1 */
1204 zzmode(ACTION_CHARS); zzmore();
1210 zzmode(ACTION_STRINGS); zzmore();
1216 zzreplstr("$"); zzmore();
1222 zzreplstr("#"); zzmore();
1246 zzmode(ACTION_COMMENTS); zzmore();
1252 warn("Missing /*; found dangling */ in action"); zzmore();
1258 zzmode(ACTION_CPP_COMMENTS); zzmore();
1261 ~[\n\r\)\(\\$#\>\]\[\"'/]+
1291 zzmode(TOK_DEF_CPP_COMMENTS); zzmore();
1297 zzmode(TOK_DEF_COMMENTS); zzskip();
1303 zzmode(TOK_DEF_CPP_COMMENTS); zzskip();
1309 zzmode(TOK_DEF_CPP_COMMENTS); zzskip();
1321 zzmode(TOK_DEF_CPP_COMMENTS); zzskip();
1327 zzmode(TOK_DEF_CPP_COMMENTS); zzskip();
1333 zzmode(TOK_DEF_CPP_COMMENTS); zzskip();
1339 zzmode(TOK_DEF_CPP_COMMENTS); zzskip();
1382 [a-zA-Z_][_a-zA-Z0-9]*