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.
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
25 * Parr Research Corporation
26 * with Purdue University and AHPCRC, University of Minnesota
35 * Define all of the stack setup and manipulation of $i, #i variables.
38 * The type 'Attrib' must be defined before entry into this .h file.
52 typedef int ANTLRTokenType;
53 typedef unsigned char SetWordType;
55 typedef char ANTLRChar;
57 /* G u e s s S t u f f */
66 typedef struct _zzjmp_buf {
72 /* can make this a power of 2 for more efficient lookup */
74 #define ZZLEXBUFSIZE 2000
80 fprintf(stderr, zzStackOvfMsg, __FILE__, __LINE__); \
81 exit(PCCTS_EXIT_FAILURE); \
85 #define ZZA_STACKSIZE 400
87 #ifndef ZZAST_STACKSIZE
88 #define ZZAST_STACKSIZE 400
92 #define zzfailed_pred(_p) \
93 fprintf(stderr, "semantic error; failed predicate: '%s'\n",_p)
98 int zztokenLA[LL_K]; \
99 char zztextLA[LL_K][ZZLEXBUFSIZE]; \
100 int zzlap = 0, zzlabase=0; /* labase only used for DEMAND_LOOK */
107 #define zzcr_ast(ast,attr,tok,text)
111 #define DemandLookData int zzdirty=1;
113 #define DemandLookData
116 /* S t a t e S t u f f */
119 #define zzGUESS_BLOCK zzantlr_state zzst; int zzrv;
120 #define zzGUESS zzsave_antlr_state(&zzst); \
122 zzrv = setjmp(zzguess_start.state);
123 #define zzGUESS_FAIL longjmp(zzguess_start.state, 1)
124 #define zzGUESS_DONE zzrestore_antlr_state(&zzst);
125 #define zzNON_GUESS_MODE if ( !zzguessing )
126 #define zzGuessData \
127 zzjmp_buf zzguess_start; \
130 #define zzGUESS_BLOCK
134 #define zzNON_GUESS_MODE
138 typedef struct _zzantlr_state {
140 zzjmp_buf guess_start;
146 int inf_lap; /* not sure we need to save this one */
156 char textLA[LL_K][ZZLEXBUFSIZE];
161 char text[ZZLEXBUFSIZE];
166 /* I n f i n i t e L o o k a h e a d */
170 #define InfLookData \
173 char *zzinf_text_buffer; \
183 #ifndef ZZINF_DEF_TEXT_BUFFER_SIZE
184 #define ZZINF_DEF_TEXT_BUFFER_SIZE 20000
186 #ifndef ZZINF_DEF_TOKEN_BUFFER_SIZE
187 #define ZZINF_DEF_TOKEN_BUFFER_SIZE 2000
190 * ZZINF_BUFFER_TEXT_CHUNK_SIZE must be > sizeof(text) largest possible token.
192 #ifndef ZZINF_BUFFER_TEXT_CHUNK_SIZE
193 #define ZZINF_BUFFER_TEXT_CHUNK_SIZE 5000
195 #ifndef ZZINF_BUFFER_TOKEN_CHUNK_SIZE
196 #define ZZINF_BUFFER_TOKEN_CHUNK_SIZE 1000
199 #if ZZLEXBUFSIZE > ZZINF_BUFFER_TEXT_CHUNK_SIZE
200 #define ZZINF_BUFFER_TEXT_CHUNK_SIZE ZZLEXBUFSIZE+5
203 /* make inf_look user-access macros */
205 #define ZZINF_LA_VALID(i) (((zzinf_labase+i-1)-LL_K+1) <= zzinf_last)
206 #define ZZINF_LA(i) zzinf_tokens[(zzinf_labase+i-1)-LL_K+1]
207 #define ZZINF_LATEXT(i) zzinf_text[(zzinf_labase+i-1)-LL_K+1]
208 /* #define ZZINF_LINE(i) zzinf_line[(zzinf_labase+i-1)-LL_K+1]*/
210 #define ZZINF_LA_VALID(i) (((zzinf_labase+i-1)) <= zzinf_last)
211 #define ZZINF_LA(i) zzinf_tokens[(zzinf_labase+i-1)]
212 #define ZZINF_LATEXT(i) zzinf_text[(zzinf_labase+i-1)]
215 #define inf_zzgettok _inf_zzgettok()
216 extern void _inf_zzgettok();
218 #endif /* ZZINF_LOOK */
225 Attrib zzempty_attr() {static Attrib a; return a;} \
226 Attrib zzconstr_attr(int _tok, char *_text)\
227 {Attrib a; zzcr_attr((&a),_tok,_text); return a;} \
228 int zzasp=ZZA_STACKSIZE; \
229 char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
230 Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData \
235 Attrib zzempty_attr() {static Attrib a; return a;} \
236 Attrib zzconstr_attr(_tok, _text) int _tok; char *_text;\
237 {Attrib a; zzcr_attr((&a),_tok,_text); return a;} \
238 int zzasp=ZZA_STACKSIZE; \
239 char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
240 Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData \
249 Attrib zzempty_attr() {static Attrib a; return a;} \
250 Attrib zzconstr_attr(int _tok, char *_text)\
251 {Attrib a; zzcr_attr((&a),_tok,_text); return a;} \
252 int zzasp=ZZA_STACKSIZE; \
253 char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
254 Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData \
259 Attrib zzempty_attr() {static Attrib a; return a;} \
260 Attrib zzconstr_attr(_tok, _text) int _tok; char *_text;\
261 {Attrib a; zzcr_attr((&a),_tok,_text); return a;} \
262 int zzasp=ZZA_STACKSIZE; \
263 char zzStackOvfMsg[]="fatal: attrib/AST stack overflow %s(%d)!\n"; \
264 Attrib zzaStack[ZZA_STACKSIZE]; DemandLookData \
276 #define zzPrimeLookAhead {zzdirty=LL_K; zzlap = zzlabase = 0;}
278 #define zzPrimeLookAhead {zzlap = zzlabase = 0; zzfill_inf_look();\
279 {int _i; for(_i=1;_i<=LL_K; _i++) \
280 {zzCONSUME;} zzlap = zzlabase = 0;}}
286 #define zzPrimeLookAhead zzfill_inf_look(); zzdirty=1
288 #define zzPrimeLookAhead zzfill_inf_look(); inf_zzgettok
293 #else /* ZZINF_LOOK */
297 #define zzPrimeLookAhead {zzdirty=LL_K; zzlap = zzlabase = 0;}
299 #define zzPrimeLookAhead {int _i; zzlap = 0; for(_i=1;_i<=LL_K; _i++) \
300 {zzCONSUME;} zzlap = 0;}
306 #define zzPrimeLookAhead zzdirty=1
308 #define zzPrimeLookAhead zzgettok()
312 #endif /* ZZINF_LOOK */
316 #define zzenterANTLRs(s) \
317 zzlextext = &(zztextLA[0][0]); zzrdstr( s ); zzPrimeLookAhead;
318 #define zzenterANTLRf(f) \
319 zzlextext = &(zztextLA[0][0]); zzrdfunc( f ); zzPrimeLookAhead;
320 #define zzenterANTLR(f) \
321 zzlextext = &(zztextLA[0][0]); zzrdstream( f ); zzPrimeLookAhead;
323 #define zzleaveANTLR(f) free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
324 #define zzleaveANTLRf(f) free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
325 #define zzleaveANTLRs(f) free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
327 #define zzleaveANTLR(f)
328 #define zzleaveANTLRf(f)
329 #define zzleaveANTLRs(f)
334 #define zzenterANTLRs(s) \
335 {static char zztoktext[ZZLEXBUFSIZE]; \
336 zzlextext = zztoktext; zzrdstr( s ); zzPrimeLookAhead;}
337 #define zzenterANTLRf(f) \
338 {static char zztoktext[ZZLEXBUFSIZE]; \
339 zzlextext = zztoktext; zzrdfunc( f ); zzPrimeLookAhead;}
340 #define zzenterANTLR(f) \
341 {static char zztoktext[ZZLEXBUFSIZE]; \
342 zzlextext = zztoktext; zzrdstream( f ); zzPrimeLookAhead;}
344 #define zzleaveANTLR(f) free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
345 #define zzleaveANTLRf(f) free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
346 #define zzleaveANTLRs(f) free(zzinf_text_buffer); free(zzinf_text); free(zzinf_tokens); free(zzinf_line);
348 #define zzleaveANTLR(f)
349 #define zzleaveANTLRf(f)
350 #define zzleaveANTLRs(f)
355 #define ANTLR(st, f) zzbufsize = ZZLEXBUFSIZE; \
360 #define ANTLRm(st, f, _m) zzbufsize = ZZLEXBUFSIZE; \
366 #define ANTLRf(st, f) zzbufsize = ZZLEXBUFSIZE; \
371 #define ANTLRs(st, s) zzbufsize = ZZLEXBUFSIZE; \
377 #define zztext (&(zztextLA[zzlap][0]))
379 #define zztext zzlextext
383 /* A r g u m e n t A c c e s s */
385 #define zzaCur (zzaStack[zzasp])
386 #define zzaRet (*zzaRetPtr)
387 #define zzaArg(v,n) zzaStack[v-n]
388 #define zzMakeAttr { zzNON_GUESS_MODE {zzOvfChk; --zzasp; zzcr_attr(&(zzaStack[zzasp]),LA(1),LATEXT(1));}}
390 #define zzMake0 { zzOvfChk; --zzasp; zzdef0(&(zzaStack[zzasp]));}
392 #define zzMake0 { zzOvfChk; --zzasp;}
394 #define zzaPush(_v) { zzOvfChk; zzaStack[--zzasp] = _v;}
396 #define zzREL(t) zzasp=(t); /* Restore state of stack */
398 #define zzREL(t) for (; zzasp<(t); zzasp++) \
399 { zzd_attr(&(zzaStack[zzasp])); }
402 #define zzsetmatch(_es) \
403 if ( !_zzsetmatch(_es, &zzBadText, &zzMissText, &zzMissTok, &zzBadTok, &zzMissSet) ) goto fail;
404 #define zzsetmatch_wsig(_es, handler) \
405 if ( !_zzsetmatch_wsig(_es) ) {_signal=MismatchedToken; goto handler;}
408 extern int _zzsetmatch(SetWordType *, char **, char **, int *, int *, SetWordType **);
409 extern int _zzsetmatch_wsig(SetWordType *);
411 extern int _zzsetmatch();
412 extern int _zzsetmatch_wsig();
415 #define zzmatch(_t) \
416 if ( !_zzmatch(_t, &zzBadText, &zzMissText, &zzMissTok, &zzBadTok, &zzMissSet) ) goto fail;
417 #define zzmatch_wsig(_t,handler) \
418 if ( !_zzmatch_wsig(_t) ) {_signal=MismatchedToken; goto handler;}
421 extern int _zzmatch(int, char **, char **, int *, int *, SetWordType **);
422 extern int _zzmatch_wsig(int);
424 extern int _zzmatch();
425 extern int _zzmatch_wsig();
428 #define zzmatch_wdfltsig(_t,_f) \
429 if ( !_zzmatch_wdfltsig(_t,_f) ) _signal=MismatchedToken;
430 #define zzsetmatch_wdfltsig(tw,tt,wf) \
431 if ( !_zzsetmatch_wdfltsig(tw,tt,wf) ) _signal=MismatchedToken;
434 extern int _zzmatch_wdfltsig(int, SetWordType *);
435 extern int _zzsetmatch_wdfltsig(SetWordType *tokensWanted,
437 SetWordType *whatFollows);
439 extern int _zzmatch_wdfltsig();
440 extern int _zzsetmatch_wdfltsig();
444 #define zzRULE Attrib *zzaRetPtr = &(zzaStack[zzasp-1]); \
445 SetWordType *zzMissSet=NULL; int zzMissTok=0; \
446 int zzBadTok=0; char *zzBadText=""; \
448 char *zzMissText=""; zzASTVars
450 #define zzRULE Attrib *zzaRetPtr = &(zzaStack[zzasp-1]); \
451 int zzBadTok=0; char *zzBadText=""; \
453 SetWordType *zzMissSet=NULL; int zzMissTok=0; char *zzMissText=""
457 #define zzBLOCK(i) int i = zzasp - 1; int zztsp = zzast_sp
458 #define zzEXIT(i) zzREL(i); zzastREL; zzNON_GUESS_MODE { zzastPush(*_root); }
459 #define zzLOOP(i) zzREL(i); zzastREL
461 #define zzBLOCK(i) int i = zzasp - 1
462 #define zzEXIT(i) zzREL(i)
463 #define zzLOOP(i) zzREL(i)
469 #define LOOK(_k) {int i,stop=_k-(LL_K-zzdirty); for (i=1; i<=stop; i++) \
471 #define zzCONSUME {zzgettok(); zzdirty--; \
472 zzlap = (zzlap+1)&(LL_K-1); \
473 zzlextext = &(zztextLA[zzlap][0]);}
476 #define zzCONSUME {inf_zzgettok; \
477 zzlap = (zzlap+1)&(LL_K-1); \
478 zzlextext = &(zztextLA[zzlap][0]); \
481 #define zzCONSUME {zzgettok(); \
482 zzlap = (zzlap+1)&(LL_K-1); \
483 zzlextext = &(zztextLA[zzlap][0]);}
484 #endif /* ZZINF_LOOK */
485 #endif /* DEMAND_LOOK */
490 #define LOOK(_k) if ( zzdirty) zzCONSUME;
492 #define zzCONSUME inf_zzgettok; zzdirty=0;
494 #define zzCONSUME zzgettok(); zzdirty=0;
495 #endif /* ZZINF_LOOK */
497 #else /* DEMAND_LOOK */
500 #define zzCONSUME inf_zzgettok
502 #define zzCONSUME zzgettok();
505 #endif /* DEMAND_LOOK */
510 #define NLA zztokenLA[zzlap&(LL_K-1)] /* --> next LA */
511 #define NLATEXT zztextLA[zzlap&(LL_K-1)] /* --> next text of LA */
513 #define LA(i) zztokenLA[(zzlabase+(i)-1)&(LL_K-1)]
514 #define LATEXT(i) (&(zztextLA[(zzlabase+(i)-1)&(LL_K-1)][0]))
516 #define LA(i) zztokenLA[(zzlap+(i)-1)&(LL_K-1)]
517 #define LATEXT(i) (&(zztextLA[(zzlap+(i)-1)&(LL_K-1)][0]))
521 #define NLATEXT zztext
522 #define LA(i) zztoken
523 #define LATEXT(i) zztext
527 /* S t a n d a r d S i g n a l s */
530 #define MismatchedToken 1
531 #define NoViableAlt 2
532 #define NoSemViableAlt 3
535 /* F u n c t i o n T r a c i n g */
538 #define zzTRACEIN(r) fprintf(stderr, "enter rule \"%s\"\n", r);
541 #define zzTRACEOUT(r) fprintf(stderr, "exit rule \"%s\"\n", r);
545 #define zzchar_t wchar_t
547 #define zzchar_t char
550 /* E x t e r n D e f s */
553 extern Attrib zzempty_attr();
554 extern Attrib zzconstr_attr(int, char *);
555 extern void zzsyn(char *, int, char *, SetWordType *, int, int, char *);
556 extern int zzset_el(unsigned, SetWordType *);
557 extern int zzset_deg(SetWordType *);
558 extern void zzedecode(SetWordType *);
559 extern void zzFAIL(int k, ...);
560 extern void zzresynch(SetWordType *, SetWordType);
561 extern void zzsave_antlr_state(zzantlr_state *);
562 extern void zzrestore_antlr_state(zzantlr_state *);
563 extern void zzfill_inf_look(void);
564 #ifdef EXCEPTION_HANDLING
565 extern void zzdflthandlers(int, int *);
568 extern Attrib zzempty_attr();
569 extern Attrib zzconstr_attr();
571 extern int zzset_el();
572 extern int zzset_deg();
573 extern void zzedecode();
574 extern void zzFAIL();
575 extern void zzresynch();
576 extern void zzsave_antlr_state();
577 extern void zzrestore_antlr_state();
578 extern void zzfill_inf_look();
579 #ifdef EXCEPTION_HANDLING
580 extern void zzdflthandlers();
584 /* G l o b a l V a r i a b l e s */
586 /* Define a parser; user should do a "#parser myname" in their grammar file */
587 /*extern struct pccts_parser zzparser;*/
589 extern char *zztokens[];
591 extern int zztokenLA[];
592 extern char zztextLA[][ZZLEXBUFSIZE];
599 extern char zzStackOvfMsg[];
601 extern Attrib zzaStack[];
603 extern int *zzinf_tokens;
604 extern char **zzinf_text;
605 extern char *zzinf_text_buffer;
606 extern int *zzinf_line;
607 extern int zzinf_labase;
608 extern int zzinf_last;
614 extern int zzguessing;
615 extern zzjmp_buf zzguess_start;
618 /* Define global veriables that refer to values exported by the scanner.
619 * These declarations duplicate those in dlgdef.h, but are needed
620 * if ANTLR is not to generate a .dlg file (-gx); PS, this is a hack.
622 extern zzchar_t *zzlextext; /* text of most recently matched token */
623 extern int zzbufsize; /* how long zzlextext is */