ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/lsys/antlr/AParser.h
Revision: 1.1
Committed: Thu Nov 6 14:31:24 2008 UTC (15 years, 6 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
*** empty log message ***

File Contents

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