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

编译器/解释器

开发平台:

Others

  1. /* ANTLRParser.h
  2.  *
  3.  * Define the generic ANTLRParser superclass, which is subclassed to
  4.  * define an actual parser.
  5.  *
  6.  * Before entry into this file: ANTLRTokenType must be set.
  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-1998
  33.  */
  34. #ifndef APARSER_H_GATE
  35. #define APARSER_H_GATE
  36. #include "pcctscfg.h"
  37. #include PCCTS_STDIO_H
  38. #include PCCTS_SETJMP_H
  39. PCCTS_NAMESPACE_STD
  40. #include ATOKEN_H
  41. #include ATOKENBUFFER_H
  42. #ifdef ZZCAN_GUESS
  43. #ifndef ZZINF_LOOK
  44. #define ZZINF_LOOK
  45. #endif
  46. #endif
  47. #define NLA (token_type[lap&(LLk-1)])/* --> next LA */
  48. typedef unsigned char SetWordType;
  49. /* Define external bit set stuff (for SetWordType) */
  50. #define EXT_WORDSIZE (sizeof(char)*8)
  51. #define EXT_LOGWORDSIZE 3
  52.            /* s y n t a c t i c  p r e d i c a t e  s t u f f */
  53. #ifndef zzUSER_GUESS_HOOK
  54. #define zzUSER_GUESS_HOOK(seqFrozen,zzrv)
  55. #endif
  56. #ifndef zzUSER_GUESS_DONE_HOOK
  57. #define zzUSER_GUESS_DONE_HOOK(seqFrozen)
  58. #endif
  59. /* MR14 Add zzUSER_GUESS_FAIL_HOOK and related code */
  60. #define zzUSER_GUESS_FAIL_HOOK_INTERNAL zzUSER_GUESS_FAIL_HOOK(SeqFrozen)
  61. #ifndef zzUSER_GUESS_FAIL_HOOK
  62. #define zzUSER_GUESS_FAIL_HOOK(zzGuessSeq)
  63. #endif
  64. typedef struct _zzjmp_buf {
  65. jmp_buf state;
  66. } zzjmp_buf;
  67. /* these need to be macros not member functions */
  68. #define zzGUESS_BLOCK ANTLRParserState zzst; int zzrv; int _marker; int zzGuessSeqFrozen;
  69. #define zzNON_GUESS_MODE if ( !guessing )
  70. #define zzGUESS_FAIL guess_fail();
  71. #define zzGUESS_DONE {zzrv=1; inputTokens->rewind(_marker); guess_done(&zzst);zzUSER_GUESS_DONE_HOOK(zzGuessSeqFrozen) }
  72. #define zzGUESS saveState(&zzst); 
  73. guessing = 1; 
  74.                             zzGuessSeqFrozen = ++zzGuessSeq; 
  75. _marker = inputTokens->mark(); 
  76. zzrv = setjmp(guess_start.state); 
  77.                             zzUSER_GUESS_HOOK(zzGuessSeqFrozen,zzrv) 
  78.     if ( zzrv ) zzGUESS_DONE
  79. #ifndef zzTRACE_RULES
  80. #define zzTRACEdata
  81. #else
  82. #ifndef zzTRACEdata
  83. #define zzTRACEdata     const ANTLRChar *zzTracePrevRuleName;
  84. #endif
  85. #endif
  86. #ifndef zzTRACEIN
  87. #define zzTRACEIN(r) zzTracePrevRuleName=traceCurrentRuleName;tracein(r);
  88. #endif
  89. #ifndef zzTRACEOUT
  90. #define zzTRACEOUT(r) traceout(r);traceCurrentRuleName=zzTracePrevRuleName;
  91. #endif
  92.                   /* a n t l r  p a r s e r  d e f */
  93. struct ANTLRParserState {
  94. /* class variables */
  95. zzjmp_buf guess_start;
  96. int guessing;
  97. int inf_labase;
  98. int inf_last;
  99. int dirty;
  100.     int             traceOptionValue;       // MR10
  101.     int             traceGuessOptionValue;  // MR10
  102.     const ANTLRChar *traceCurrentRuleName;  // MR10
  103.     int             traceDepth;             // MR10
  104. };
  105. /* notes:
  106.  *
  107.  * multiple inheritance is a cool way to include what stuff is needed
  108.  * in this structure (like guess stuff).  however, i'm not convinced that
  109.  * multiple inheritance works correctly on all platforms.  not that
  110.  * much space is used--just include all possibly useful members.
  111.  *
  112.  * the class should also be a template with arguments for the lookahead
  113.  * depth and so on.  that way, more than one parser can be defined (as
  114.  * each will probably have different lookahead requirements).  however,
  115.  * am i sure that templates work?  no, i'm not sure.
  116.  *
  117.  * no attributes are maintained and, hence, the 'asp' variable is not
  118.  * needed.  $i can still be referenced, but it refers to the token
  119.  * associated with that rule element.  question: where are the token's
  120.  * stored if not on the software stack?  in local variables created
  121.  * and assigned to by antlr.
  122.  */
  123. class ANTLRParser {
  124. protected:
  125. /* class variables */
  126. static SetWordType bitmask[sizeof(SetWordType)*8];
  127. static char eMsgBuffer[500];
  128. protected:
  129. int LLk; // number of lookahead symbols (old LL_K)
  130. int demand_look;
  131. ANTLRTokenType eofToken; // when do I stop during resynch()s
  132. int bsetsize;            // size of bitsets created by ANTLR in
  133.          // units of SetWordType
  134. ANTLRTokenBuffer *inputTokens; //place to get input tokens
  135. zzjmp_buf guess_start; // where to jump back to upon failure
  136. int guessing; // if guessing (using (...)? predicate)
  137. // infinite lookahead stuff
  138. int can_use_inf_look; // set by subclass (generated by ANTLR)
  139. int inf_lap;
  140. int inf_labase;
  141. int inf_last;
  142. int *_inf_line;
  143. ANTLRChar **token_tbl; // pointer to table of token type strings
  144. int dirty; // used during demand lookahead
  145. ANTLRTokenType *token_type; // fast reference cache of token.getType()
  146. // ANTLRLightweightToken **token; // the token with all its attributes
  147. int lap;
  148. int labase;
  149. private:
  150. void fill_inf_look();
  151. protected:
  152. virtual void guess_fail() {                         // MR9 27-Sep-97 make virtual
  153.         traceGuessFail();                               // MR10
  154.         longjmp(guess_start.state, 1); }                // MR9
  155. virtual void guess_done(ANTLRParserState *st) {     // MR9 27-Sep-97 make virtual
  156.          restoreState(st); }                            // MR9
  157. virtual int guess(ANTLRParserState *);              // MR9 27-Sep-97 make virtual
  158. void look(int);
  159.     int _match(ANTLRTokenType, ANTLRChar **, ANTLRTokenType *,
  160.    _ANTLRTokenPtr *, SetWordType **);
  161.     int _setmatch(SetWordType *, ANTLRChar **, ANTLRTokenType *,
  162.    _ANTLRTokenPtr *, SetWordType **);
  163.     int _match_wsig(ANTLRTokenType);
  164.     int _setmatch_wsig(SetWordType *);
  165.     virtual void consume();
  166.     void resynch(SetWordType *wd,SetWordType mask);
  167. void prime_lookahead();
  168. virtual void tracein(const ANTLRChar *r);              // MR10
  169. virtual void traceout(const ANTLRChar *r);             // MR10
  170. static unsigned MODWORD(unsigned x) {return x & (EXT_WORDSIZE-1);} // x % EXT_WORDSIZE // MR9
  171. static unsigned DIVWORD(unsigned x) {return x >> EXT_LOGWORDSIZE;} // x / EXT_WORDSIZE // MR9
  172. int set_deg(SetWordType *);
  173. int set_el(ANTLRTokenType, SetWordType *);
  174. virtual void edecode(SetWordType *); // MR1
  175. virtual void FAIL(int k, ...);     // MR1
  176.     int                 traceOptionValue;                           // MR10
  177.     int                 traceGuessOptionValue;                      // MR10
  178.     const ANTLRChar     *traceCurrentRuleName;                      // MR10
  179.     int                 traceDepth;                                 // MR10
  180.     void                traceReset();                               // MR10
  181.     virtual void        traceGuessFail();                           // MR10
  182.     virtual void        traceGuessDone(const ANTLRParserState *);   // MR10
  183.     int                 zzGuessSeq;                                 // MR10
  184. public:
  185. ANTLRParser(ANTLRTokenBuffer *,
  186. int k=1,
  187. int use_inf_look=0,
  188. int demand_look=0,
  189. int bsetsize=1);
  190. virtual ~ANTLRParser();
  191. virtual void init();
  192. ANTLRTokenType LA(int i)
  193. {
  194. //
  195. //  MR14 demand look will always be 0 for C++ mode
  196. //
  197. //// return demand_look ? token_type[(labase+(i)-1)&(LLk-1)] :
  198. //// token_type[(lap+(i)-1)&(LLk-1)];
  199. return token_type[(lap+(i)-1)&(LLk-1)];
  200. }
  201. _ANTLRTokenPtr LT(int i);
  202. void setEofToken(ANTLRTokenType t) { eofToken = t; }
  203. ANTLRTokenType getEofToken() const  { return eofToken; }    // MR14
  204. void noGarbageCollectTokens() { inputTokens->noGarbageCollectTokens(); }
  205. void garbageCollectTokens() { inputTokens->garbageCollectTokens(); }
  206.     virtual void syn(_ANTLRTokenPtr tok, ANTLRChar *egroup,
  207.  SetWordType *eset, ANTLRTokenType etok, int k);
  208. virtual void saveState(ANTLRParserState *);     // MR9 27-Sep-97 make virtual
  209. virtual void restoreState(ANTLRParserState *);  // MR9 27-Sep-97 make virtual
  210. virtual void panic(char *msg);
  211. static char *eMsgd(char *,int);
  212. static char *eMsg(char *,char *);
  213. static char *eMsg2(char *,char *,char *);
  214. void consumeUntil(SetWordType *st);
  215. void consumeUntilToken(int t);
  216. virtual int _setmatch_wdfltsig(SetWordType *tokensWanted,
  217.  ANTLRTokenType tokenTypeOfSet,
  218.  SetWordType *whatFollows);
  219. virtual int _match_wdfltsig(ANTLRTokenType tokenWanted,
  220.  SetWordType *whatFollows);
  221. const ANTLRChar * parserTokenName(int tok); // MR1
  222.     int                 traceOptionValueDefault;        // MR11
  223.     int                 traceOption(int delta);         // MR11
  224.     int                 traceGuessOption(int delta);    // MR11
  225. //  MR8  5-Aug-97   S.Bochnak@microtool.com.pl
  226. //  MR8             Move resynch static local variable
  227. //  MR8               to class instance
  228.     int                 syntaxErrCount;                      // MR12
  229.     ANTLRTokenStream   *getLexer() const {                   // MR12
  230.       return inputTokens ? inputTokens->getLexer() : 0; }    // MR12
  231. protected:                                              // MR8
  232.     int     resynchConsumed;                            // MR8
  233.     char    *zzFAILtext; // workarea required by zzFAIL // MR9
  234. };
  235. #define zzmatch(_t)
  236. if ( !_match((ANTLRTokenType)_t, &zzMissText, &zzMissTok, 
  237.  (_ANTLRTokenPtr *) &zzBadTok, &zzMissSet) ) goto fail;
  238. #define zzmatch_wsig(_t,handler)
  239. if ( !_match_wsig((ANTLRTokenType)_t) ) if ( guessing ) zzGUESS_FAIL else {_signal=MismatchedToken; goto handler;}
  240. #define zzsetmatch(_ts)
  241. if ( !_setmatch(_ts, &zzMissText, &zzMissTok, 
  242.  (_ANTLRTokenPtr *) &zzBadTok, &zzMissSet) ) goto fail;
  243. #define zzsetmatch_wsig(_ts, handler)
  244. if ( !_setmatch_wsig(_ts) ) if ( guessing ) zzGUESS_FAIL else {_signal=MismatchedToken; goto handler;}
  245. /* For the dflt signal matchers, a FALSE indicates that an error occurred
  246.  * just like the other matchers, but in this case, the routine has already
  247.  * recovered--we do NOT want to consume another token.  However, when
  248.  * the match was successful, we do want to consume hence _signal=0 so that
  249.  * a token is consumed by the "if (!_signal) consume(); _signal=NoSignal;"
  250.  * preamble.
  251.  */
  252. #define zzsetmatch_wdfltsig(tokensWanted, tokenTypeOfSet, whatFollows) 
  253. if ( !_setmatch_wdfltsig(tokensWanted, tokenTypeOfSet, whatFollows) ) 
  254. _signal = MismatchedToken;
  255. #define zzmatch_wdfltsig(tokenWanted, whatFollows) 
  256. if ( !_match_wdfltsig(tokenWanted, whatFollows) ) _signal = MismatchedToken;
  257. //  MR1  10-Apr-97  zzfailed_pred() macro does not backtrack
  258. //  MR1   in guess mode.
  259. //  MR1 Identification and correction due to J. Lilley
  260. #ifndef zzfailed_pred
  261. #define zzfailed_pred(_p) 
  262.   if (guessing) { 
  263.     zzGUESS_FAIL; 
  264.   } else { 
  265.     fprintf(stdout,"line %d: semantic error; failed predicate: '%s'n", 
  266. LT(1)->getLine(), _p); 
  267.   }
  268. #endif
  269. #define zzRULE 
  270. SetWordType *zzMissSet=NULL; ANTLRTokenType zzMissTok=(ANTLRTokenType)0;
  271. _ANTLRTokenPtr zzBadTok=NULL; ANTLRChar *zzBadText=(ANTLRChar *)"";
  272. int zzErrk=1,zzpf=0; 
  273.         zzTRACEdata 
  274. ANTLRChar *zzMissText=(ANTLRChar *)"";
  275. #endif
  276.         /* S t a n d a r d  E x c e p t i o n  S i g n a l s */
  277. #define NoSignal 0
  278. #define MismatchedToken 1
  279. #define NoViableAlt 2
  280. #define NoSemViableAlt 3
  281. /* MR7  Allow more control over signalling                                  */
  282. /*        by adding "Unwind" and "SetSignal"                                */
  283. #define Unwind              4
  284. #define setSignal(newValue) *_retsignal=_signal=(newValue)
  285. #define suppressSignal       *_retsignal=_signal=0
  286. #define exportSignal        *_retsignal=_signal