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

编译器/解释器

开发平台:

Others

  1. /* ANTLRParser.C
  2.  *
  3.  * SOFTWARE RIGHTS
  4.  *
  5.  * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
  6.  * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
  7.  * company may do whatever they wish with source code distributed with
  8.  * PCCTS or the code generated by PCCTS, including the incorporation of
  9.  * PCCTS, or its output, into commerical software.
  10.  *
  11.  * We encourage users to develop software with PCCTS.  However, we do ask
  12.  * that credit is given to us for developing PCCTS.  By "credit",
  13.  * we mean that if you incorporate our source code into one of your
  14.  * programs (commercial product, research project, or otherwise) that you
  15.  * acknowledge this fact somewhere in the documentation, research report,
  16.  * etc...  If you like PCCTS and have developed a nice tool with the
  17.  * output, please mention that you developed it using PCCTS.  In
  18.  * addition, we ask that this header remain intact in our source code.
  19.  * As long as these guidelines are kept, we expect to continue enhancing
  20.  * this system and expect to make other tools available as they are
  21.  * completed.
  22.  *
  23.  * ANTLR 1.33
  24.  * Terence Parr
  25.  * Parr Research Corporation
  26.  * with Purdue University and AHPCRC, University of Minnesota
  27.  * 1989-1998
  28.  */
  29. #include "pcctscfg.h"
  30. #include PCCTS_STDLIB_H
  31. #include PCCTS_STDARG_H
  32. #include PCCTS_STRING_H
  33. #include PCCTS_STDIO_H
  34. PCCTS_NAMESPACE_STD
  35. /* I have to put this here due to C++ limitation
  36.  * that you can't have a 'forward' decl for enums.
  37.  * I hate C++!!!!!!!!!!!!!!!
  38.  * Of course, if I could use real templates, this would go away.
  39.  */
  40. // MR1
  41. // MR1  10-Apr-97  133MR1  Prevent use of varying sizes for the
  42. // MR1   ANTLRTokenType enum
  43. // MR1
  44. enum ANTLRTokenType { TER_HATES_CPP=0, ITS_TOO_COMPLICATED=9999};     // MR1
  45. #define ANTLR_SUPPORT_CODE
  46. #include ATOKEN_H
  47. #include ATOKENBUFFER_H
  48. #include APARSER_H
  49. static const int zzINF_DEF_TOKEN_BUFFER_SIZE = 2000;    /* MR14 */
  50. static const int zzINF_BUFFER_TOKEN_CHUNK_SIZE = 1000;  /* MR14 */
  51.                  /* L o o k a h e a d  M a c r o s */
  52. /* maximum of 32 bits/unsigned int and must be 8 bits/byte;
  53.  * we only use 8 bits of it.
  54.  */
  55. SetWordType ANTLRParser::bitmask[sizeof(SetWordType)*8] = {
  56. 0x00000001, 0x00000002, 0x00000004, 0x00000008,
  57. 0x00000010, 0x00000020, 0x00000040, 0x00000080
  58. };
  59. char ANTLRParser::eMsgBuffer[500] = "";
  60. ANTLRParser::
  61. ~ANTLRParser()
  62. {
  63. delete [] token_type;
  64. }
  65. ANTLRParser::
  66. ANTLRParser(ANTLRTokenBuffer *_inputTokens,
  67. int k,
  68. int use_inf_look,
  69. int dlook,
  70. int ssize)
  71. {
  72. LLk = k;
  73. can_use_inf_look = use_inf_look;
  74. /* MR14 */    if (dlook != 0) {
  75. /* MR14 */      panic("ANTLRParser::ANTLRParser - Demand lookahead not supported in C++ mode");
  76. /* MR14 */
  77. /* MR14 */    };
  78.     demand_look = 0;    /* demand_look = dlook; */
  79.     bsetsize = ssize;
  80. guessing = 0;
  81. token_tbl = NULL;
  82. eofToken = (ANTLRTokenType)1;
  83. // allocate lookahead buffer
  84. token_type = new ANTLRTokenType[LLk];
  85. lap = 0;
  86. labase = 0;
  87. dirty = 0;
  88.     inf_labase = 0;                                                     // MR7
  89.     inf_last = 0;                                                       // MR7
  90. /* prime lookahead buffer, point to inputTokens */
  91. this->inputTokens = _inputTokens;
  92. this->inputTokens->setMinTokens(k);
  93. _inputTokens->setParser(this);                     // MR1
  94.     resynchConsumed=1;                                                  // MR8
  95.     zzFAILtext=NULL;                                                    // MR9
  96.     traceOptionValueDefault=0;                                          // MR10
  97.     traceReset();                                                       // MR10
  98.     zzGuessSeq=0;                                                       // MR10
  99.     syntaxErrCount=0;                                                   // MR11
  100. }
  101. void ANTLRParser::init()
  102. {
  103.    prime_lookahead();
  104.    resynchConsumed=1;                                                   // MR8
  105.    traceReset();                                                        // MR10
  106. }
  107. void ANTLRParser::traceReset()
  108. {
  109.    traceOptionValue=traceOptionValueDefault;
  110.    traceGuessOptionValue=1;
  111.    traceCurrentRuleName=NULL;
  112.    traceDepth=0;
  113. }
  114. int ANTLRParser::
  115. guess(ANTLRParserState *st)
  116. {
  117. saveState(st);
  118. guessing = 1;
  119. return setjmp(guess_start.state);
  120. }
  121. void ANTLRParser::
  122. saveState(ANTLRParserState *buf)
  123. {
  124. buf->guess_start = guess_start;
  125. buf->guessing = guessing;
  126. buf->inf_labase = inf_labase;
  127. buf->inf_last = inf_last;
  128. buf->dirty = dirty;
  129.     buf->traceOptionValue=traceOptionValue;            /* MR10 */
  130.     buf->traceGuessOptionValue=traceGuessOptionValue;  /* MR10 */
  131.     buf->traceCurrentRuleName=traceCurrentRuleName;    /* MR10 */
  132.     buf->traceDepth=traceDepth;                        /* MR10 */
  133. }
  134. void ANTLRParser::
  135. restoreState(ANTLRParserState *buf)
  136. {
  137. int     i;
  138.     int     prevTraceOptionValue;
  139. guess_start = buf->guess_start;
  140. guessing = buf->guessing;
  141. inf_labase = buf->inf_labase;
  142. inf_last = buf->inf_last;
  143. dirty = buf->dirty;
  144. // restore lookahead buffer from k tokens before restored TokenBuffer position
  145. // if demand_look, then I guess we don't look backwards for these tokens.
  146. for (i=1; i<=LLk; i++) token_type[i-1] =
  147. inputTokens->bufferedToken(i-LLk)->getType();
  148. lap = 0;
  149. labase = 0;
  150.     /* MR10 */
  151.     prevTraceOptionValue=traceOptionValue;
  152.     traceOptionValue=buf->traceOptionValue;
  153.     if ( (prevTraceOptionValue > 0) !=
  154.              (traceOptionValue > 0)) {
  155.       if (traceOptionValue > 0) {
  156.         fprintf(stderr,"trace enable restored in rule %s depth %dn",traceCurrentRuleName,traceDepth);
  157.       };
  158.       if (traceOptionValue <= 0) {
  159.         fprintf(stderr,"trace disable restored in rule %s depth %dn",traceCurrentRuleName,traceDepth);
  160.       };
  161.     };
  162.     traceGuessOptionValue=buf->traceGuessOptionValue;
  163.     traceCurrentRuleName=buf->traceCurrentRuleName;
  164.     traceDepth=buf->traceDepth;
  165.     traceGuessDone(buf);
  166. }
  167. /* Get the next symbol from the input stream; put it into lookahead buffer;
  168.  * fill token_type[] fast reference cache also.  NLA is the next place where
  169.  * a lookahead ANTLRAbstractToken should go.
  170.  */
  171. void ANTLRParser::
  172. consume()
  173. {
  174. #ifdef ZZDEBUG_CONSUME_ACTION
  175.     zzdebug_consume_action();
  176. #endif
  177.     NLA = inputTokens->getToken()->getType();
  178. dirty--;
  179. lap = (lap+1)&(LLk-1);
  180. }
  181. _ANTLRTokenPtr ANTLRParser::
  182. LT(int i)
  183. {
  184. #ifdef DEBUG_TOKENBUFFER
  185. if ( i >= inputTokens->bufferSize() || inputTokens->minTokens() <= LLk )
  186. {
  187. static char buf[2000];
  188.         sprintf(buf, "The minimum number of tokens you requested that thenANTLRTokenBuffer buffer is not enough to satisfy yournLT(%d) request; increase 'k' argument to constructor for ANTLRTokenBuffern", i);
  189. panic(buf);
  190. }
  191. #endif
  192. return inputTokens->bufferedToken(i-LLk);
  193. }
  194. void
  195. ANTLRParser::
  196. look(int k)
  197. {
  198. int i, c = k - (LLk-dirty);
  199. for (i=1; i<=c; i++) consume();
  200. }
  201. /* fill the lookahead buffer up with k symbols (even if DEMAND_LOOK);
  202.  */
  203. void
  204. ANTLRParser::
  205. prime_lookahead()
  206. {
  207. int i;
  208. for(i=1;i<=LLk; i++) consume();
  209. dirty=0;
  210. // lap = 0;     // MR14 Sinan Karasu (sinan.karasu@boeing.com)
  211. // labase = 0;  // MR14
  212.     labase=lap;     // MR14
  213. }
  214. /* check to see if the current input symbol matches '_t'.
  215.  * During NON demand lookahead mode, dirty will always be 0 and
  216.  * hence the extra code for consuming tokens in _match is never
  217.  * executed; the same routine can be used for both modes.
  218.  */
  219. int ANTLRParser::
  220. _match(ANTLRTokenType _t, ANTLRChar **MissText,
  221.    ANTLRTokenType *MissTok, _ANTLRTokenPtr *BadTok,
  222.    SetWordType **MissSet)
  223. {
  224. if ( dirty==LLk ) {
  225. consume();
  226. }
  227. if ( LA(1)!=_t ) {
  228. *MissText=NULL;
  229. *MissTok= _t; *BadTok = LT(1);
  230. *MissSet=NULL;
  231. return 0;
  232. }
  233. dirty++;
  234. labase = (labase+1)&(LLk-1); // labase maintained even if !demand look
  235. return 1;
  236. }
  237. /* check to see if the current input symbol matches '_t'.
  238.  * Used during exception handling.
  239.  */
  240. int ANTLRParser::
  241. _match_wsig(ANTLRTokenType _t)
  242. {
  243. if ( dirty==LLk ) {
  244. consume();
  245. }
  246. if ( LA(1)!=_t ) return 0;
  247. dirty++;
  248. labase = (labase+1)&(LLk-1); // labase maintained even if !demand look
  249. return 1;
  250. }
  251. /* check to see if the current input symbol matches any token in a set.
  252.  * During NON demand lookahead mode, dirty will always be 0 and
  253.  * hence the extra code for consuming tokens in _match is never
  254.  * executed; the same routine can be used for both modes.
  255.  */
  256. int ANTLRParser::
  257. _setmatch(SetWordType *tset, ANTLRChar **MissText,
  258.    ANTLRTokenType *MissTok, _ANTLRTokenPtr *BadTok,
  259.    SetWordType **MissSet)
  260. {
  261. if ( dirty==LLk ) {
  262. consume();
  263. }
  264. if ( !set_el(LA(1), tset) ) {
  265. *MissText=NULL;
  266. *MissTok= (ANTLRTokenType)0; *BadTok=LT(1);
  267. *MissSet=tset;
  268. return 0;
  269. }
  270. dirty++;
  271. labase = (labase+1)&(LLk-1); // labase maintained even if !demand look
  272. return 1;
  273. }
  274. int ANTLRParser::
  275. _setmatch_wsig(SetWordType *tset)
  276. {
  277. if ( dirty==LLk ) {
  278. consume();
  279. }
  280. if ( !set_el(LA(1), tset) ) return 0;
  281. dirty++;
  282. labase = (labase+1)&(LLk-1); // labase maintained even if !demand look
  283. return 1;
  284. }
  285.                    /* Exception handling routines */
  286. //
  287. //  7-Apr-97 133MR1
  288. //         Change suggested by Eli Sternheim (eli@interhdl.com)
  289. //
  290. void ANTLRParser::
  291. consumeUntil(SetWordType *st)
  292. {
  293. ANTLRTokenType tmp;                          // MR1
  294. const int Eof=1;                                          // MR1
  295. while ( !set_el( (tmp=LA(1)), st) && tmp!=Eof) { consume(); }       // MR1
  296. }
  297. //
  298. //  7-Apr-97 133MR1
  299. //         Change suggested by Eli Sternheim (eli@interhdl.com)
  300. //
  301. void ANTLRParser::
  302. consumeUntilToken(int t)
  303. {
  304. int tmp;                                                            // MR1
  305. const int Eof=1;                                                  // MR1
  306. while ( (tmp=LA(1)) !=t && tmp!=Eof) { consume(); }                 // MR1
  307. }
  308.                         /* Old error stuff */
  309. void ANTLRParser::
  310. resynch(SetWordType *wd,SetWordType mask)
  311. {
  312. /* MR8              S.Bochnak@microtool.com.pl                          */
  313. /* MR8              Change file scope static "consumed" to instance var */
  314. /* if you enter here without having consumed a token from last resynch
  315.  * force a token consumption.
  316.  */
  317. /* MR8 */   if ( !resynchConsumed ) {consume(); resynchConsumed=1; return;}
  318.     /* if current token is in resynch set, we've got what we wanted */
  319. /* MR8 */   if ( wd[LA(1)]&mask || LA(1) == eofToken ) {resynchConsumed=0; return;}
  320.     /* scan until we find something in the resynch set */
  321.          while ( !(wd[LA(1)]&mask) && LA(1) != eofToken ) {consume();}
  322. /* MR8 */ resynchConsumed=1;
  323. }
  324. /* standard error reporting function that assumes DLG-based scanners;
  325.  * you should redefine in subclass to change it or if you use your
  326.  * own scanner.
  327.  */
  328. void ANTLRParser::
  329. syn(_ANTLRTokenPtr tok, ANTLRChar *egroup, SetWordType *eset,
  330. ANTLRTokenType etok, int k)
  331. {
  332. int line;
  333. line = LT(1)->getLine();
  334.     syntaxErrCount++;                                   /* MR11 */
  335. fprintf(stderr, "line %d: syntax error at "%s"",
  336. line, LT(1)->getText());
  337. if ( !etok && !eset ) {fprintf(stderr, "n"); return;}
  338. if ( k==1 ) fprintf(stderr, " missing");
  339. else
  340. {
  341. fprintf(stderr, "; "%s" not", LT(1)->getText());
  342. if ( set_deg(eset)>1 ) fprintf(stderr, " in");
  343. }
  344. if ( set_deg(eset)>0 ) edecode(eset);
  345. else fprintf(stderr, " %s", token_tbl[etok]);
  346. if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup);
  347. fprintf(stderr, "n");
  348. }
  349. /* is b an element of set p? */
  350. int ANTLRParser::
  351. set_el(ANTLRTokenType b, SetWordType *p)
  352. {
  353. return( p[DIVWORD(b)] & bitmask[MODWORD(b)] );
  354. }
  355. int ANTLRParser::
  356. set_deg(SetWordType *a)
  357. {
  358. /* Fast compute degree of a set... the number
  359.    of elements present in the set.  Assumes
  360.    that all word bits are used in the set
  361. */
  362. register SetWordType *p = a;
  363. register SetWordType *endp = &(a[bsetsize]);
  364. register int degree = 0;
  365. if ( a == NULL ) return 0;
  366. while ( p < endp )
  367. {
  368. register SetWordType t = *p;
  369. register SetWordType *b = &(bitmask[0]);
  370. do {
  371. if (t & *b) ++degree;
  372. } while (++b < &(bitmask[sizeof(SetWordType)*8]));
  373. p++;
  374. }
  375. return(degree);
  376. }
  377. void ANTLRParser::
  378. edecode(SetWordType *a)
  379. {
  380. register SetWordType *p = a;
  381. register SetWordType *endp = &(p[bsetsize]);
  382. register unsigned e = 0;
  383. if ( set_deg(a)>1 ) fprintf(stderr, " {");
  384. do {
  385. register SetWordType t = *p;
  386. register SetWordType *b = &(bitmask[0]);
  387. do {
  388. if ( t & *b ) fprintf(stderr, " %s", token_tbl[e]);
  389. e++;
  390. } while (++b < &(bitmask[sizeof(SetWordType)*8]));
  391. } while (++p < endp);
  392. if ( set_deg(a)>1 ) fprintf(stderr, " }");
  393. }
  394. /* input looks like:
  395.  *      zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk)
  396.  * where the zzMiss stuff is set here to the token that did not match
  397.  * (and which set wasn't it a member of).
  398.  */
  399. // MR9 29-Sep-97    Stan Bochnak (S.Bochnak@microTool.com.pl)
  400. // MR9              Original fix to static allocated text didn't
  401. // MR9                work because a pointer to it was passed back
  402. // MR9                to caller.  Replace with instance variable.
  403. const int   SETWORDCOUNT=20;
  404. void
  405. ANTLRParser::FAIL(int k, ...)
  406. {
  407. //
  408. //  MR1 10-Apr-97
  409. //
  410.     if (zzFAILtext == NULL) zzFAILtext=new char [1000];          // MR9
  411.     SetWordType **f=new SetWordType *[SETWORDCOUNT];             // MR1 // MR9
  412.     SetWordType **miss_set;
  413.     ANTLRChar **miss_text;
  414.     _ANTLRTokenPtr *bad_tok;
  415.     ANTLRChar **bad_text;
  416. //
  417. //  7-Apr-97 133MR1
  418. //   err_k is passed as a "int *", not "unsigned *"
  419. //
  420.     int *err_k;                                                         // MR1
  421.     int i;
  422.     va_list ap;
  423.     va_start(ap, k);
  424.     zzFAILtext[0] = '';
  425. if ( k > SETWORDCOUNT ) panic("FAIL: overflowed buffer");
  426.     for (i=1; i<=k; i++)    /* collect all lookahead sets */
  427.     {
  428.         f[i-1] = va_arg(ap, SetWordType *);
  429.     }
  430.     for (i=1; i<=k; i++)    /* look for offending token */
  431.     {
  432.         if ( i>1 ) strcat(zzFAILtext, " ");
  433.         strcat(zzFAILtext, LT(i)->getText());
  434.         if ( !set_el(LA(i), f[i-1]) ) break;
  435.     }
  436.     miss_set = va_arg(ap, SetWordType **);
  437.     miss_text = va_arg(ap, ANTLRChar **);
  438.     bad_tok = va_arg(ap, _ANTLRTokenPtr *);
  439.     bad_text = va_arg(ap, ANTLRChar **);
  440.     err_k = va_arg(ap, int *);                       // MR1
  441.     if ( i>k )
  442.     {
  443.         /* bad; lookahead is permutation that cannot be matched,
  444.          * but, the ith token of lookahead is valid at the ith position
  445.          * (The old LL sub 1 (k) versus LL(k) parsing technique)
  446.          */
  447.         *miss_set = NULL;
  448.         *miss_text = LT(1)->getText();
  449.         *bad_tok = LT(1);
  450.         *bad_text = (*bad_tok)->getText();
  451.         *err_k = k;
  452. //
  453. //  MR4 20-May-97 erroneously deleted contents of f[]
  454. //  MR4         reported by Bruce Guenter (bruceg@qcc.sk.ca)
  455. //  MR1 10-Apr-97 release temporary storage
  456. //
  457.       delete [] f;                                                      // MR1
  458.       return;                                                           // MR1
  459.     }
  460. /*  fprintf(stderr, "%s not in %dth setn", zztokens[LA(i)], i);*/
  461.     *miss_set = f[i-1];
  462.     *miss_text = zzFAILtext;
  463.     *bad_tok = LT(i);
  464.     *bad_text = (*bad_tok)->getText();
  465.     if ( i==1 ) *err_k = 1;
  466.     else *err_k = k;
  467. //
  468. //  MR4 20-May-97 erroneously deleted contents of f[]
  469. //  MR4       reported by Bruce Guenter (bruceg@qcc.sk.ca)
  470. //  MR1 10-Apr-97 release temporary storage
  471. //
  472.     delete [] f;                                                        // MR1
  473.     return;                                                             // MR1
  474. }
  475. int ANTLRParser::
  476. _match_wdfltsig(ANTLRTokenType tokenWanted, SetWordType *whatFollows)
  477. {
  478. if ( dirty==LLk ) consume();
  479. if ( LA(1)!=tokenWanted )
  480. {
  481.         syntaxErrCount++;                                   /* MR11 */
  482. fprintf(stderr,
  483. "line %d: syntax error at "%s" missing %sn",
  484. LT(1)->getLine(),
  485. (LA(1)==eofToken)?"<eof>":LT(1)->getText(),
  486. token_tbl[tokenWanted]);
  487. consumeUntil( whatFollows );
  488. return 0;
  489. }
  490. else {
  491. dirty++;
  492. labase = (labase+1)&(LLk-1); // labase maintained even if !demand look
  493. /* if ( !demand_look ) consume(); */
  494. return 1;
  495. }
  496. }
  497. int ANTLRParser::
  498. _setmatch_wdfltsig(SetWordType *tokensWanted,
  499. ANTLRTokenType tokenTypeOfSet,
  500. SetWordType *whatFollows)
  501. {
  502. if ( dirty==LLk ) consume();
  503. if ( !set_el(LA(1), tokensWanted) )
  504. {
  505.         syntaxErrCount++;                                   /* MR11 */
  506. fprintf(stderr,
  507. "line %d: syntax error at "%s" missing %sn",
  508. LT(1)->getLine(),
  509. (LA(1)==eofToken)?"<eof>":LT(1)->getText(),
  510. token_tbl[tokenTypeOfSet]);
  511. consumeUntil( whatFollows );
  512. return 0;
  513. }
  514. else {
  515. dirty++;
  516. labase = (labase+1)&(LLk-1); // labase maintained even if !demand look
  517. /* if ( !demand_look ) consume(); */
  518. return 1;
  519. }
  520. }
  521. char *ANTLRParser::
  522. eMsgd(char *err,int d)
  523. {
  524. sprintf(eMsgBuffer, err, d); // dangerous, but I don't care
  525. return eMsgBuffer;
  526. }
  527. char *ANTLRParser::
  528. eMsg(char *err, char *s)
  529. {
  530. sprintf(eMsgBuffer, err, s);
  531. return eMsgBuffer;
  532. }
  533. char *ANTLRParser::
  534. eMsg2(char *err,char *s, char *t)
  535. {
  536. sprintf(eMsgBuffer, err, s, t);
  537. return eMsgBuffer;
  538. }
  539. void ANTLRParser::
  540. panic(char *msg)
  541. {
  542. fprintf(stderr, "ANTLR panic: %sn", msg);
  543. exit(PCCTS_EXIT_FAILURE);           // MR1
  544. }
  545. const ANTLRChar *ANTLRParser::          // MR1
  546. parserTokenName(int tok) {              // MR1
  547. return token_tbl[tok];              // MR1
  548. }                                       // MR1
  549. void ANTLRParser::traceGuessDone(const ANTLRParserState *state) {
  550.   int   doIt=0;
  551.   if (traceCurrentRuleName == NULL) return;
  552.   if (traceOptionValue <= 0) {
  553.     doIt=0;
  554.   } else if (traceGuessOptionValue <= 0) {
  555.     doIt=0;
  556.   } else {
  557.     doIt=1;
  558.   };
  559.   if (doIt) {
  560.     fprintf(stderr,"guess done - returning to rule %s {"%s"} at depth %d",
  561.         state->traceCurrentRuleName,
  562.         LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),
  563.         state->traceDepth);
  564.     if (state->guessing != 0) {
  565.       fprintf(stderr," (guess mode continues - an enclosing guess is still active)");
  566.     } else {
  567.       fprintf(stderr," (guess mode ends)");
  568.     };
  569.     fprintf(stderr,"n");
  570.   };
  571. }
  572. void ANTLRParser::traceGuessFail() {
  573.   int   doIt=0;
  574.   if (traceOptionValue <= 0) {
  575.     doIt=0;
  576.   } else if (guessing && traceGuessOptionValue <= 0) {
  577.     doIt=0;
  578.   } else {
  579.     doIt=1;
  580.   };
  581.   if (doIt) {
  582.     fprintf(stderr,"guess failedn");
  583.   };
  584. }
  585. /* traceOption:
  586.      zero value turns off trace
  587. */
  588. void ANTLRParser::tracein(const ANTLRChar * rule) {
  589.   int       doIt=0;
  590.   traceDepth++;
  591.   traceCurrentRuleName=rule;
  592.   if (traceOptionValue <= 0) {
  593.     doIt=0;
  594.   } else if (guessing && traceGuessOptionValue <= 0) {
  595.     doIt=0;
  596.   } else {
  597.     doIt=1;
  598.   };
  599.   if (doIt) {
  600.     fprintf(stderr,"enter rule %s {"%s"} depth %d",
  601.             rule,
  602.             LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),
  603.             traceDepth);
  604.     if (guessing) fprintf(stderr," guessing");
  605.     fprintf(stderr,"n");
  606.   };
  607.   return;
  608. }
  609. void ANTLRParser::traceout(const ANTLRChar * rule) {
  610.   int       doIt=0;
  611.   traceDepth--;
  612.   if (traceOptionValue <= 0) {
  613.     doIt=0;
  614.   } else if (guessing && traceGuessOptionValue <= 0) {
  615.     doIt=0;
  616.   } else {
  617.     doIt=1;
  618.   };
  619.   if (doIt) {
  620.     fprintf(stderr,"exit rule %s {"%s"} depth %d",
  621.             rule,
  622.             LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),
  623.             traceDepth+1);
  624.     if (guessing) fprintf(stderr," guessing");
  625.     fprintf(stderr,"n");
  626.   };
  627. }
  628. int ANTLRParser::traceOption(int delta) {
  629.     int     prevValue=traceOptionValue;
  630.     traceOptionValue=traceOptionValue+delta;
  631.     if (traceCurrentRuleName != NULL) {
  632.       if (prevValue <= 0 && traceOptionValue > 0) {
  633.         fprintf(stderr,"trace enabled in rule %s depth %dn",traceCurrentRuleName,traceDepth);
  634.       };
  635.       if (prevValue > 0 && traceOptionValue <= 0) {
  636.         fprintf(stderr,"trace disabled in rule %s depth %dn",traceCurrentRuleName,traceDepth);
  637.       };
  638.     };
  639.     return  prevValue;
  640. }
  641. int ANTLRParser::traceGuessOption(int delta) {
  642.     int     prevValue=traceGuessOptionValue;
  643.     traceGuessOptionValue=traceGuessOptionValue+delta;
  644.     if (traceCurrentRuleName != NULL) {
  645.       if (prevValue <= 0 && traceGuessOptionValue > 0) {
  646.         fprintf(stderr,"guess trace enabled in rule %s depth %dn",traceCurrentRuleName,traceDepth);
  647.       };
  648.       if (prevValue > 0 && traceGuessOptionValue <= 0) {
  649.         fprintf(stderr,"guess trace disabled in rule %s depth %dn",traceCurrentRuleName,traceDepth);
  650.       };
  651.     };
  652.     return prevValue;
  653. }