antlr.g
上传用户:itx_2006
上传日期:2007-01-06
资源大小:493k
文件大小:73k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * antlr.g -- PCCTS Version 1.xx ANTLR
  3.  *
  4.  * Parse an antlr input grammar and build a syntax-diagram.
  5.  *
  6.  * Written in itself (needs at least 1.06 to work)
  7.  *
  8.  * SOFTWARE RIGHTS
  9.  *
  10.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  11.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  12.  * company may do whatever they wish with source code distributed with
  13.  * PCCTS or the code generated by PCCTS, including the incorporation of
  14.  * PCCTS, or its output, into commerical software.
  15.  *
  16.  * We encourage users to develop software with PCCTS.  However, we do ask
  17.  * that credit is given to us for developing PCCTS.  By "credit",
  18.  * we mean that if you incorporate our source code into one of your
  19.  * programs (commercial product, research project, or otherwise) that you
  20.  * acknowledge this fact somewhere in the documentation, research report,
  21.  * etc...  If you like PCCTS and have developed a nice tool with the
  22.  * output, please mention that you developed it using PCCTS.  In
  23.  * addition, we ask that this header remain intact in our source code.
  24.  * As long as these guidelines are kept, we expect to continue enhancing
  25.  * this system and expect to make other tools available as they are
  26.  * completed.
  27.  *
  28.  * ANTLR 1.33
  29.  * Terence Parr
  30.  * Parr Research Corporation
  31.  * with Purdue University and AHPCRC, University of Minnesota
  32.  * 1989-1995
  33.  */
  34. /* MR1 */
  35. /* MR1 10-Apr-97 MR1 Replace #if logic with #include "pcctscfg.h" */
  36. /* MR1 */
  37. #header <<
  38. #include "set.h"
  39. #include <ctype.h>
  40. #include "syn.h"
  41. #include "hash.h"
  42. #include "generic.h"
  43. #define zzcr_attr(attr,tok,t)
  44. >>
  45. <<
  46. #ifdef __USE_PROTOS
  47. static void chkToken(char *, char *, char *, int);
  48. #else
  49. static void chkToken();
  50. #endif
  51. #ifdef __USE_PROTOS
  52. static int isDLGmaxToken(char *Token);      /* MR3 */
  53. #else
  54. static int isDLGmaxToken();                              /* MR3 */
  55. #endif
  56. static int class_nest_level = 0;
  57. extern int inAlt;
  58. extern set attribsRefdFromAction;
  59. extern int UsedOldStyleAttrib;
  60. extern int UsedNewStyleLabel;
  61. >>
  62. #lexaction <<
  63. /* maintained, but not used for now */
  64. set AST_nodes_refd_in_actions = set_init;
  65. int inAlt = 0;
  66. set attribsRefdFromAction;
  67. int UsedOldStyleAttrib = 0;
  68. int UsedNewStyleLabel = 0;
  69. #ifdef __USE_PROTOS
  70. char *inline_set(char *);
  71. #else
  72. char *inline_set();
  73. #endif
  74. /* MR1 10-Apr-97  MR1  Previously unable to put right shift operator     */
  75. /* MR1 in DLG action                     */
  76. int tokenActionActive=0;                                            /* MR1 */
  77. >>
  78. #lexclass STRINGS
  79. #token QuotedTerm """ << zzmode(START); >>
  80. #token "n|r|rn"      <<
  81. zzline++;
  82. warn("eoln found in string");
  83. zzskip();
  84. >>
  85. #token "\(n|r|rn)" << zzline++; zzmore(); >>
  86. #token "\~[]" << zzmore(); >>
  87. #token "~[nr"\]+" << zzmore(); >>
  88. #lexclass ACTION_STRINGS
  89. #token """ << zzmode(ACTIONS); zzmore(); >>
  90. #token "n|r|rn" <<
  91. zzline++;
  92. warn("eoln found in string (in user action)");
  93. zzskip();
  94. >>
  95. #token "\(n|r|rn)" << zzline++; zzmore(); >>
  96. #token "\~[]" << zzmore(); >>
  97. #token "~[nr"\]+" << zzmore(); >>
  98. #lexclass ACTION_CHARS
  99. #token "'" << zzmode(ACTIONS); zzmore(); >>
  100. #token "n|r|rn" <<
  101. zzline++;
  102. warn("eoln found in char literal (in user action)");
  103. zzskip();
  104. >>
  105. #token "\~[]" << zzmore(); >>
  106. #token "~[nr'\]+" << zzmore(); >>
  107. #lexclass ACTION_COMMENTS
  108. #token "*/" << zzmode(ACTIONS); zzmore(); >>
  109. #token "*" << zzmore(); >>
  110. #token "n|r|rn" << zzline++; zzmore(); DAWDLE; >>
  111. #token "~[nr*]+" << zzmore(); >>
  112. #lexclass TOK_DEF_COMMENTS
  113. #token "*/" << zzmode(PARSE_ENUM_FILE);
  114.                               zzmore(); >>
  115. #token "*" << zzmore(); >>
  116. #token "n|r|rn" << zzline++; zzmore(); DAWDLE; >>
  117. #token "~[nr*]+" << zzmore(); >>
  118. #lexclass TOK_DEF_CPP_COMMENTS
  119. #token "n|r|rn" << zzline++; zzmode(PARSE_ENUM_FILE); zzskip(); DAWDLE; >>
  120. #token "~[nr]+" << zzskip(); >>
  121. #lexclass ACTION_CPP_COMMENTS
  122. #token "n|r|rn" << zzline++; zzmode(ACTIONS); zzmore(); DAWDLE; >>
  123. #token "~[nr]+" << zzmore(); >>
  124. #lexclass CPP_COMMENTS
  125. #token "n|r|rn" << zzline++; zzmode(START); zzskip(); DAWDLE; >>
  126. #token "~[nr]+" << zzskip(); >>
  127. #lexclass COMMENTS
  128. #token "*/" << zzmode(START); zzskip(); >>
  129. #token "*" << zzskip(); >>
  130. #token "n|r|rn" << zzline++; zzskip(); DAWDLE; >>
  131. #token "~[nr*]+" << zzskip(); >>
  132. /*
  133.  * This lexical class accepts actions of type [..] and <<..>>
  134.  *
  135.  * It translates the following special items for C:
  136.  *
  137.  * $j --> "zzaArg(current zztasp, j)"
  138.  * $i.j --> "zzaArg(zztaspi, j)"
  139.  * $i.nondigit> "zzaArg(current zztasp, i).nondigit"
  140.  * $$ --> "zzaRet"
  141.  * $alnum --> "alnum" (used to ref parameters)
  142.  * $rule --> "zzaRet"
  143.  * $retval --> "_retv.retval" if > 1 return values else "_retv"
  144.  * $[token, text] --> "zzconstr_attr(token, text)"
  145.  * $[] --> "zzempty_attr()"
  146.  *
  147.  * It translates the following special items for C++:
  148.  * (attributes are now stored with 'Token' and $i's are only
  149.  *  pointers to the Tokens.  Rules don't have attributes now.)
  150.  *
  151.  * $j --> "_tbj" where b is the block level
  152.  * $i.j --> "_tij"
  153.  * $j->nondigit> "_tbj->nondigit"
  154.  * $$ --> "$$"
  155.  * $alnum --> "alnum" (used to ref parameters)
  156.  * $rule --> "$rule"
  157.  * $retval --> "_retv.retval" if > 1 return values else "_retv"
  158.  * $[token, text] --> invalid
  159.  * $[] --> invalid
  160.  *
  161.  * And, for trees:
  162.  *
  163.  * #0 --> "(*_root)"
  164.  * #i --> "zzastArg(i)"
  165.  * #[args] --> "zzmk_ast(zzastnew(), args)"
  166.  * #[] --> "zzastnew()"
  167.  * #( root, child1, ..., childn )
  168.  * --> "zztmake(root, child1, ...., childn, NULL)"
  169.  * #() --> "NULL"
  170.  *
  171.  * For C++, ...
  172.  *
  173.  * #0 --> "(*_root)"
  174.  * #i --> "_astbi" where b is the block level
  175.  * #alnum --> "alnum_ast" (used to ref #label)
  176.  * #[args] --> "new AST(args)"
  177.  * #[] --> "new AST"
  178.  * #( root, child1, ..., childn )
  179.  * --> "AST::tmake(root, child1, ...., childn, NULL)"
  180.  * #() --> "NULL"
  181.  *
  182.  * To escape,
  183.  *
  184.  * ] --> ]
  185.  * ) --> )
  186.  * $ --> $
  187.  * # --> #
  188.  *
  189.  * A stack is used to nest action terminators because they can be nested
  190.  * like crazy:  << #[$[..],..] >>
  191.  */
  192. #lexclass ACTIONS
  193. #token Action ">>"        << /* these do not nest */
  194.                               zzmode(START);
  195.                               NLATEXT[0] = ' ';
  196.                               NLATEXT[1] = ' ';
  197.                               zzbegexpr[0] = ' ';
  198.                               zzbegexpr[1] = ' ';
  199.   if ( zzbufovf ) {
  200. err( eMsgd("action buffer overflow; size %d",ZZLEXBUFSIZE));
  201.   }
  202. /* MR1 10-Apr-97  MR1  Previously unable to put right shift operator */
  203. /* MR1 in DLG action */
  204. /* MR1 Doesn't matter what kind of action it is - reset*/
  205.       tokenActionActive=0;  /* MR1 */
  206.                             >>
  207. #token Pred ">>?" << /* these do not nest */
  208.                               zzmode(START);
  209.                               NLATEXT[0] = ' ';
  210.                               NLATEXT[1] = ' ';
  211.                               zzbegexpr[0] = '';
  212.   if ( zzbufovf ) {
  213. err( eMsgd("predicate buffer overflow; size %d",ZZLEXBUFSIZE));
  214.   };
  215. #ifdef __cplusplus__
  216. /* MR10 */                    list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
  217. #else
  218. #ifdef __STDC__
  219. /* MR10 */                    list_apply(CurActionLabels, (void (*)(void *))mark_label_used_in_sem_pred);
  220. #else
  221. /* MR10 */                    list_apply(CurActionLabels,mark_label_used_in_sem_pred);
  222. #endif
  223. #endif
  224.                             >>
  225. #token PassAction "]" << if ( topint() == ']' ) {
  226.   popint();
  227.   if ( istackempty() ) /* terminate action */
  228.   {
  229.   zzmode(START);
  230.   NLATEXT[0] = ' ';
  231.   zzbegexpr[0] = ' ';
  232.   if ( zzbufovf ) {
  233. err( eMsgd("parameter buffer overflow; size %d",ZZLEXBUFSIZE));
  234.   }
  235.   }
  236.   else {
  237.   /* terminate $[..] and #[..] */
  238.   if ( GenCC ) zzreplstr("))");
  239.   else zzreplstr(")");
  240.   zzmore();
  241.   }
  242.    }
  243.    else if ( topint() == '|' ) { /* end of simple [...] */
  244.   popint();
  245.   zzmore();
  246.    }
  247.    else zzmore();
  248. >>
  249. #token "consumeUntil( [ t]* {~[}]+} [ t]* )"
  250.     <<
  251.     zzmore();
  252. zzreplstr(inline_set(zzbegexpr+
  253.   strlen("consumeUntil(")));
  254. >>
  255. #token "consumeUntil( ~[)]+ )"
  256. << zzmore(); >>
  257. #token "n|r|rn" << zzline++; zzmore(); DAWDLE; >>
  258. #token ">" << zzmore(); >>
  259. #token "$" << zzmore(); >>
  260. #token "$$" << if ( !GenCC ) {zzreplstr("zzaRet"); zzmore();}
  261.    else err("$$ use invalid in C++ mode"); >>
  262. #token "$[]" << if ( !GenCC ) {zzreplstr("zzempty_attr"); zzmore();}
  263.    else err("$[] use invalid in C++ mode"); >>
  264. #token "$[" <<
  265. pushint(']');
  266. if ( !GenCC ) zzreplstr("zzconstr_attr(");
  267. else err("$[..] use invalid in C++ mode");
  268. zzmore();
  269. >>
  270. #token "$[0-9]+" <<{
  271. static char buf[100];
  272.                             numericActionLabel=1;       /* MR10 */
  273. if ( strlen(zzbegexpr)>(size_t)85 )
  274. fatal("$i attrib ref too big");
  275. set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction);
  276. if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s)",
  277. BlkLevel-1,zzbegexpr+1);
  278. else sprintf(buf,"_t%d%s",
  279. BlkLevel-1,zzbegexpr+1);
  280. zzreplstr(buf);
  281. zzmore();
  282. UsedOldStyleAttrib = 1;
  283. if ( UsedNewStyleLabel )
  284. err("cannot mix old-style $i with new-style labels");
  285. }
  286. >>
  287. #token "$[0-9]+." <<{
  288. static char buf[100];
  289.                             numericActionLabel=1;       /* MR10 */
  290. if ( strlen(zzbegexpr)>(size_t)85 )
  291. fatal("$i.field attrib ref too big");
  292. zzbegexpr[strlen(zzbegexpr)-1] = ' ';
  293. set_orel(atoi(zzbegexpr+1), &attribsRefdFromAction);
  294. if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%d,%s).",
  295. BlkLevel-1,zzbegexpr+1);
  296. else sprintf(buf,"_t%d%s.",
  297. BlkLevel-1,zzbegexpr+1);
  298. zzreplstr(buf);
  299. zzmore();
  300. UsedOldStyleAttrib = 1;
  301. if ( UsedNewStyleLabel )
  302. err("cannot mix old-style $i with new-style labels");
  303. }
  304. >>
  305. #token "$[0-9]+.[0-9]+" <<{
  306. static char buf[100];
  307. static char i[20], j[20];
  308. char *p,*q;
  309.                             numericActionLabel=1;       /* MR10 */
  310. if (strlen(zzbegexpr)>(size_t)85) fatal("$i.j attrib ref too big");
  311. for (p=zzbegexpr+1,q= &i[0]; *p!='.'; p++) {
  312. if ( q == &i[20] )
  313.  fatalFL("i of $i.j attrib ref too big",
  314.  FileStr[CurFile], zzline );
  315. *q++ = *p;
  316. }
  317. *q = '';
  318. for (p++, q= &j[0]; *p!=''; p++) {
  319. if ( q == &j[20] )
  320. fatalFL("j of $i.j attrib ref too big",
  321. FileStr[CurFile], zzline );
  322. *q++ = *p;
  323. }
  324. *q = '';
  325. if ( !GenCC ) sprintf(buf,"zzaArg(zztasp%s,%s)",i,j);
  326. else sprintf(buf,"_t%s%s",i,j);
  327. zzreplstr(buf);
  328. zzmore();
  329. UsedOldStyleAttrib = 1;
  330. if ( UsedNewStyleLabel )
  331. err("cannot mix old-style $i with new-style labels");
  332. }
  333. >>
  334. #token "$[_a-zA-Z][_a-zA-Z0-9]*"
  335. <<{ static char buf[300]; LabelEntry *el;
  336. zzbegexpr[0] = ' ';
  337. if ( CurRule != NULL &&
  338.  strcmp(CurRule, &zzbegexpr[1])==0 ) {
  339. if ( !GenCC ) zzreplstr("zzaRet");
  340. }
  341. else if ( CurRetDef != NULL &&
  342.   strmember(CurRetDef, &zzbegexpr[1])) {
  343.  if ( HasComma( CurRetDef ) ) {
  344. require (strlen(zzbegexpr)<=(size_t)285,
  345.  "$retval attrib ref too big");
  346. sprintf(buf,"_retv.%s",&zzbegexpr[1]);
  347. zzreplstr(buf);
  348. }
  349. else zzreplstr("_retv");
  350. }
  351. else if ( CurParmDef != NULL &&
  352.   strmember(CurParmDef, &zzbegexpr[1])) {
  353. ;
  354. }
  355. else if ( Elabel==NULL ) {
  356. { err("$-variables in actions outside of rules are not allowed"); }
  357. } else if ( (el=(LabelEntry *)hash_get(Elabel, &zzbegexpr[1]))!=NULL ) {
  358. /* MR10 */
  359. /* MR10 */                      /* element labels might exist without an elem when */
  360. /* MR10 */                      /*  it is a forward reference (to a rule)          */
  361. /* MR10 */
  362. /* MR10 */ if ( GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) )
  363. /* MR10 */ { err(eMsg1("There are no token ptrs for rule references: '$%s'",&zzbegexpr[1])); }
  364. /* MR10 */
  365. /* MR10 */ if ( !GenCC && (el->elem == NULL || el->elem->ntype==nRuleRef) && GenAST) {
  366. /* MR10 */                          err("You can no longer use attributes returned by rules when also using ASTs");
  367. /* MR10 */                          err("   Use upward inheritance ("rule >[Attrib a] : ... <<$a=...>>")");
  368. /* MR10 */                      };
  369. /* MR10 */
  370. /* MR10 */                      /* keep track of <<... $label ...>> for semantic predicates in guess mode */
  371. /* MR10 */                      /* element labels contain pointer to the owners node                      */
  372. /* MR10 */
  373. /* MR10 */                      if (el->elem != NULL && el->elem->ntype == nToken) {
  374. /* MR10 */                        list_add(&CurActionLabels,el);
  375. /* MR10 */                      };
  376. }
  377. else
  378. warn(eMsg1("$%s not parameter, return value, (defined) element label",&zzbegexpr[1]));
  379. }
  380. zzmore();
  381. >>
  382. #token "#0" << zzreplstr("(*_root)"); zzmore(); chkGTFlag(); >>
  383. #token "#[]" << if ( GenCC ) {
  384.                                     if (NewAST) zzreplstr("(newAST)");
  385.                                         else zzreplstr("(new AST)");}
  386.    else {zzreplstr("zzastnew()");} zzmore();
  387.    chkGTFlag();
  388. >>
  389. #token "#()" << zzreplstr("NULL"); zzmore(); chkGTFlag(); >>
  390. #token "#[0-9]+" <<{
  391. static char buf[100];
  392. if ( strlen(zzbegexpr)>(size_t)85 )
  393. fatal("#i AST ref too big");
  394. if ( GenCC ) sprintf(buf,"_ast%d%s",BlkLevel-1,zzbegexpr+1);
  395. else sprintf(buf,"zzastArg(%s)",zzbegexpr+1);
  396. zzreplstr(buf);
  397. zzmore();
  398. set_orel(atoi(zzbegexpr+1), &AST_nodes_refd_in_actions);
  399. chkGTFlag();
  400.   }
  401. >>
  402. /* MR14 Arpad Beszedes  26-May-98
  403.         Add support for #line directives when antlr source is pre-processed
  404.         #lexclass ACTIONS
  405. */
  406. #token "#line[ t]* [0-9]+ {[ t]* "~["]+" ([ t]* [0-9]*)* } (n|r|rn)"
  407.         <<
  408.         zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore();
  409.         getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr);
  410.         >>
  411. #token "#line ~[nr]* (n|r|rn)"
  412.         <<
  413.         zzline++; zzmore();
  414.         >>
  415. /* MR14 end of a block to support #line in antlr source code */
  416. #token "#[_a-zA-Z][_a-zA-Z0-9]*"
  417. <<
  418. if ( !(strcmp(zzbegexpr, "#ifdef")==0 ||
  419.  strcmp(zzbegexpr, "#if")==0 ||
  420.  strcmp(zzbegexpr, "#else")==0 ||
  421.  strcmp(zzbegexpr, "#endif")==0 ||
  422.  strcmp(zzbegexpr, "#ifndef")==0 ||
  423.  strcmp(zzbegexpr, "#define")==0 ||
  424.  strcmp(zzbegexpr, "#pragma")==0 ||
  425.  strcmp(zzbegexpr, "#undef")==0 ||
  426.  strcmp(zzbegexpr, "#import")==0 ||
  427.  strcmp(zzbegexpr, "#line")==0 ||
  428.  strcmp(zzbegexpr, "#include")==0 ||
  429.  strcmp(zzbegexpr, "#error")==0) )
  430. {
  431. static char buf[100];
  432. sprintf(buf, "%s_ast", zzbegexpr+1);
  433. zzreplstr(buf);
  434. chkGTFlag();
  435. }
  436. zzmore();
  437. >>
  438. #token "#[" <<
  439. pushint(']');
  440. if ( GenCC ) {
  441.                                 if (NewAST) zzreplstr("(newAST(");
  442.                                     else zzreplstr("(new AST("); }
  443. else zzreplstr("zzmk_ast(zzastnew(),");
  444. zzmore();
  445. chkGTFlag();
  446. >>
  447. #token "#(" <<
  448. pushint('}');
  449. if ( GenCC )
  450.     zzreplstr("ASTBase::tmake(");
  451. else zzreplstr("zztmake(");
  452. zzmore();
  453. chkGTFlag();
  454. >>
  455. #token "#" << zzmore(); >>
  456. #token ")" <<
  457. if ( istackempty() )
  458. zzmore();
  459. else if ( topint()==')' ) {
  460. popint();
  461. }
  462. else if ( topint()=='}' ) {
  463. popint();
  464. /* terminate #(..) */
  465. zzreplstr(", NULL)");
  466. }
  467. zzmore();
  468. >>
  469. #token "[" <<
  470. pushint('|'); /* look for '|' to terminate simple [...] */
  471. zzmore();
  472. >>
  473. #token "(" <<
  474. pushint(')');
  475. zzmore();
  476. >>
  477. #token "\]" << zzreplstr("]");  zzmore(); >>
  478. #token "\)" << zzreplstr(")");  zzmore(); >>
  479. /* MR1 10-Apr-97  MR1  Previously unable to put right shift operator */
  480. /* MR1 in DLG action */
  481. #token "\>" << if (! tokenActionActive) zzreplstr(">");  /* MR1 */
  482.    zzmore();          /* MR1 */
  483. >>          /* MR1 */
  484. #token "'" << zzmode(ACTION_CHARS); zzmore();>>
  485. #token """ << zzmode(ACTION_STRINGS); zzmore();>>
  486. #token "\$" << zzreplstr("$");  zzmore(); >>
  487. #token "\#" << zzreplstr("#");  zzmore(); >>
  488. #token "\(n|r|rn)" << zzline++; zzmore(); >>
  489. #token "\~[])>$#]" << zzmore(); >> /* escaped char, always ignore */
  490. #token "/" << zzmore(); >>
  491. #token "/*" << zzmode(ACTION_COMMENTS); zzmore(); >>
  492. #token "*/" << warn("Missing /*; found dangling */ in action"); zzmore(); >>
  493. #token "//" << zzmode(ACTION_CPP_COMMENTS); zzmore(); >>
  494. #token "~[nr)(\$#>]["'/]+" << zzmore(); >>
  495. #lexclass START
  496. #token "[t ]+" << zzskip(); >> /* Ignore White */
  497. #token "n|r|rn"     << zzline++; zzskip(); >> /* Track Line # */
  498. #token "["                 << zzmode(ACTIONS); zzmore();
  499.                                istackreset();
  500.                                pushint(']'); >>
  501. #token "<<"               << action_file=CurFile; action_line=zzline;
  502.                                zzmode(ACTIONS); zzmore();
  503.                                list_free(&CurActionLabels,0);       /* MR10 */
  504.                                numericActionLabel=0;                /* MR10 */
  505.                                istackreset();
  506.                                pushint('>'); >>
  507. #token """ << zzmode(STRINGS); zzmore(); >>
  508. #token "/*" << zzmode(COMMENTS); zzskip(); >>
  509. #token "*/" << warn("Missing /*; found dangling */"); zzskip(); >>
  510. #token "//" << zzmode(CPP_COMMENTS); zzskip(); >>
  511. /* MR14 Arpad Beszedes  26-May-98
  512.         Add support for #line directives when antlr source is pre-processed
  513.         #lexclass START
  514. */
  515. #token "#line[ t]* [0-9]+ {[ t]* "~["]+" ([ t]* [0-9]*)* } (n|r|rn)"
  516.         <<
  517.         zzline = atoi(zzbegexpr+5) - 1; zzline++; zzmore();
  518.         getFileNameFromTheLineInfo(FileStr[CurFile], zzbegexpr);
  519.         >>
  520. #token "#line ~[nr]* (n|r|rn)"
  521.         <<
  522.         zzline++; zzmore();
  523.         >>
  524. /* MR14 end of a block to support #line in antlr source code */
  525. /*                                                                          */
  526. /*  8-Apr-97 Regularize escape sequence for ">>"                         */
  527. /* appearing in string literals                                    */
  528. /*                                                                          */
  529. #token ">>" << warn("Missing <<; found dangling >>"); zzskip(); >> /* MR1 */
  530. #token WildCard "."
  531. #token "@" <<FoundException = 1; /* MR6 */
  532.        FoundAtOperator = 1;>> /* MR6 */
  533. #token Eof "@"
  534. << /* L o o k  F o r  A n o t h e r  F i l e */
  535. {
  536. FILE *new_input;
  537. new_input = NextFile();
  538. if ( new_input == NULL ) { NLA=Eof; return; }
  539. fclose( input );
  540. input = new_input;
  541. zzrdstream( input );
  542. zzskip(); /* Skip the Eof (@) char i.e continue */
  543. }
  544. >>
  545. #token LABEL
  546. #errclass "grammar-element" { element }
  547. #errclass "meta-symbol" { "}" "!" ";" "|" "~" "^" ")" }
  548. /*
  549.  * Get a grammar -- Build a list of rules like:
  550.  *
  551.  * o-->Rule1--o
  552.  * |
  553.  * o-->Rule2--o
  554.  * |
  555.  * ...
  556.  * |
  557.  * o-->RuleN--o
  558.  */
  559. grammar : <<Graph g;>>
  560. ( "{\}#header" Action    /* MR13 */
  561. <<
  562. if ( HdrAction==NULL ) {
  563. HdrAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  564. require(HdrAction!=NULL, "rule grammar: cannot allocate header action");
  565. strcpy(HdrAction, LATEXT(1));
  566. }
  567. else warn("additional #header statement ignored");
  568. >>
  569.             |   "{\}#first" Action
  570. <<
  571.      if ( FirstAction==NULL ) {
  572.          FirstAction = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  573.          require(FirstAction!=NULL, "rule grammar: cannot allocate #first action");
  574.          strcpy(FirstAction, LATEXT(1));
  575.      } else {
  576.                         warn("additional #first statement ignored");
  577.                     };
  578. >>
  579. | "{\}#parser" QuotedTerm
  580. <<
  581. if ( GenCC ) {
  582. warn("#parser meta-op incompatible with -CC; ignored");
  583. }
  584. else {
  585. if ( strcmp(ParserName,"zzparser")==0 ) {
  586. ParserName=StripQuotes(mystrdup(LATEXT(1)));
  587. if ( RulePrefix[0]!='' )
  588. {
  589. warn("#parser meta-op incompatible with '-gp prefix'; '-gp' ignored");
  590. RulePrefix[0]='';
  591. }
  592. }
  593. else warn("additional #parser statement ignored");
  594. }
  595. >>
  596. | "{\}#tokdefs" QuotedTerm
  597. <<{
  598. char *fname;
  599. zzantlr_state st; FILE *f; struct zzdlg_state dst;
  600. UserTokenDefsFile = mystrdup(LATEXT(1));
  601. zzsave_antlr_state(&st);
  602. zzsave_dlg_state(&dst);
  603. fname = mystrdup(LATEXT(1));
  604. f = fopen(StripQuotes(fname), "r");
  605. if ( f==NULL ) {warn(eMsg1("cannot open token defs file '%s'", fname+1));}
  606. else {
  607. ANTLRm(enum_file(fname+1), f, PARSE_ENUM_FILE);
  608. UserDefdTokens = 1;
  609. }
  610. zzrestore_antlr_state(&st);
  611. zzrestore_dlg_state(&dst);
  612. }>>
  613. )*
  614. ( Action
  615. <<{
  616. UserAction *ua = newUserAction(LATEXT(1));
  617. ua->file = action_file; ua->line = action_line;
  618. if ( class_nest_level>0 ) list_add(&class_before_actions, ua);
  619. else list_add(&BeforeActions, ua);
  620. }>>
  621. | laction
  622. | lmember /* MR1 */
  623. | lprefix /* MR1 */
  624. | aLexclass
  625. | token
  626. | error
  627. | tclass
  628.             |   aPred               /* MR11 */
  629. | default_exception_handler
  630. | class_def
  631. | "}"
  632. <<
  633. if ( class_nest_level==0 )
  634. warn("missing class definition for trailing '}'");
  635. class_nest_level--;
  636. >>
  637. )*
  638. rule <<g=$3; SynDiag = (Junction *) $3.left;>>
  639. ( rule <<if ( $1.left!=NULL ) {g.right = NULL; g = Or(g, $1);}>>
  640. | aLexclass
  641. | token
  642. | error
  643. | tclass
  644.             |   aPred               /* MR11 */
  645. | class_def
  646. | "}"
  647. <<
  648. if ( class_nest_level==0 )
  649. warn("missing class definition for trailing '}'");
  650. class_nest_level--;
  651. >>
  652. )*
  653. ( Action
  654. <<{
  655. UserAction *ua = newUserAction(LATEXT(1));
  656. ua->file = action_file; ua->line = action_line;
  657. if ( class_nest_level>0 ) list_add(&class_after_actions, ua);
  658. else list_add(&AfterActions, ua);
  659. }>>
  660. | laction
  661. | lmember /* MR1 */
  662. | lprefix /* MR1 */
  663. | error
  664. | tclass
  665. | class_def
  666.             |   aPred               /* MR11 */
  667. | "}"
  668. <<
  669. if ( class_nest_level==0 )
  670. warn("missing class definition for trailing '}'");
  671. class_nest_level--;
  672. >>
  673. )*
  674. Eof
  675. ;
  676. <<CannotContinue=TRUE;>>
  677. class_def
  678. : <<int go=1; char name[MaxRuleName+1];>>
  679. "class"
  680. ( NonTerminal <<if(go) strncpy(name,LATEXT(1),MaxRuleName);>>
  681. | TokenTerm <<if(go) strncpy(name,LATEXT(1),MaxRuleName);>>
  682. )
  683. <<
  684. if ( CurrentClassName[0]!='' && strcmp(CurrentClassName,name)!=0
  685.  && GenCC ) {
  686. err("only one grammar class allowed in this release");
  687. go = 0;
  688. }
  689. else strcpy(CurrentClassName, name);
  690. >>
  691. <<if ( !GenCC ) { err("class meta-op used without C++ option"); }>>
  692. /* MR10 */  (~ "{"
  693. /* MR10 */            <<if (ClassDeclStuff == NULL) {
  694. /* MR10 */                   ClassDeclStuff=(char *)calloc(MaxClassDeclStuff+1,sizeof(char));
  695. /* MR10 */              };
  696. /* MR10 */              strncat(ClassDeclStuff," ",MaxClassDeclStuff);
  697. /* MR10 */              strncat(ClassDeclStuff,LATEXT(1),MaxClassDeclStuff);
  698. /* MR10 */            >>
  699. /* MR10 */  )*
  700. "{"
  701. <<
  702. no_classes_found = 0;
  703. if ( class_nest_level>=1 ) {warn("cannot have nested classes");}
  704. else class_nest_level++;
  705. >>
  706. ;
  707. <<CannotContinue=TRUE;>>
  708. /*
  709.  * Build -o-->o-R-o-->o- where -o-R-o- is the block from rule 'block'.
  710.  * Construct the RuleBlk front and EndRule node on the end of the
  711.  * block.  This is used to add FOLLOW pointers to the rule end.  Add the
  712.  * new rule name to the Rname hash table and sets its rulenum.
  713.  * Store the parameter definitions if any are found.
  714.  *
  715.  * Note that locks are required on the RuleBlk and EndRule nodes to thwart
  716.  * infinite recursion.
  717.  *
  718.  * Return the left graph pointer == NULL to indicate error/dupl rule def.
  719.  */
  720. rule : <<
  721. ListNode *ex_groups = NULL;
  722. ExceptionGroup *eg;
  723. RuleEntry *q; Junction *p; Graph r; int f, l; ECnode *e;
  724. set toksrefd, rulesrefd;
  725. char *pdecl=NULL, *ret=NULL, *a; CurRetDef = CurParmDef = NULL;
  726. CurExGroups = NULL;
  727. CurElementLabels = NULL;
  728. /* We want a new element label hash table for each rule */
  729. if ( Elabel!=NULL ) killHashTable(Elabel);
  730. Elabel = newHashTable();
  731. attribsRefdFromAction = empty;
  732. >>
  733. NonTerminal
  734. <<q=NULL;
  735.   if ( hash_get(Rname, LATEXT(1))!=NULL ) {
  736.   err(eMsg1("duplicate rule definition: '%s'",LATEXT(1)));
  737.   CannotContinue=TRUE;
  738.   }
  739.   else
  740.   {
  741.      q = (RuleEntry *)hash_add(Rname,
  742. LATEXT(1),
  743. (Entry *)newRuleEntry(LATEXT(1)));
  744.       CurRule = q->str;
  745.   }
  746.   CurRuleNode = q;
  747.   f = CurFile; l = zzline;
  748.   NumRules++;
  749. >>
  750. { "!"  <<if ( q!=NULL ) q->noAST = TRUE;>> }
  751. { <<;>>
  752. {"<"}
  753. PassAction
  754. << pdecl = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  755. require(pdecl!=NULL, "rule rule: cannot allocate param decl");
  756. strcpy(pdecl, LATEXT(1));
  757. CurParmDef = pdecl;
  758. >>
  759. }
  760. { ">"
  761. PassAction
  762. << ret = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  763.     require(ret!=NULL, "rule rule: cannot allocate ret type");
  764. strcpy(ret, LATEXT(1));
  765.   CurRetDef = ret;
  766. >>
  767. }
  768. { QuotedTerm <<if ( q!=NULL ) q->egroup=mystrdup(LATEXT(1));>> }
  769. <<
  770. if ( GenEClasseForRules && q!=NULL ) {
  771. e = newECnode;
  772. require(e!=NULL, "cannot allocate error class node");
  773. if ( q->egroup == NULL ) {a = q->str; a[0] = (char)toupper(a[0]);}
  774. else a = q->egroup;
  775. if ( Tnum( a ) == 0 )
  776. {
  777. e->tok = addTname( a );
  778. list_add(&eclasses, (char *)e);
  779. if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]);
  780. /* refers to itself */
  781. list_add(&(e->elist), mystrdup(q->str));
  782. }
  783. else {
  784. warn(eMsg1("default errclass for '%s' would conflict with token/errclass/tokclass",a));
  785. if ( q->egroup == NULL ) a[0] = (char)tolower(a[0]);
  786. free((char *)e);
  787. }
  788. }
  789. >>
  790. <<BlkLevel++;>>
  791. ":" <<inAlt=1;>>
  792. block[&toksrefd, &rulesrefd]
  793. <<r = makeBlk($7,0);
  794.   CurRuleBlk = (Junction *)r.left;
  795.   CurRuleBlk->blockid = CurBlockID;
  796.   CurRuleBlk->jtype = RuleBlk;
  797.   if ( q!=NULL ) CurRuleBlk->rname = q->str;
  798.   CurRuleBlk->file = f;
  799.   CurRuleBlk->line = l;
  800.   CurRuleBlk->pdecl = pdecl;
  801.   CurRuleBlk->ret = ret;
  802.   CurRuleBlk->lock = makelocks();
  803.   CurRuleBlk->pred_lock = makelocks();
  804.   CurRuleBlk->tokrefs = toksrefd;
  805.   CurRuleBlk->rulerefs = rulesrefd;
  806.   p = newJunction(); /* add EndRule Node */
  807.   ((Junction *)r.right)->p1 = (Node *)p;
  808.   r.right = (Node *) p;
  809.   p->jtype = EndRule;
  810.   p->lock = makelocks();
  811.   p->pred_lock = makelocks();
  812.   CurRuleBlk->end = p;
  813.   if ( q!=NULL ) q->rulenum = NumRules;
  814.   $7 = r;
  815. >>
  816. <<--BlkLevel;>>
  817.             <<altFixup();leFixup();egFixup();>>                      /* MR7 */
  818. ";" <<inAlt=0;>>
  819. { Action
  820. << a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  821. require(a!=NULL, "rule rule: cannot allocate error action");
  822. strcpy(a, LATEXT(1));
  823. CurRuleBlk->erraction = a;
  824. >>
  825. }
  826. ( exception_group > [eg]
  827. <<if ( eg!=NULL ) {
  828. list_add(&CurExGroups, (void *)eg);
  829. if (eg->label == NULL || *eg->label=='' ) q->has_rule_exception = 1;
  830.     }
  831. >>
  832. )*
  833. <<if ( q==NULL ) $0.left = NULL; else $0 = $7;>>
  834. <<CurRuleNode = NULL;>>
  835. <<CurRuleBlk->exceptions = CurExGroups;>>
  836. <<CurRuleBlk->el_labels = CurElementLabels;>>
  837. ;
  838. <<CannotContinue=TRUE;>>
  839. /*
  840. pragma : "{\}#pragma" "dup-labeled-tokens"
  841. <<Pragma_DupLabeledTokens=1;>>
  842. ;
  843. */
  844. laction : <<char *a;>>
  845. "{\}#lexaction"
  846. Action
  847. <<
  848. a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  849. require(a!=NULL, "rule laction: cannot allocate action");
  850. strcpy(a, LATEXT(1));
  851. list_add(&LexActions, a);
  852. >>
  853. ;
  854. <<CannotContinue=TRUE;>>
  855. /* MR1     */
  856. /* MR1  11-Apr-97 Provide mechanism for inserting code into DLG class */
  857. /* MR1   via #lexmember <<....>> & #lexprefix <<...>>      */
  858. /* MR1     */
  859. lmember: <<char *a;>>      /* MR1 */
  860. /* MR1 */ "{\}#lexmember"
  861. /* MR1 */ Action
  862. /* MR1 */ <<
  863. /* MR1 */ if (! GenCC) {
  864. /* MR1 */   err("Use #lexmember only in C++ mode (to insert code in DLG class header");
  865. /* MR1 */         } else {
  866. /* MR1 */   a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  867. /* MR1 */   require(a!=NULL, "rule lmember: cannot allocate action");
  868. /* MR1 */   strcpy(a, LATEXT(1));
  869. /* MR1 */   list_add(&LexMemberActions, a);
  870. /* MR1 */ };
  871. /* MR1 */ >>
  872. /* MR1 */ ;
  873. /* MR1 */ <<CannotContinue=TRUE;>>
  874. lprefix: <<char *a;>>      /* MR1 */
  875. /* MR1 */ "{\}#lexprefix"
  876. /* MR1 */ Action
  877. /* MR1 */ <<
  878. /* MR1 */ if (! GenCC) {
  879. /* MR1 */   err("Use #lexprefixr only in C++ mode (to insert code in DLG class header");
  880. /* MR1 */         } else {
  881. /* MR1 */   a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  882. /* MR1 */   require(a!=NULL, "rule lprefix: cannot allocate action");
  883. /* MR1 */   strcpy(a, LATEXT(1));
  884. /* MR1 */   list_add(&LexPrefixActions, a);
  885. /* MR1 */ };
  886. /* MR1 */ >>
  887. /* MR1 */ ;
  888. /* MR1 */ <<CannotContinue=TRUE;>>
  889. /*
  890.  #pred upper        <<isupper()>>?            predicate literal
  891.  #pred lower        <<islower()>>?            predicate literal
  892.  #pred up_or_low    upper || lower            predicate expression
  893.                                                 concealed interdependence
  894.  #pred up_or_low_2  <<isletter()>>?  A || B   predicate literal equals predicate expr
  895.                                                 analyze using lower||upper
  896.                                                 generate using isLetter()
  897. */
  898. aPred:  <<PredEntry     *predEntry=NULL;
  899.           char          *name=NULL;
  900.           Predicate     *predExpr=NULL;
  901.           char          *predLiteral=NULL;
  902.           int           save_file;
  903.           int           save_line;
  904.           int           predExprPresent=0;
  905.         >>
  906.         "{\}#pred"
  907.         <<
  908.           MR_usingPredNames=1;      /* will need to use -mrhoist version of genPredTree */
  909.         >>
  910.                                     /* used to allow NonTerminal but it caused problems
  911.                                        when a rule name immediately followed a #pred statement */
  912.         TokenTerm     <<name=mystrdup(LATEXT(1));>>
  913.           <<
  914.             /* don't free - referenced in predicates */
  915.             CurPredName=(char *)calloc(1,strlen(name) + 10);
  916.             strcat("#pred ",CurPredName);
  917.             strcat(name,CurPredName);
  918.             predEntry=(PredEntry *) hash_get(Pname,name);
  919.             if (predEntry != NULL) {
  920.               warnFL(eMsg1("#pred %s previously defined - ignored",name),
  921.                                               FileStr[action_file],action_line);
  922.               name=NULL;
  923.             };
  924.           >>
  925.         (
  926.             Pred    <<predLiteral=mystrdup(LATEXT(1));
  927.                       save_line=action_line;
  928.                       save_file=action_file;
  929.                     >>
  930.               {
  931.                     predOrExpr>[predExpr]   <<predExprPresent=1;>>
  932.               }
  933.               <<if (predLiteral != NULL && name != NULL) {
  934.                       /*
  935.                        *  predExpr may be NULL due to syntax errors
  936.                        *    or simply omitted by the user
  937.                       */
  938.                       predEntry=newPredEntry(name);
  939.                       predEntry->file=save_file;
  940.                       predEntry->line=save_line;
  941.                       predExpr=MR_predFlatten(predExpr);
  942.                       predEntry->predLiteral=predLiteral;
  943.                       if (! predExprPresent || predExpr == NULL) {
  944.                         predExpr=new_pred();
  945.                         predExpr->expr=predLiteral;
  946.                         predExpr->source=newActionNode();
  947.                         predExpr->source->action=predExpr->expr;
  948.                         predExpr->source->rname=CurPredName;
  949.                         predExpr->source->line=action_line;
  950.                         predExpr->source->file=action_file;
  951.                         predExpr->source->is_predicate=1;
  952.                         predExpr->k=predicateLookaheadDepth(predExpr->source);
  953.                       };
  954.                       predEntry->pred=predExpr;
  955.                       hash_add(Pname,name,(Entry *)predEntry);
  956.                       predExpr=NULL;
  957.                 };
  958.                 predicate_free(predExpr);
  959.               >>
  960.             |
  961.                <<save_line=zzline; save_file=CurFile;>>
  962.                 predOrExpr>[predExpr]
  963.               <<if (predExpr != NULL && name != NULL) {
  964.                   predEntry=newPredEntry(name);
  965.                   predEntry->file=CurFile;
  966.                   predEntry->line=zzline;
  967.                   predExpr=MR_predFlatten(predExpr);
  968.                   predEntry->pred=predExpr;
  969.                   hash_add(Pname,name,(Entry *)predEntry);
  970.                   predExpr=NULL;
  971.                 };
  972.                 predicate_free(predExpr);
  973.               >>
  974.         )
  975.         {";"}
  976. ;
  977. /* fail */
  978. <<predicate_free(predExpr);
  979. >>
  980. predOrExpr>[Predicate *result] :
  981.             <<Predicate     *ORnode;
  982.               Predicate     *predExpr;
  983.               Predicate     **tail=NULL;
  984.             >>
  985.         predAndExpr>[predExpr]
  986.             <<
  987.                 ORnode=new_pred();
  988.                 ORnode->expr=PRED_OR_LIST;
  989.                 if (predExpr != NULL) {
  990.                     ORnode->down=predExpr;
  991.                     tail=&predExpr->right;
  992.                 };
  993.             >>
  994.         ( "||"  predAndExpr>[predExpr]
  995.             <<
  996.                 if (predExpr != NULL) {
  997.                     *tail=predExpr;
  998.                     tail=&predExpr->right;
  999.                 };
  1000.             >>
  1001.         )*
  1002.         <<
  1003.             $result=ORnode;
  1004.             ORnode=NULL;
  1005.         >>
  1006. ;
  1007. /* fail */
  1008. <<predicate_free(ORnode);>>
  1009. predAndExpr>[Predicate *result] :
  1010.             <<Predicate     *ANDnode;
  1011.               Predicate     *predExpr;
  1012.               Predicate     **tail=NULL;
  1013.             >>
  1014.         predPrimary>[predExpr]
  1015.             <<
  1016.                 ANDnode=new_pred();
  1017.                 ANDnode->expr=PRED_AND_LIST;
  1018.                 if (predExpr != NULL) {
  1019.                     ANDnode->down=predExpr;
  1020.                     tail=&predExpr->right;
  1021.                 };
  1022.             >>
  1023.         ( "&&"  predPrimary>[predExpr]
  1024.             <<
  1025.                 if (predExpr != NULL) {
  1026.                     *tail=predExpr;
  1027.                     tail=&predExpr->right;
  1028.                 };
  1029.             >>
  1030.         )*
  1031.         <<
  1032.             $result=ANDnode;
  1033.             ANDnode=NULL;
  1034.         >>
  1035. ;
  1036. /* fail */
  1037. <<predicate_free(ANDnode);>>
  1038. predPrimary>[Predicate *result] :
  1039.             <<
  1040.               char          *name=NULL;
  1041.               PredEntry     *predEntry=NULL;
  1042.               Predicate     *predExpr=NULL;
  1043.               int           inverted=0;
  1044.             >>
  1045.         TokenTerm            <<name=mystrdup(LATEXT(1));>>
  1046.             <<
  1047.                 predEntry=(PredEntry *) hash_get(Pname,name);
  1048.                 if (predEntry == NULL) {
  1049.                   warnFL(eMsg1("no previously defined #pred with name "%s"",name),
  1050.                         FileStr[CurFile],zzline);
  1051.                   name=NULL;
  1052.                   $result=NULL;
  1053.                 } else {
  1054.                   predExpr=predicate_dup(predEntry->pred);
  1055.                   predExpr->predEntry=predEntry;
  1056.                   $result=predExpr;
  1057.                 };
  1058.             >>
  1059.         | "(" predOrExpr>[predExpr] ")"
  1060.             <<
  1061.                 $result=predExpr;
  1062.             >>
  1063.         | "!" predPrimary>[predExpr]
  1064.             <<
  1065.                 predExpr->inverted=!predExpr->inverted;
  1066.                 $result=predExpr;
  1067.             >>
  1068. ;
  1069. /* fail */  <<
  1070.               predicate_free(predExpr);
  1071.             >>
  1072. aLexclass: "{\}#lexclass" TokenTerm <<lexclass(mystrdup(LATEXT(1)));>>
  1073. ;
  1074. <<CannotContinue=TRUE;>>
  1075. error : <<char *t=NULL; ECnode *e; int go=1; TermEntry *p;>>
  1076. "{\}#errclass"
  1077. (<<;>> TokenTerm  <<t=mystrdup(LATEXT(1));>>
  1078. | QuotedTerm <<t=mystrdup(LATEXT(1));>>
  1079. )
  1080. <<e = newECnode;
  1081.   require(e!=NULL, "cannot allocate error class node");
  1082.   e->lexclass = CurrentLexClass;
  1083.   if ( Tnum( (t=StripQuotes(t)) ) == 0 )
  1084.   {
  1085. if ( hash_get(Texpr, t) != NULL )
  1086. warn(eMsg1("errclass name conflicts with regular expression  '%s'",t));
  1087.    e->tok = addTname( t );
  1088. set_orel(e->tok, &imag_tokens);
  1089. require((p=(TermEntry *)hash_get(Tname, t)) != NULL,
  1090. "hash table mechanism is broken");
  1091. p->classname = 1; /* entry is errclass name, not token */
  1092. list_add(&eclasses, (char *)e);
  1093.   }
  1094.   else
  1095.   {
  1096.    warn(eMsg1("redefinition of errclass or conflict w/token or tokclass '%s'; ignored",t));
  1097. free( (char *)e );
  1098. go=0;
  1099.   }
  1100. >>
  1101. "{"
  1102. ( NonTerminal <<if ( go ) t=mystrdup(LATEXT(1));>>
  1103. | TokenTerm <<if ( go ) t=mystrdup(LATEXT(1));>>
  1104. | QuotedTerm <<if ( go ) t=mystrdup(LATEXT(1));>>
  1105. )
  1106. <<if ( go ) list_add(&(e->elist), t);>>
  1107. (
  1108. ( NonTerminal <<if ( go ) t=mystrdup(LATEXT(1));>>
  1109. | TokenTerm <<if ( go ) t=mystrdup(LATEXT(1));>>
  1110. | QuotedTerm <<if ( go ) t=mystrdup(LATEXT(1));>>
  1111. )
  1112. <<if ( go ) list_add(&(e->elist), t);>>
  1113. )*
  1114. "}"
  1115. ;
  1116. <<CannotContinue=TRUE;>>
  1117. tclass : <<char *t=NULL; TCnode *e; int go=1,tok,totok; TermEntry *p, *term, *toterm;>>
  1118.             <<char *totext=NULL; >>
  1119. "{\}#tokclass" TokenTerm <<t=mystrdup(LATEXT(1));>>
  1120. <<e = newTCnode;
  1121.   require(e!=NULL, "cannot allocate token class node");
  1122.   e->lexclass = CurrentLexClass;
  1123.   if ( Tnum( t ) == 0 )
  1124.   {
  1125.    e->tok = addTname( t );
  1126. set_orel(e->tok, &imag_tokens);
  1127. set_orel(e->tok, &tokclasses);
  1128. require((p=(TermEntry *)hash_get(Tname, t)) != NULL,
  1129. "hash table mechanism is broken");
  1130. p->classname = 1; /* entry is class name, not token */
  1131. p->tclass = e; /* save ptr to this tclass def */
  1132. list_add(&tclasses, (char *)e);
  1133.   }
  1134.   else
  1135.   {
  1136.    warn(eMsg1("redefinition of tokclass or conflict w/token '%s'; ignored",t));
  1137. free( (char *)e );
  1138. go=0;
  1139.   }
  1140. >>
  1141. "{"
  1142. (
  1143.      ( TokenTerm
  1144.        <<if ( go ) {
  1145.      term = (TermEntry *) hash_get(Tname, LATEXT(1));
  1146.      if ( term==NULL && UserDefdTokens ) {
  1147.      err("implicit token definition not allowed with #tokdefs");
  1148.      go = 0;
  1149.      }
  1150.      else {t=mystrdup(LATEXT(1)); tok=addTname(LATEXT(1));}
  1151.      }>>
  1152.                         {
  1153.                             ".."
  1154.                             TokenTerm
  1155.                <<if ( go ) {
  1156.                  toterm = (TermEntry *) hash_get(Tname, LATEXT(1));
  1157.                  if ( toterm==NULL && UserDefdTokens ) {
  1158.                  err("implicit token definition not allowed with #tokdefs");
  1159.                  go = 0;
  1160.                  } else {
  1161.                                         totext=mystrdup(LATEXT(1)); totok=addTname(LATEXT(1));
  1162.                                     }
  1163.                  }
  1164.                               >>
  1165.                         }
  1166.      | QuotedTerm
  1167.        <<if ( go ) {
  1168.      term = (TermEntry *) hash_get(Texpr, LATEXT(1));
  1169.      if ( term==NULL && UserDefdTokens ) {
  1170.      err("implicit token definition not allowed with #tokdefs");
  1171.      go = 0;
  1172.          }
  1173.      else {t=mystrdup(LATEXT(1)); tok=addTexpr(LATEXT(1));}
  1174.      }>>
  1175.      )
  1176.      <<if ( go ) {
  1177.                         if (totext == NULL) {
  1178.                             list_add(&(e->tlist), t);
  1179.                         } else {
  1180.                             list_add(&(e->tlist),"..");
  1181.                             list_add(&(e->tlist),t);
  1182.                             list_add(&(e->tlist),totext);
  1183.                         }
  1184.                         totext=NULL;
  1185.                       }
  1186.                     >>
  1187. )*
  1188. "}"
  1189. ;
  1190. <<CannotContinue=TRUE;>>
  1191. token : <<char *t=NULL, *e=NULL, *a=NULL; int tnum=0;>>
  1192.             <<char *akaString=NULL; TermEntry *te;int save_file=0,save_line=0;>>           /* MR11 */
  1193. "{\}#token"
  1194. /* MR1 10-Apr-97 MR1 Allow shift right operator in DLG actions    */
  1195. /* MR1 Danger when parser feedback to lexer            */
  1196. /* MR1                                                                */
  1197. <<tokenActionActive=1;>>                     /* MR1 */
  1198. { TokenTerm  <<t=mystrdup(LATEXT(1));>>
  1199. /* MR11 */      {
  1200. /* MR11 */          "("
  1201. /* MR11 */          QuotedTerm
  1202. /* MR11 */                 <<akaString=mystrdup(StripQuotes(LATEXT(1)));
  1203. /* MR11 */                   save_file=CurFile;save_line=zzline;
  1204. /* MR11 */                 >>
  1205. /* MR11 */          ")"
  1206. /* MR11 */      }
  1207. { "=" "[0-9]+" /* define the token type number */
  1208. <<tnum = atoi(LATEXT(1));>>
  1209. }
  1210. }
  1211. { QuotedTerm <<e=mystrdup(LATEXT(1));>> }
  1212. { Action
  1213. <<
  1214. a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  1215. require(a!=NULL, "rule token: cannot allocate action");
  1216. strcpy(a, LATEXT(1));
  1217. >>
  1218. }
  1219.             { ";" }     /* MR11 */
  1220. <<chkToken(t, e, a, tnum);>>
  1221.             <<if (t != NULL) {
  1222.                 te=(TermEntry *)hash_get(Tname,t);
  1223.                 if (te != NULL && akaString != NULL) {
  1224.                   if (te->akaString != NULL) {
  1225.                     if (strcmp(te->akaString,akaString) != 0) {
  1226.                       warnFL(eMsg2("this #token statment conflicts with a previous #token %s("%s") statement",
  1227.                                     t,te->akaString),
  1228.                         FileStr[save_file],save_line);
  1229.                     };
  1230.                   } else {
  1231.                     te->akaString=akaString;
  1232.                   };
  1233.                 };
  1234.               };
  1235.             >>
  1236. ;
  1237. <<CannotContinue=TRUE;>>
  1238. block[set *toksrefd, set *rulesrefd]
  1239. : <<
  1240. Graph g, b;
  1241. set saveblah;
  1242. int saveinalt = inAlt;
  1243. ExceptionGroup *eg;
  1244. *$toksrefd = empty;
  1245. *$rulesrefd = empty;
  1246. set_clr(AST_nodes_refd_in_actions);
  1247. CurBlockID++;
  1248. CurAltNum = 1;
  1249. saveblah = attribsRefdFromAction;
  1250. attribsRefdFromAction = empty;
  1251. >>
  1252. alt[toksrefd,rulesrefd] <<b = g = $1;>>
  1253. <<
  1254. if ( ((Junction *)g.left)->p1->ntype == nAction )
  1255. {
  1256.                 ActionNode *actionNode=(ActionNode *)
  1257.                                          ( ( (Junction *)g.left) ->p1);
  1258. if (!actionNode->is_predicate )
  1259. {
  1260. actionNode->init_action = TRUE;
  1261. /* MR12c */   if (actionNode->noHoist) {
  1262. /* MR12c */           errFL("<<nohoist>> appears as init-action - use <<>> <<nohoist>>",
  1263. /* MR12c */                       FileStr[actionNode->file],actionNode->line);
  1264. /* MR12c */         };
  1265. }
  1266. }
  1267. ((Junction *)g.left)->blockid = CurBlockID;
  1268. >>
  1269. ( exception_group > [eg]
  1270. <<
  1271. if ( eg!=NULL ) {
  1272. /* MR7 *****        eg->altID = makeAltID(CurBlockID,CurAltNum);        *****/
  1273. /* MR7 ***** CurAltStart->exception_label = eg->altID;           *****/
  1274. list_add(&CurExGroups, (void *)eg);
  1275. }
  1276. >>
  1277. )*
  1278. <<CurAltNum++;>>
  1279. ( "|" <<inAlt=1;>>
  1280. alt[toksrefd,rulesrefd] <<g = Or(g, $2);>>
  1281. <<
  1282. ((Junction *)g.left)->blockid = CurBlockID;
  1283. >>
  1284. ( exception_group > [eg]
  1285. <<
  1286. if ( eg!=NULL ) {
  1287. /* MR7 *****        eg->altID = makeAltID(CurBlockID,CurAltNum);        *****/
  1288. /* MR7 ***** CurAltStart->exception_label = eg->altID;           *****/
  1289. list_add(&CurExGroups, (void *)eg);
  1290. }
  1291. >>
  1292. )*
  1293. <<CurAltNum++;>>
  1294. )*
  1295. <<$0 = b;>>
  1296. <<attribsRefdFromAction = saveblah; inAlt = saveinalt;>>
  1297. ;
  1298. <<CannotContinue=TRUE;>>
  1299. alt[set *toksrefd, set *rulesrefd]
  1300. : <<int n=0,ne=0; Graph g; int e_num=0, not=0; Node *node; set elems, dif;
  1301. int first_on_line = 1, use_def_MT_handler = 0;
  1302. g.left=NULL; g.right=NULL;
  1303. CurAltStart = NULL;
  1304. elems = empty;
  1305. inAlt = 1;
  1306. >>
  1307. { "@" /* handle MismatchedToken signals with default handler */
  1308. <<use_def_MT_handler = 1;>>
  1309. }
  1310. ( <<;>>       /* MR9 Removed unreferenced variable "tok" */
  1311. { <<not=0;>> "~" <<not=1;>> }
  1312. element[not, first_on_line, use_def_MT_handler] > [node]
  1313. <<if ( node!=NULL && node->ntype!=nAction ) first_on_line = 0;>>
  1314. <<
  1315. if ( $2.left!=NULL ) {
  1316. g = Cat(g, $2);
  1317. n++;
  1318. if ( node!=NULL ) {
  1319. if ( node->ntype!=nAction ) e_num++;
  1320. /* record record number of all rule and token refs */
  1321. if ( node->ntype==nToken ) {
  1322. TokNode *tk = (TokNode *)((Junction *)$2.left)->p1;
  1323. tk->elnum = e_num;
  1324. set_orel(e_num, &elems);
  1325. }
  1326. else if ( node->ntype==nRuleRef ) {
  1327. RuleRefNode *rn = (RuleRefNode *)((Junction *)$2.left)->p1;
  1328. rn->elnum = e_num;
  1329. set_orel(e_num, $rulesrefd);
  1330. }
  1331. }
  1332. }
  1333. >>
  1334. )*
  1335. <<if ( n == 0 ) g = emptyAlt();
  1336.   $0 = g;
  1337.   /* We want to reduce number of LT(i) calls and the number of
  1338.    * local attribute variables in C++ mode (for moment, later we'll
  1339.    * do for C also).  However, if trees are being built, they
  1340.    * require most of the attrib variables to create the tree nodes
  1341.    * with; therefore, we gen a token ptr for each token ref in C++
  1342.    */
  1343.   if ( GenCC && !GenAST )
  1344.   {
  1345.   /* This now free's the temp set -ATG 5/6/95 */
  1346.   set temp;
  1347.   temp = set_and(elems, attribsRefdFromAction);
  1348.   set_orin($toksrefd, temp);
  1349.   set_free(temp);
  1350.   }
  1351.   else set_orin($toksrefd, elems);
  1352.   if ( GenCC ) {
  1353. dif = set_dif(attribsRefdFromAction, elems);
  1354.    if ( set_deg(dif)>0 )
  1355. err("one or more $i in action(s) refer to non-token elements");
  1356. set_free(dif);
  1357.   }
  1358.   set_free(elems);
  1359.   set_free(attribsRefdFromAction);
  1360.   inAlt = 0;
  1361.     >>
  1362. ;
  1363. <<CannotContinue=TRUE;>>
  1364. element_label > [LabelEntry *label]
  1365. : <<TermEntry *t=NULL; LabelEntry *l=NULL; RuleEntry *r=NULL; char *lab;>>
  1366. LABEL <<lab = mystrdup(LATEXT(1));>>
  1367. <<
  1368. UsedNewStyleLabel = 1;
  1369. if ( UsedOldStyleAttrib ) err("cannot mix with new-style labels with old-style $i");
  1370. t = (TermEntry *) hash_get(Tname, lab);
  1371. if ( t==NULL ) t = (TermEntry *) hash_get(Texpr, lab);
  1372. if ( t==NULL ) r = (RuleEntry *) hash_get(Rname, lab);
  1373. if ( t!=NULL ) {
  1374. err(eMsg1("label definition clashes with token/tokclass definition: '%s'", lab));
  1375. $label = NULL;
  1376. }
  1377. else if ( r!=NULL ) {
  1378. err(eMsg1("label definition clashes with rule definition: '%s'", lab));
  1379. $label = NULL;
  1380. }
  1381. else {
  1382. /* we don't clash with anybody else */
  1383. l = (LabelEntry *) hash_get(Elabel, lab);
  1384.   if ( l==NULL ) { /* ok to add new element label */
  1385. l = (LabelEntry *)hash_add(Elabel,
  1386.    lab,
  1387.    (Entry *)newLabelEntry(lab));
  1388. /* add to list of element labels for this rule */
  1389. list_add(&CurElementLabels, (void *)lab);
  1390. /* MR7 */       leAdd(l);  /* list of labels waiting for exception group definitions */
  1391. $label = l;
  1392. }
  1393. else {
  1394. err(eMsg1("label definitions must be unique per rule: '%s'", lab));
  1395. $label = NULL;
  1396. }
  1397. }
  1398. >>
  1399. ":"
  1400. ;
  1401. element[int not, int first_on_line, int use_def_MT_handler] > [Node *node]
  1402. : <<
  1403.   Attrib blk;
  1404.   Predicate *pred = NULL;
  1405.   int local_use_def_MT_handler=0;
  1406.   ActionNode *act;
  1407.   RuleRefNode *rr;
  1408.   set toksrefd, rulesrefd;
  1409.   TermEntry *term;
  1410.   TokNode *p=NULL; RuleRefNode *q; int approx=0;
  1411.   LabelEntry *label=NULL;
  1412.           int predMsgDone=0;
  1413.           int semDepth=0;
  1414.           int   ampersandStyle;
  1415.           int   height;         /* MR11 */
  1416.           int   equal_height;   /* MR11 */
  1417.   $node = NULL;
  1418.   >>
  1419.   {element_label>[label]}
  1420.   ( TokenTerm
  1421. <<
  1422. term = (TermEntry *) hash_get(Tname, LATEXT(1));
  1423. if ( term==NULL && UserDefdTokens ) {
  1424. err("implicit token definition not allowed with #tokdefs");
  1425. $$.left = $$.right = NULL;
  1426. }
  1427. else {
  1428. $$ = buildToken(LATEXT(1));
  1429. p=((TokNode *)((Junction *)$$.left)->p1);
  1430. term = (TermEntry *) hash_get(Tname, LATEXT(1));
  1431. require( term!= NULL, "hash table mechanism is broken");
  1432. p->tclass = term->tclass;
  1433. p->complement = $not;
  1434. if ( label!=NULL ) {
  1435. p->el_label = label->str;
  1436. label->elem = (Node *)p;
  1437. }
  1438. }
  1439. >>
  1440. { ".."
  1441. ( QuotedTerm
  1442. <<if ( p!=NULL ) setUpperRange(p, LATEXT(1));>>
  1443. | TokenTerm
  1444. <<if ( p!=NULL ) setUpperRange(p, LATEXT(1));>>
  1445. )
  1446. }
  1447. <<
  1448. if ( p!=NULL && (p->upper_range!=0 || p->tclass || $not) )
  1449. list_add(&MetaTokenNodes, (void *)p);
  1450. >>
  1451. ( "^" <<if ( p!=NULL ) p->astnode=ASTroot;>>
  1452. | <<if ( p!=NULL ) p->astnode=ASTchild;>>
  1453. | "!" <<if ( p!=NULL ) p->astnode=ASTexclude;>>
  1454. )
  1455. { "@" <<local_use_def_MT_handler = 1;>> }
  1456. <<
  1457. if ( p!=NULL && $first_on_line ) {
  1458. CurAltStart = (Junction *)$$.left;
  1459.                 altAdd(CurAltStart);                                 /* MR7 */
  1460. p->altstart = CurAltStart;
  1461. }
  1462.     if ( p!=NULL )
  1463. p->use_def_MT_handler = $use_def_MT_handler || local_use_def_MT_handler;
  1464. $node = (Node *)p;
  1465. >>
  1466.   | QuotedTerm
  1467. <<
  1468. term = (TermEntry *) hash_get(Texpr, LATEXT(1));
  1469. if ( term==NULL && UserDefdTokens ) {
  1470. err("implicit token definition not allowed with #tokdefs");
  1471. $$.left = $$.right = NULL;
  1472. }
  1473. else {
  1474. $$ = buildToken(LATEXT(1)); p=((TokNode *)((Junction *)$$.left)->p1);
  1475. p->complement = $not;
  1476. if ( label!=NULL ) {
  1477. p->el_label = label->str;
  1478.     label->elem = (Node *)p;
  1479. }
  1480. }
  1481. >>
  1482. { ".."
  1483. ( QuotedTerm
  1484. <<if ( p!=NULL ) setUpperRange(p, LATEXT(1));>>
  1485. | TokenTerm
  1486. <<if ( p!=NULL ) setUpperRange(p, LATEXT(1));>>
  1487. )
  1488. }
  1489. ( "^" <<if ( p!=NULL ) p->astnode=ASTroot;>>
  1490. | <<if ( p!=NULL ) p->astnode=ASTchild;>>
  1491. | "!" <<if ( p!=NULL ) p->astnode=ASTexclude;>>
  1492. )
  1493. { "@" <<local_use_def_MT_handler = 1;>> }
  1494. <<
  1495. if ( p!=NULL && (p->upper_range!=0 || p->tclass || $not) )
  1496. list_add(&MetaTokenNodes, (void *)p);
  1497. >>
  1498. <<
  1499. if ( $first_on_line ) {
  1500. CurAltStart = (Junction *)$$.left;
  1501.                 altAdd(CurAltStart);                                 /* MR7 */
  1502. p->altstart = CurAltStart;
  1503. }
  1504.     if ( p!=NULL )
  1505. p->use_def_MT_handler = $use_def_MT_handler || local_use_def_MT_handler;
  1506. $node = (Node *)p;
  1507. >>
  1508.   | <<if ( $not ) warn("~ WILDCARD is an undefined operation (implies 'nothing')");>>
  1509. "."
  1510. <<$$ = buildWildCard(LATEXT(1)); p=((TokNode *)((Junction *)$$.left)->p1);>>
  1511. ( "^" <<p->astnode=ASTroot;>>
  1512. | <<p->astnode=ASTchild;>>
  1513. | "!" <<p->astnode=ASTexclude;>>
  1514. )
  1515. <<list_add(&MetaTokenNodes, (void *)p);>>
  1516. <<
  1517. if ( $first_on_line ) {
  1518. CurAltStart = (Junction *)$$.left;
  1519.                 altAdd(CurAltStart);                                 /* MR7 */
  1520. p->altstart = CurAltStart;
  1521. if ( label!=NULL ) {
  1522. p->el_label = label->str;
  1523. label->elem = (Node *)p;
  1524. }
  1525. }
  1526. $node = (Node *)p;
  1527. >>
  1528.   | <<if ( $not ) warn("~ NONTERMINAL is an undefined operation");>>
  1529. NonTerminal
  1530. <<$$ = buildRuleRef(LATEXT(1));>>
  1531. { "!" <<q = (RuleRefNode *) ((Junction *)$$.left)->p1;
  1532. q->astnode=ASTexclude;>>
  1533. }
  1534. { {"<"}
  1535. PassAction <<addParm(((Junction *)$$.left)->p1, LATEXT(1));>>
  1536. }
  1537. <<rr=(RuleRefNode *) ((Junction *)$$.left)->p1;>>
  1538. { <<char *a;>>
  1539. ">"
  1540. PassAction
  1541. <<
  1542. a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  1543. require(a!=NULL, "rule element: cannot allocate assignment");
  1544. strcpy(a, LATEXT(1));
  1545. rr->assign = a;
  1546. >>
  1547. }
  1548. <<
  1549. if ( label!=NULL ) {
  1550. rr->el_label = label->str;
  1551. label->elem = (Node *)rr;
  1552. }
  1553. if ( $first_on_line ) {
  1554. CurAltStart = (Junction *)$$.left;
  1555.                 altAdd(CurAltStart);                                 /* MR7 */
  1556. ((RuleRefNode *)((Junction *)$$.left)->p1)->altstart = CurAltStart;
  1557. }
  1558. $node = (Node *)rr;
  1559. >>
  1560.   )
  1561. | <<if ( $not ) warn("~ ACTION is an undefined operation");>>
  1562. Action <<$0 = buildAction(LATEXT(1),action_file,action_line, 0);>>
  1563. <<if ( $first_on_line ) {                                /* MR7 */
  1564.                 CurAltStart = (Junction *)$0.left;                   /* MR7 */
  1565.                 altAdd(CurAltStart);                                 /* MR7 */
  1566.               };>>                                                   /* MR7 */
  1567. <<$node = (Node *) ((Junction *)$0.left)->p1;>>
  1568. | <<if ( $not ) warn("~ SEMANTIC-PREDICATE is an undefined operation");>>
  1569. Pred   <<$0 = buildAction(LATEXT(1),action_file,action_line, 1);>>
  1570. <<act = (ActionNode *) ((Junction *)$0.left)->p1;>>
  1571.             <<if (numericActionLabel) {             /* MR10 */
  1572.                 list_add(&NumericPredLabels,act);   /* MR10 */
  1573.                 numericActionLabel=0;               /* MR10 */
  1574.               };                                    /* MR10 */
  1575.             >>
  1576. { <<char *a;>>
  1577. PassAction
  1578. <<
  1579. a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  1580. require(a!=NULL, "rule element: cannot allocate predicate fail action");
  1581. strcpy(a, LATEXT(1));
  1582. act->pred_fail = a;
  1583. >>
  1584. }
  1585. <<if ( $first_on_line ) {                                /* MR7 */
  1586.                 CurAltStart = (Junction *)$0.left;                   /* MR7 */
  1587.                 altAdd(CurAltStart);                                 /* MR7 */
  1588.               };>>                                                    /* MR7 */
  1589. <<$node = (Node *)act;>>
  1590. | <<if ( $not ) warn("~ BLOCK is an undefined operation");>>
  1591. <<BlkLevel++;>>
  1592. { "{\}#pragma"
  1593. ( "approx" <<approx=LL_k;>>
  1594. | "LL(1)"  <<approx = 1;>>
  1595. | "LL(2)"  <<approx = 2;>>
  1596. )
  1597. }
  1598. ( "(" block[&toksrefd,&rulesrefd] ")"
  1599. <<blk = $$ = $2; --BlkLevel;>>
  1600. ( "*" <<$$ = makeLoop($$,approx);>>
  1601. | "+" <<$$ = makePlus($$,approx);>>
  1602. | "?"
  1603. (
  1604.                         ( "=>" <<ampersandStyle=0;>>
  1605.                         | "&&" <<ampersandStyle=1;>>  /* MR10 (g)? && <<p>>? */
  1606.                         )
  1607.                         Pred /* generalized predicate */
  1608. /* first make into a predicate */
  1609.     <<$$ = buildAction(LATEXT(1),action_file,action_line,1);>>
  1610.     <<act = (ActionNode *) ((Junction *)$$.left)->p1;>>
  1611.                         <<semDepth=predicateLookaheadDepth(act);>>  /* MR10 */
  1612.                         <<if (numericActionLabel) {             /* MR10 */
  1613.                             list_add(&NumericPredLabels,act);   /* MR10 */
  1614.                             numericActionLabel=0;               /* MR10 */
  1615.                           };                                    /* MR10 */
  1616.                         >>
  1617. { <<char *a;>>
  1618. PassAction
  1619. <<
  1620. a = (char *)calloc(strlen(LATEXT(1))+1, sizeof(char));
  1621. require(a!=NULL, "rule element: cannot allocate predicate fail action");
  1622. strcpy(a, LATEXT(1));
  1623. act->pred_fail = a;
  1624. >>
  1625. }
  1626. <<if ($first_on_line) {                      /* MR7 */
  1627.                             CurAltStart=(Junction *)$$.left;         /* MR7 */
  1628.                             altAdd(CurAltStart);                     /* MR7 */
  1629.                           };>>
  1630. <<$node = (Node *)act;>>
  1631. /* for now, just snag context */
  1632. <<
  1633. pred = computePredicateFromContextGuard(blk,&predMsgDone);      /* MR10 */
  1634. if ( pred==NULL) {                                              /* MR10 */
  1635.                           if ( !predMsgDone) err("invalid or missing context guard");   /* MR10 */
  1636.                           predMsgDone=1;                                                /* MR10 */
  1637. } else {                                                        /* MR10 */
  1638.                             act->guardNodes=(Junction *)blk.left;                       /* MR11 */
  1639. pred->expr = act->action;
  1640. pred->source = act;
  1641. /* MR10 */                  pred->ampersandStyle = ampersandStyle;  /* 0 means (g)? => ... 1 means (g)? && ... */
  1642. /* MR13 */                  if (pred->tcontext != NULL) {
  1643. /* MR13 */                    height=MR_max_height_of_tree(pred->tcontext);
  1644. /* MR13 */                    equal_height=MR_all_leaves_same_height(pred->tcontext,height);
  1645. /* MR13 */                    if (! equal_height) {
  1646. /* MR13 */                       errFL("in guarded predicates all tokens in the guard must be at the same height",
  1647. /* MR13 */                              FileStr[act->file],act->line);
  1648. /* MR13 */                    };
  1649. /* MR13 */                  }
  1650. /* MR10 */                  if (ampersandStyle) {
  1651. /* MR10 */      act->ampersandPred = pred;
  1652. /* MR11 */                    if (! HoistPredicateContext) {
  1653. /* MR11 */                      errFL("without "-prc on" (guard)? && <<pred>>? ... doesn't make sense",
  1654. /* MR11 */                              FileStr[act->file],act->line);
  1655. /* MR11 */                    };
  1656. /* MR10 */                  } else {
  1657. /* MR10 */      act->guardpred = pred;
  1658. /* MR10 */                  };
  1659. /* MR10 */                  if (pred->k != semDepth) {
  1660. /* MR10 */                     warn(eMsgd2("length of guard (%d) does not match the length of semantic predicate (%d)",
  1661. /* MR10 */                                  pred->k,semDepth));
  1662. /* MR10 */                  };
  1663. }
  1664. >>
  1665. | <<$$ = makeBlk($$,approx);
  1666.   FoundGuessBlk = 1;
  1667.   ((Junction *) ((Junction *)$$.left)->p1)->guess=1;
  1668.   if ( !$first_on_line ) {
  1669. err("(...)? predicate must be first element of production");
  1670.   }
  1671. >>
  1672. )
  1673. | <<$$ = makeBlk($$,approx);>>
  1674. )
  1675. <<
  1676. if ( pred==NULL && !predMsgDone) {                                      /* MR10 */
  1677. ((Junction *)((Junction *)$$.left)->p1)->blockid = CurBlockID;
  1678. ((Junction *)((Junction *)$$.left)->p1)->tokrefs = toksrefd;
  1679. ((Junction *)((Junction *)$$.left)->p1)->rulerefs = rulesrefd;
  1680. if ( $first_on_line ) {                         /* MR7 */
  1681.    CurAltStart = (Junction *)((Junction *)((Junction *)$$.left)->p1);  /* MR7 */
  1682.                        altAdd(CurAltStart);                         /* MR7 */
  1683.                     };                                              /* MR7 */
  1684. $node = (Node *) ((Junction *)$$.left)->p1;
  1685. }
  1686. >>
  1687. | "{" block[&toksrefd,&rulesrefd]
  1688. <<$$ = makeOpt($2,approx); --BlkLevel;>>
  1689. "}"
  1690. <<
  1691. ((Junction *)((Junction *)$$.left)->p1)->blockid = CurBlockID;
  1692. ((Junction *)((Junction *)$$.left)->p1)->tokrefs = toksrefd;
  1693. ((Junction *)((Junction *)$$.left)->p1)->rulerefs = rulesrefd;
  1694. >>
  1695. <<if ( $first_on_line ) {                            /* MR7 */
  1696. CurAltStart = (Junction *) ((Junction *)((Junction *)$$.left)->p1);  /* MR7 */
  1697.                     altAdd(CurAltStart);                             /* MR7 */
  1698.                   };
  1699. >>
  1700. <<$node = (Node *) ((Junction *)$$.left)->p1;>>
  1701. )
  1702. /* Error catching alternatives */
  1703. | "*" <<warn("don't you want a ')' with that '*'?"); CannotContinue=TRUE;>>
  1704. | "+" <<warn("don't you want a ')' with that '+'?"); CannotContinue=TRUE;>>
  1705. | ">" <<warn("'>' can only appear after a nonterminal"); CannotContinue=TRUE;>>
  1706. | PassAction <<warn("[...] out of context 'rule > [...]'");
  1707.  CannotContinue=TRUE;>>
  1708. ;
  1709. <<CannotContinue=TRUE;>>
  1710. default_exception_handler
  1711. : exception_group > [DefaultExGroup]
  1712. ;
  1713. exception_group > [ExceptionGroup *eg]
  1714. : <<ExceptionHandler *h; LabelEntry *label=NULL;   /* MR6 */
  1715.   FoundException = 1; FoundExceptionGroup = 1;>>  /* MR6 */
  1716. "exception"  <<$eg = (ExceptionGroup *)calloc(1, sizeof(ExceptionGroup));>>
  1717. { <<char *p;>>
  1718. PassAction /* did they attach a label? */
  1719. <<
  1720. p = LATEXT(1)+1;
  1721. p[strlen(p)-1] = ''; /* kill trailing space */
  1722. label = (LabelEntry *) hash_get(Elabel, LATEXT(1)+1);
  1723. if ( label==NULL )
  1724. {
  1725. err(eMsg1("unknown label in exception handler: '%s'", LATEXT(1)+1));
  1726. }
  1727. >>
  1728. }
  1729. ( exception_handler > [h]
  1730. <<list_add(&($eg->handlers), (void *)h);>>
  1731. )*
  1732. { "default" ":" Action
  1733. <<{
  1734. ExceptionHandler *eh = (ExceptionHandler *)
  1735. calloc(1, sizeof(ExceptionHandler));
  1736. char *a = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  1737. require(eh!=NULL, "exception: cannot allocate handler");
  1738. require(a!=NULL, "exception: cannot allocate action");
  1739. strcpy(a, LATEXT(1));
  1740. eh->action = a;
  1741. eh->signalname = (char *) calloc(strlen("default")+1, sizeof(char));
  1742. require(eh->signalname!=NULL, "exception: cannot allocate sig name");
  1743. strcpy(eh->signalname, "default");
  1744. list_add(&($eg->handlers), (void *)eh);
  1745. }>>
  1746. }
  1747. <<
  1748. if ( label!=NULL ) {
  1749.              /* Record ex group in sym tab for this label */
  1750.    if ( label->ex_group!=NULL ) {
  1751.       err(eMsg1("duplicate exception handler for label '%s'",label->str));
  1752.    } else {
  1753.   label->ex_group = $eg;
  1754. /* Label the exception group itself */
  1755.   $eg->label = label->str;
  1756. /* Make the labelled element pt to the exception also */
  1757. /* MR6 */   if (label->elem == NULL) {
  1758. /* MR6 */      err(eMsg1("reference in exception handler to undefined label '%s'",label->str));
  1759. /* MR6 */   } else {
  1760.      switch ( label->elem->ntype ) {
  1761.     case nRuleRef :
  1762.                         {
  1763.          RuleRefNode *r = (RuleRefNode *)label->elem;
  1764.          r->ex_group = $eg;
  1765.           break;
  1766.                         }
  1767.                   case nToken :
  1768.         {
  1769.         TokNode *t = (TokNode *)label->elem;
  1770.         t->ex_group = $eg;
  1771.         break;
  1772.         }
  1773.  } /* end switch */
  1774. /* MR6 */   }; /* end test on label->elem */
  1775.     } /* end test on label->ex_group */
  1776. } /* end test on exception label */
  1777. /* MR7 */
  1778. /* MR7 */   if (BlkLevel == 1 && label == NULL) {
  1779. /* MR7 */     $eg->forRule=1;
  1780. /* MR7 */   } else if (label == NULL) {
  1781. /* MR7 */     $eg->altID = makeAltID(CurBlockID,CurAltNum);
  1782. /* MR7 */     egAdd($eg);
  1783. /* MR7 */   } else {
  1784. /* MR7 */     $eg->labelEntry=label;
  1785. /* MR7 */   };
  1786. /* MR7 */
  1787. /* MR7 */     /* You may want to remove this exc from the rule list  */
  1788. /* MR7 */ /* and handle at the labeled element site.             */
  1789. /* MR7 */
  1790. /* MR7 */   if (label != NULL) {
  1791. /* MR7 */     $eg = NULL;
  1792. /* MR7 */   };
  1793. >>
  1794. ;
  1795. <<CannotContinue=TRUE;>>
  1796. exception_handler > [ExceptionHandler *eh]
  1797. : <<;>>                               /* MR9 Removed unreferenced variable "a" */
  1798. "catch"
  1799. <<
  1800. $eh = (ExceptionHandler *)calloc(1, sizeof(ExceptionHandler));
  1801. require($eh!=NULL, "exception: cannot allocate handler");
  1802. >>
  1803. ( NonTerminal
  1804. <<
  1805. $eh->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  1806. require($eh->signalname!=NULL, "exception: cannot allocate sig name");
  1807. strcpy($eh->signalname, LATEXT(1));
  1808. >>
  1809. | TokenTerm
  1810. <<
  1811. $eh->signalname = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  1812. require($eh->signalname!=NULL, "exception: cannot allocate sig name");
  1813. strcpy($eh->signalname, LATEXT(1));
  1814. >>
  1815. )
  1816. ":"
  1817. { <<$eh->action = NULL;>>
  1818. Action
  1819. <<
  1820. $eh->action = (char *) calloc(strlen(LATEXT(1))+1, sizeof(char));
  1821. require($eh->action!=NULL, "exception: cannot allocate action");
  1822. strcpy($eh->action, LATEXT(1));
  1823. >>
  1824. }
  1825. ;
  1826. <<CannotContinue=TRUE;>>
  1827. #token NonTerminal "[a-z] [A-Za-z0-9_]*"
  1828. <<
  1829. while ( zzchar==' ' || zzchar=='t' ) {
  1830. zzadvance();
  1831. }
  1832. if ( zzchar == ':' && inAlt ) NLA = LABEL;
  1833. >>
  1834. #token TokenTerm "[A-Z] [A-Za-z0-9_]*"
  1835. <<
  1836. while ( zzchar==' ' || zzchar=='t' ) {
  1837. zzadvance();
  1838. }
  1839. if ( zzchar == ':' && inAlt ) NLA = LABEL;
  1840. >>
  1841. #token "{\}#[A-Za-z0-9_]*" <<warn(eMsg1("unknown meta-op: %s",LATEXT(1))); zzskip(); >>
  1842. #lexclass PARSE_ENUM_FILE
  1843. #token "[t ]+" << zzskip(); >> /* Ignore White */
  1844. #token "n|r|rn" << zzline++; zzskip(); >> /* Track Line # */
  1845. #token "//" << zzmode(TOK_DEF_CPP_COMMENTS); zzmore(); >>
  1846. #token "/*" << zzmode(TOK_DEF_COMMENTS); zzskip(); >>
  1847. #token "#ifdef" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >>
  1848. #token "#if" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >>
  1849. #token "#ifndef" << ; >>
  1850. #token "#else" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >>
  1851. #token "#endif" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >>
  1852. #token "#undef" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >>
  1853. #token "#import" << zzmode(TOK_DEF_CPP_COMMENTS); zzskip(); >>
  1854. #token "@" << ; >>
  1855. enum_file[char *fname]
  1856. : { "#ifndef" ID
  1857. { "#define" ID /* ignore if it smells like a gate */
  1858. /* First #define after the first #ifndef (if any) is ignored */
  1859. }
  1860. }
  1861. ( ( enum_def[$fname] )+
  1862. | defines[$fname]
  1863. )
  1864. |
  1865. ;
  1866. defines[char *fname]
  1867. : <<int v; int maxt=(-1); char *t;>> /* MR3 */
  1868. (
  1869. "#define" ID
  1870. <<t = mystrdup(LATEXT(1));>>
  1871. INT
  1872. <<
  1873. v = atoi(LATEXT(1));
  1874. /* fprintf(stderr, "#token %s=%dn", t, v);*/
  1875. /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
  1876. /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs            */
  1877. /* MR2 Don't let #tokdefs be confused by  */
  1878. /* MR2   DLGminToken and DLGmaxToken      */
  1879. if ( ! isDLGmaxToken(t)) { /* MR2 */
  1880.   TokenNum = v;
  1881.   if ( v>maxt ) maxt=v;
  1882.   if ( Tnum( t ) == 0 ) {
  1883.     addForcedTname( t, v );
  1884.   } else {
  1885.     warnFL(eMsg1("redefinition of token %s; ignored",t),$fname,zzline);
  1886.   };
  1887.                 };
  1888. >>
  1889. )+
  1890. <<TokenNum = maxt + 1;>>
  1891. ;
  1892. enum_def[char *fname]
  1893. : <<int v= 0; int maxt=(-1); char *t;>> /* MR3 */
  1894. "enum" ID
  1895. "{"
  1896. ID
  1897. <<t = mystrdup(LATEXT(1));>>
  1898. ( "=" INT <<v=atoi(LATEXT(1));>>
  1899. | <<v++;>>
  1900. )
  1901. <<
  1902. /* fprintf(stderr, "#token %s=%dn", t, v);*/
  1903. TokenNum = v;
  1904. if ( v>maxt ) maxt=v; /* MR3 */
  1905. if ( Tnum( t ) == 0 ) addForcedTname( t, v );
  1906. else {
  1907. warnFL(eMsg1("redefinition of token %s; ignored",t),$fname,zzline);
  1908. }
  1909. >>
  1910. ( ","
  1911. /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
  1912. /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs            */
  1913. /* MR2 Don't let #tokdefs be confused by  */
  1914. /* MR2   DLGminToken and DLGmaxToken      */
  1915. {
  1916.   <<isDLGmaxToken(LATEXT(1))>>? ID { "=" INT } /* MR2 */
  1917. | ID                 /* MR2 */
  1918. <<t = mystrdup(LATEXT(1));>>
  1919. ( "=" INT <<v=atoi(LATEXT(1));>>
  1920. | <<v++;>>
  1921. )
  1922. <<
  1923. /* fprintf(stderr, "#token %s=%dn", t, v);*/
  1924. TokenNum = v;
  1925. if ( v>maxt ) maxt=v; /* MR3 */
  1926. if ( Tnum( t ) == 0 ) addForcedTname( t, v );
  1927. else {
  1928. warnFL(eMsg1("redefinition of token %s; ignored",t),$fname,zzline);
  1929. }
  1930. >>
  1931. }
  1932. )*
  1933. "}"
  1934. ";"
  1935. <<TokenNum = maxt + 1;>> /* MR3 */
  1936. ;
  1937. #token INT "[0-9]+"
  1938. #token ID "[a-zA-Z_][_a-zA-Z0-9]*"
  1939. #lexclass START
  1940. /* MR14 Arpad Beszedes  26-May-98
  1941.         Add support for #line directives when antlr source is pre-processed
  1942. */
  1943. #lexaction
  1944. <<
  1945. static char *
  1946. #ifdef __USE_PROTOS
  1947. getFileNameFromTheLineInfo(char *toStr, char *fromStr)
  1948. #else
  1949. getFileNameFromTheLineInfo(toStr, fromStr)
  1950. char *toStr, *fromStr;
  1951. #endif
  1952. {
  1953.   int i, j, k;
  1954.   if (!fromStr || !toStr) return toStr;
  1955.   /* find the first " */
  1956.   for (i=0;
  1957.         (i<MaxFileName) &&
  1958.         (fromStr[i] != 'n') &&
  1959.         (fromStr[i] != 'r') &&
  1960.         (fromStr[i] != '"');
  1961.       i++) /* nothing */ ;
  1962.   if ( (i == MaxFileName) ||
  1963.        (fromStr[i] == 'n') ||
  1964.        (fromStr[i] == 'r') ) {
  1965.     return toStr;
  1966.   }
  1967.   /* find the second " */
  1968.   for (j=i+1;
  1969.         (j<MaxFileName) &&
  1970.         (fromStr[j] != 'n') &&
  1971.         (fromStr[j] != 'r') &&
  1972.         (fromStr[j] != '"');
  1973.        j++) /* nothing */ ;
  1974.   if ((j == MaxFileName) ||
  1975.       (fromStr[j] == 'n') ||
  1976.       (fromStr[j] == 'r') ) {
  1977.     return toStr;
  1978.   }
  1979.   /* go back until the last / or  */
  1980.   for (k=j-1;
  1981.         (fromStr[k] != '"') &&
  1982.         (fromStr[k] != '/') &&
  1983.         (fromStr[k] != '\');
  1984.        k--) /* nothing */ ;
  1985.   /* copy the string after " / or  into toStr */
  1986.   for (i=k+1; fromStr[i] != '"'; i++) {
  1987.     toStr[i-k-1] = fromStr[i];
  1988.   }
  1989.   toStr[i-k-1] = '';
  1990.   return toStr;
  1991. }
  1992. /* MR14 end of a block to support #line in antlr source code */
  1993. >>
  1994. <<
  1995. /* MR2 Andreas Magnusson (Andreas.Magnusson@mailbox.swipnet.se) */
  1996. /* MR2 Fix to bug introduced by 1.33MR1 for #tokdefs            */
  1997. /* MR2 Don't let #tokdefs be confused by  */
  1998. /* MR2   DLGminToken and DLGmaxToken      */
  1999. /* semantic check on DLGminToken and DLGmaxmaxToken in #tokdefs */
  2000. #ifdef __USE_PROTOS
  2001. static int isDLGmaxToken(char *Token)
  2002. #else
  2003. static int isDLGmaxToken(Token)
  2004.   char * Token;
  2005. #endif
  2006. {
  2007.    static char checkStr1[] = "DLGmaxToken";
  2008.    static char checkStr2[] = "DLGminToken";
  2009.    if (strcmp(Token, checkStr1) == 0)
  2010.       return 1;
  2011.    else if (strcmp(Token, checkStr2) == 0)
  2012.       return 1;
  2013.    else
  2014.       return 0;
  2015. }
  2016. /* semantics of #token */
  2017. static void
  2018. #ifdef __USE_PROTOS
  2019. chkToken(char *t, char *e, char *a, int tnum)
  2020. #else
  2021. chkToken(t,e,a,tnum)
  2022. char *t, *e, *a;
  2023. int tnum;
  2024. #endif
  2025. {
  2026. TermEntry *p;
  2027. /* check to see that they don't try to redefine a token as a token class */
  2028. if ( t!=NULL ) {
  2029. p = (TermEntry *) hash_get(Tname, t);
  2030. if ( p!=NULL && p->classname ) {
  2031. err(eMsg1("redefinition of #tokclass '%s' to #token not allowed; ignored",t));
  2032. if ( a!=NULL ) free((char *)a);
  2033. return;
  2034. }
  2035. }
  2036. if ( t==NULL && e==NULL ) { /* none found */
  2037. err("#token requires at least token name or rexpr");
  2038. }
  2039. else if ( t!=NULL && e!=NULL ) { /* both found */
  2040. if ( UserDefdTokens ) { /* if #tokdefs, must not define new */
  2041. p = (TermEntry *) hash_get(Tname, t);
  2042. if ( p == NULL) {
  2043. err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t));
  2044.      return;
  2045.             };
  2046. }
  2047. Tklink(t, e);
  2048. if ( a!=NULL ) {
  2049. if ( hasAction(e) ) {
  2050. err(eMsg1("redefinition of action for %s; ignored",e));
  2051. }
  2052. else setHasAction(e, a);
  2053. }
  2054. }
  2055. else if ( t!=NULL ) { /* only one found */
  2056. if ( UserDefdTokens ) {
  2057. p = (TermEntry *) hash_get(Tname, t);
  2058.             if (p == NULL) {
  2059. err(eMsg1("new token definition '%s' not allowed - only #token with name already defined by #tokdefs file allowed",t));
  2060.             };
  2061.         return;
  2062. }
  2063. if ( Tnum( t ) == 0 ) addTname( t );
  2064. else {
  2065. err(eMsg1("redefinition of token %s; ignored",t));
  2066. }
  2067. if ( a!=NULL ) {
  2068. err(eMsg1("action cannot be attached to a token name (%s); ignored",t));
  2069. free((char *)a);
  2070. }
  2071. }
  2072. else if ( e!=NULL ) {
  2073. if ( Tnum( e ) == 0 ) addTexpr( e );
  2074. else {
  2075. if ( hasAction(e) ) {
  2076. err(eMsg1("redefinition of action for expr %s; ignored",e));
  2077. }
  2078. else if ( a==NULL ) {
  2079. err(eMsg1("redefinition of expr %s; ignored",e));
  2080. }
  2081. }
  2082. if ( a!=NULL ) setHasAction(e, a);
  2083. }
  2084. /* if a token type number was specified, then add the token ID and 'tnum'
  2085.  * pair to the ForcedTokens list.  (only applies if an id was given)
  2086.  */
  2087. if ( t!=NULL && tnum>0 )
  2088. {
  2089. if ( set_el(tnum, reserved_positions) )
  2090. {
  2091. err(eMsgd("a token has already been forced to token number %d; ignored", tnum));
  2092. }
  2093. else
  2094. {
  2095. list_add(&ForcedTokens, newForcedToken(t,tnum));
  2096. set_orel(tnum, &reserved_positions);
  2097. }
  2098. }
  2099. }
  2100. >>
  2101. <<
  2102. static int
  2103. #ifdef __USE_PROTOS
  2104. match_token(char *s, char **nxt)
  2105. #else
  2106. match_token(s,nxt)
  2107. char *s;
  2108. char **nxt;
  2109. #endif
  2110. {
  2111.     if ( !(*s>='A' && *s<='Z') ) return 0;
  2112. s++;
  2113.     while ( (*s>='a' && *s<='z') ||
  2114.     (*s>='A' && *s<='Z') ||
  2115.     (*s>='0' && *s<='9') ||
  2116.     *s=='_' )
  2117.     {
  2118.    s++;
  2119. }
  2120. if ( *s!=' ' && *s!='}' ) return 0;
  2121. *nxt = s;
  2122. return 1;
  2123. }
  2124. static int
  2125. #ifdef __USE_PROTOS
  2126. match_rexpr(char *s, char **nxt)
  2127. #else
  2128. match_rexpr(s,nxt)
  2129. char *s;
  2130. char **nxt;
  2131. #endif
  2132. {
  2133.     if ( *s!='"' ) return 0;
  2134. s++;
  2135.     while ( *s!='"' )
  2136.     {
  2137.    if ( *s=='n' || *s=='r' )                   /* MR13 */
  2138.   warn("eoln found in regular expression");
  2139.    if ( *s=='\' ) s++;
  2140.    s++;
  2141. }
  2142. *nxt = s+1;
  2143. return 1;
  2144. }
  2145. /*
  2146.  * Walk a string "{ A .. Z }" where A..Z is a space separated list
  2147.  * of token references (either labels or reg exprs).  Return a
  2148.  * string "inlineX_set" for some unique integer X.  Basically,
  2149.  * we pretend as if we had seen "#tokclass inlineX { A .. Z }"
  2150.  * on the input stream outside of an action.
  2151.  */
  2152. char *
  2153. #ifdef __USE_PROTOS
  2154. inline_set(char *s)
  2155. #else
  2156. inline_set(s)
  2157. char *s;
  2158. #endif
  2159. {
  2160. char *nxt;
  2161.     fprintf(stderr, "found consumeUntil( {...} )n");
  2162. while ( *s==' ' || *s=='t' || *s=='n' || *s=='r' ) {s++;}
  2163. if ( *s!='{' )
  2164. {
  2165.    err("malformed consumeUntil( {...} ); missing '{'");
  2166.    return "bad_set";
  2167. }
  2168. s++;
  2169. while ( *s==' ' || *s=='t' || *s=='n' || *s=='r' ) {s++;}
  2170. while ( *s!='}' )
  2171. {
  2172.     if ( match_token(s,&nxt) ) fprintf(stderr, "found token %sn", s);
  2173. else if ( match_rexpr(s,&nxt) ) fprintf(stderr, "found rexpr %sn", s);
  2174. else {
  2175.     err("invalid element in consumeUntil( {...} )");
  2176. return "bad_set";
  2177. }
  2178. s = nxt;
  2179. while ( *s==' ' || *s=='t' || *s=='n' || *s=='r' ) {s++;}
  2180. }
  2181. return "inlineX_set";
  2182. }
  2183. >>
  2184. <<
  2185. /* ANTLR-specific syntax error message generator
  2186.  * (define USER_ZZSYN when compiling so don't get 2 definitions)
  2187.  */
  2188. void
  2189. #ifdef __USE_PROTOS
  2190. zzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok,
  2191. int k, char *bad_text)
  2192. #else
  2193. zzsyn(text, tok, egroup, eset, etok, k, bad_text)
  2194. char *text, *egroup, *bad_text;
  2195. int tok;
  2196. int etok;
  2197. int k;
  2198. SetWordType *eset;
  2199. #endif
  2200. {
  2201. fprintf(stderr, ErrHdr, FileStr[CurFile]!=NULL?FileStr[CurFile]:"stdin", zzline);
  2202. fprintf(stderr, " syntax error at "%s"", (tok==zzEOF_TOKEN)?"EOF":text);
  2203. if ( !etok && !eset ) {fprintf(stderr, "n"); return;}
  2204. if ( k==1 ) fprintf(stderr, " missing");
  2205. else
  2206. {
  2207. fprintf(stderr, "; "%s" not", bad_text);
  2208. if ( zzset_deg(eset)>1 ) fprintf(stderr, " in");
  2209. }
  2210. if ( zzset_deg(eset)>0 ) zzedecode(eset);
  2211. else fprintf(stderr, " %s", zztokens[etok]);
  2212. if ( strlen(egroup) > (size_t)0 ) fprintf(stderr, " in %s", egroup);
  2213. fprintf(stderr, "n");
  2214. }
  2215. >>
  2216. #lexaction <<
  2217. #ifdef __USE_PROTOS
  2218. void mark_label_used_in_sem_pred(LabelEntry *le)              /* MR10 */
  2219. #else
  2220. void mark_label_used_in_sem_pred(le)                          /* MR10 */
  2221.   LabelEntry    *le;
  2222. #endif
  2223. {
  2224.   TokNode   *tn;
  2225.   require (le->elem->ntype == nToken,"mark_label_used... ntype != nToken");
  2226.   tn=(TokNode *)le->elem;
  2227.   require (tn->label != 0,"mark_label_used... TokNode has no label");
  2228.   tn->label_used_in_semantic_pred=1;
  2229. }
  2230. >>