2 * A n t l r T r a n s l a t i o n H e a d e r
4 * Terence Parr, Will Cohen, and Hank Dietz: 1989-2001
5 * Purdue University Electrical Engineering
6 * With AHPCRC, University of Minnesota
7 * ANTLR Version 1.33MR33
9 * ..\bin\antlr dlg_p.g -gh
13 #define ANTLR_VERSION 13333
15 #include "pccts_stdio.h"
25 /* MR23 In order to remove calls to PURIFY use the antlr -nopurify option */
28 #define PCCTS_PURIFY(r,s) memset((char *) &(r),'\0',(s));
35 Fix for Borland C++ 4.x & 5.x compiling with ALL warnings enabled
39 #pragma warn -aus /* unused assignment of 'xxx' */
42 int action_no
= 0; /* keep track of actions outputed */
43 int nfa_allocated
= 0; /* keeps track of number of nfa nodes */
44 nfa_node
**nfa_array
= NULL
;/* root of binary tree that stores nfa array */
45 nfa_node nfa_model_node
; /* model to initialize new nodes */
46 set used_chars
; /* used to label trans. arcs */
47 set used_classes
; /* classes or chars used to label trans. arcs */
48 set normal_chars
; /* mask to get rid elements that aren't used
50 int flag_paren
= FALSE
;
51 int flag_brace
= FALSE
;
52 int mode_counter
= 0; /* keep track of number of %%names */
67 p_head(); p_class_hdr(); func_action
= FALSE
;
72 while ( (setwd1
[LA(1)]&0x1) ) {
77 if ( (LA(1)==LEXACTION
) ) {
78 zzmatch(LEXACTION
); zzCONSUME
;
81 if ( (LA(1)==LEXMEMBER
) ) {
82 zzmatch(LEXMEMBER
); zzCONSUME
;
85 if ( (LA(1)==LEXPREFIX
) ) {
86 zzmatch(LEXPREFIX
); zzCONSUME
;
89 if ( (LA(1)==PARSERCLASS
) ) {
90 zzmatch(PARSERCLASS
); zzCONSUME
;
93 if ( (LA(1)==ACTION
) ) {
95 else {zzFAIL(1,zzerr1
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
103 zzmatch(ACTION
); zzCONSUME
;
109 if ( gen_cpp
) p_includes();
111 func_action
= FALSE
; p_tables(); p_tail();
116 while ( (LA(1)==ACTION
) ) {
117 zzmatch(ACTION
); zzCONSUME
;
124 if (firstLexMember
!= 0) p_class_def1();
131 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
132 zzresynch(setwd1
, 0x2);
151 if ( (LA(1)==PER_PER
) ) {
152 zzmatch(PER_PER
); zzCONSUME
;
156 if ( (LA(1)==NAME_PER_PER
) ) {
157 zzmatch(NAME_PER_PER
); zzCONSUME
;
163 while ( (LA(1)==NAME_PER_PER
) ) {
164 zzmatch(NAME_PER_PER
); zzCONSUME
;
172 else {zzFAIL(1,zzerr2
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
177 zzmatch(PER_PER
); zzCONSUME
;
182 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
183 zzresynch(setwd1
, 0x4);
198 new_automaton_mode(); func_action
= TRUE
;
201 dfa_class_nop
[mode_counter
] =
202 relabel(zzaArg(zztasp1
,1 ).l
,comp_level
);
204 p_shift_table(mode_counter
);
205 dfa_basep
[mode_counter
] = dfa_allocated
+1;
206 make_dfa_model_node(dfa_class_nop
[mode_counter
]);
207 nfa_to_dfa(zzaArg(zztasp1
,1 ).l
);
211 fprint_hash_stats(stderr
);
217 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
218 zzresynch(setwd1
, 0x8);
233 if ( (setwd1
[LA(1)]&0x10) ) {
235 zzaRet
.l
=zzaArg(zztasp1
,1 ).l
; zzaRet
.r
=zzaArg(zztasp1
,1 ).r
;
240 while ( (setwd1
[LA(1)]&0x20) ) {
244 (t1
)->trans
[0]=zzaRet
.l
;
245 (t1
)->trans
[1]=zzaArg(zztasp2
,1 ).l
;
246 /* all accept nodes "dead ends" */
247 zzaRet
.l
=t1
; zzaRet
.r
=NULL
;
256 if ( (setwd1
[LA(1)]&0x40) ) {
257 zzaRet
.l
= new_nfa_node(); zzaRet
.r
= NULL
;
258 warning("no regular expressions", zzline
);
260 else {zzFAIL(1,zzerr3
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
266 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
267 zzresynch(setwd1
, 0x80);
282 if ( (setwd2
[LA(1)]&0x1) ) {
285 if (zzaArg(zztasp1
,1 ).r
!= NULL
) {
286 zzaRet
.l
=zzaArg(zztasp1
,1 ).l
; zzaRet
.r
=zzaArg(zztasp1
,1 ).r
; (zzaArg(zztasp1
,1 ).r
)->accept
=action_no
;
292 if ( (LA(1)==ACTION
) ) {
294 zzaRet
.l
= NULL
; zzaRet
.r
= NULL
;
295 error("no expression for action ", zzline
);
299 else {zzFAIL(1,zzerr4
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
305 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
306 zzresynch(setwd2
, 0x2);
322 zzaRet
.l
=zzaArg(zztasp1
,1 ).l
; zzaRet
.r
=zzaArg(zztasp1
,1 ).r
;
327 while ( (LA(1)==OR
) ) {
328 zzmatch(OR
); zzCONSUME
;
331 t1
= new_nfa_node(); t2
= new_nfa_node();
332 (t1
)->trans
[0]=zzaRet
.l
;
333 (t1
)->trans
[1]=zzaArg(zztasp2
,2 ).l
;
334 /* MR23 */ if (zzaRet
.r
!= NULL
) (zzaRet
.r
)->trans
[1]=t2
;
335 if (zzaArg(zztasp2
,2 ).r
) {
336 (zzaArg(zztasp2
,2 ).r
)->trans
[1]=t2
; /* MR20 */
338 zzaRet
.l
=t1
; zzaRet
.r
=t2
;
349 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
350 zzresynch(setwd2
, 0x4);
367 zzaRet
.l
=zzaArg(zztasp1
,1 ).l
; zzaRet
.r
=zzaArg(zztasp1
,1 ).r
;
372 while ( (setwd2
[LA(1)]&0x8) ) {
374 if (zzaRet
.r
!= NULL
) {
375 (zzaRet
.r
)->trans
[1]=zzaArg(zztasp2
,1 ).l
;
376 zzaRet
.r
=zzaArg(zztasp2
,1 ).r
;
387 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
388 zzresynch(setwd2
, 0x10);
403 if ( (setwd2
[LA(1)]&0x20) ) {
405 zzaRet
.l
=zzaArg(zztasp1
,1 ).l
; zzaRet
.r
=zzaArg(zztasp1
,1 ).r
;
410 if ( (LA(1)==ZERO_MORE
) ) {
413 /* MR23 */ if (zzaRet
.r
!= NULL
) (zzaRet
.r
)->trans
[0] = zzaRet
.l
;
414 t1
= new_nfa_node(); t2
= new_nfa_node();
415 t1
->trans
[0]=zzaRet
.l
;
417 /* MR23 */ if (zzaRet
.r
!= NULL
) (zzaRet
.r
)->trans
[1]=t2
;
418 zzaRet
.l
=t1
;zzaRet
.r
=t2
;
424 if ( (LA(1)==ONE_MORE
) ) {
426 if (zzaRet
.r
!= NULL
) (zzaRet
.r
)->trans
[0] = zzaRet
.l
;
431 if ( (setwd2
[LA(1)]&0x40) ) {
433 else {zzFAIL(1,zzerr5
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
441 if ( (LA(1)==ZERO_MORE
) ) {
443 error("no expression for *", zzline
);
448 if ( (LA(1)==ONE_MORE
) ) {
450 error("no expression for +", zzline
);
454 else {zzFAIL(1,zzerr6
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
461 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
462 zzresynch(setwd2
, 0x80);
477 zzaRet
.l
= new_nfa_node();
478 zzaRet
.r
= new_nfa_node();
479 if ( (LA(1)==L_BRACK
) ) {
480 zzmatch(L_BRACK
); zzCONSUME
;
484 /* MR23 */ if (zzaRet
.l
!= NULL
) {
485 (zzaRet
.l
)->trans
[0] = zzaRet
.r
;
486 (zzaRet
.l
)->label
= set_dup(zzaArg(zztasp1
,2 ).label
);
487 set_orin(&used_chars
,(zzaRet
.l
)->label
);
493 if ( (LA(1)==NOT
) ) {
494 zzmatch(NOT
); zzCONSUME
;
495 zzmatch(L_BRACK
); zzCONSUME
;
499 /* MR23 */ if (zzaRet
.l
!= NULL
) {
500 (zzaRet
.l
)->trans
[0] = zzaRet
.r
;
501 (zzaRet
.l
)->label
= set_dif(normal_chars
,zzaArg(zztasp1
,3 ).label
);
502 set_orin(&used_chars
,(zzaRet
.l
)->label
);
508 if ( (LA(1)==L_PAR
) ) {
509 zzmatch(L_PAR
); zzCONSUME
;
513 /* MR23 */ if (zzaRet
.l
!= NULL
) {
514 (zzaRet
.l
)->trans
[0] = zzaArg(zztasp1
,2 ).l
;
515 if (zzaArg(zztasp1
,2 ).r
) {
516 (zzaArg(zztasp1
,2 ).r
)->trans
[1] = zzaRet
.r
; /* MR20 */
523 if ( (LA(1)==L_BRACE
) ) {
524 zzmatch(L_BRACE
); zzCONSUME
;
528 /* MR23 */ if (zzaRet
.l
!= NULL
) {
529 (zzaRet
.l
)->trans
[0] = zzaArg(zztasp1
,2 ).l
;
530 (zzaRet
.l
)->trans
[1] = zzaRet
.r
;
531 if (zzaArg(zztasp1
,2 ).r
) {
532 (zzaArg(zztasp1
,2 ).r
)->trans
[1] = zzaRet
.r
; /* MR20 */
539 if ( (setwd3
[LA(1)]&0x1) ) {
542 /* MR23 */ if (zzaRet
.l
!= NULL
) {
543 (zzaRet
.l
)->trans
[0] = zzaRet
.r
;
544 (zzaRet
.l
)->label
= set_dup(zzaArg(zztasp1
,1 ).label
);
545 set_orin(&used_chars
,(zzaRet
.l
)->label
);
548 else {zzFAIL(1,zzerr7
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
557 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
558 zzresynch(setwd3
, 0x2);
573 set_free(zzaRet
.label
);
578 while ( (setwd3
[LA(1)]&0x4) ) {
580 set_orin(&(zzaRet
.label
),zzaArg(zztasp2
,1 ).label
);
590 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
591 zzresynch(setwd3
, 0x8);
607 register int i_prime
;
609 zzaRet
.letter
=zzaArg(zztasp1
,1 ).letter
; zzaRet
.label
=set_of(zzaArg(zztasp1
,1 ).letter
);
610 i_prime
= zzaArg(zztasp1
,1 ).letter
+ MIN_CHAR
;
611 if (case_insensitive
&& islower(i_prime
))
612 set_orel(toupper(i_prime
)-MIN_CHAR
,
614 if (case_insensitive
&& isupper(i_prime
))
615 set_orel(tolower(i_prime
)-MIN_CHAR
,
621 if ( (LA(1)==RANGE
) ) {
622 zzmatch(RANGE
); zzCONSUME
;
624 if (case_insensitive
){
625 i_prime
= zzaRet
.letter
+MIN_CHAR
;
626 zzaRet
.letter
= (islower(i_prime
) ?
627 toupper(i_prime
) : i_prime
)-MIN_CHAR
;
628 i_prime
= zzaArg(zztasp2
,2 ).letter
+MIN_CHAR
;
629 zzaArg(zztasp2
,2 ).letter
= (islower(i_prime
) ?
630 toupper(i_prime
) : i_prime
)-MIN_CHAR
;
632 /* check to see if range okay */
634 int debugLetter1
= zzaRet
.letter
;
635 int debugLetter2
= zzaArg(zztasp2
,2 ).letter
;
637 if (zzaRet
.letter
> zzaArg(zztasp2
,2 ).letter
638 && zzaArg(zztasp2
,2 ).letter
!= 0xff){ /* MR16 */
639 error("invalid range ", zzline
);
641 for (i
=zzaRet
.letter
; i
<= (int)zzaArg(zztasp2
,2 ).letter
; ++i
){
642 set_orel(i
,&(zzaRet
.label
));
643 i_prime
= i
+MIN_CHAR
;
644 if (case_insensitive
&& islower(i_prime
))
645 set_orel(toupper(i_prime
)-MIN_CHAR
,
647 if (case_insensitive
&& isupper(i_prime
))
648 set_orel(tolower(i_prime
)-MIN_CHAR
,
653 if ( (setwd3
[LA(1)]&0x10) ) {
655 else {zzFAIL(1,zzerr8
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
664 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
665 zzresynch(setwd3
, 0x20);
680 register int i_prime
;
682 zzaRet
.label
= set_of(zzaArg(zztasp1
,1 ).letter
);
683 i_prime
= zzaArg(zztasp1
,1 ).letter
+ MIN_CHAR
;
684 if (case_insensitive
&& islower(i_prime
))
685 set_orel(toupper(i_prime
)-MIN_CHAR
,
687 if (case_insensitive
&& isupper(i_prime
))
688 set_orel(tolower(i_prime
)-MIN_CHAR
,
694 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
695 zzresynch(setwd3
, 0x40);
710 if ( (LA(1)==REGCHAR
) ) {
712 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
717 if ( (LA(1)==OCTAL_VALUE
) ) {
718 zzmatch(OCTAL_VALUE
);
719 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
724 if ( (LA(1)==HEX_VALUE
) ) {
726 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
731 if ( (LA(1)==DEC_VALUE
) ) {
733 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
738 if ( (LA(1)==TAB
) ) {
740 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
747 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
754 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
761 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
766 if ( (LA(1)==LIT
) ) {
768 zzaRet
.letter
= zzaArg(zztasp1
,1 ).letter
- MIN_CHAR
;
773 if ( (LA(1)==L_EOF
) ) {
779 else {zzFAIL(1,zzerr9
,&zzMissSet
,&zzMissText
,&zzBadTok
,&zzBadText
,&zzErrk
); goto fail
;}
794 zzsyn(zzMissText
, zzBadTok
, (ANTLRChar
*)"", zzMissSet
, zzMissTok
, zzErrk
, zzBadText
);
795 zzresynch(setwd3
, 0x80);
799 /* adds a new nfa to the binary tree and returns a pointer to it */
807 register nfa_node
*t
;
808 static int nfa_size
=0; /* elements nfa_array[] can hold */
811 if (nfa_size
<=nfa_allocated
){
812 /* need to redo array */
814 /* need some to do inital allocation */
815 nfa_size
=nfa_allocated
+NFA_MIN
;
816 nfa_array
=(nfa_node
**) malloc(sizeof(nfa_node
*)*
819 /* need more space */
820 nfa_size
=2*(nfa_allocated
+1);
821 nfa_array
=(nfa_node
**) realloc(nfa_array
,
822 sizeof(nfa_node
*)*nfa_size
);
825 /* fill out entry in array */
826 t
= (nfa_node
*) malloc(sizeof(nfa_node
));
827 nfa_array
[nfa_allocated
] = t
;
829 t
->node_no
= nfa_allocated
;
834 /* initialize the model node used to fill in newly made nfa_nodes */
837 make_nfa_model_node(void)
839 make_nfa_model_node()
842 nfa_model_node
.node_no
= -1; /* impossible value for real nfa node */
843 nfa_model_node
.nfa_set
= 0;
844 nfa_model_node
.accept
= 0; /* error state default*/
845 nfa_model_node
.trans
[0] = NULL
;
846 nfa_model_node
.trans
[1] = NULL
;
847 nfa_model_node
.label
= empty
;
850 #if defined(DEBUG) || defined(_DEBUG)
852 /* print out the pointer value and the node_number */
855 fprint_dfa_pair(FILE *f
, nfa_node
*p
)
857 fprint_dfa_pair(f
, p
)
863 fprintf(f
, "%x (%d)", p
, p
->node_no
);
869 /* print out interest information on a set */
872 fprint_set(FILE *f
, set s
)
881 fprintf(f
, "n = %d,", s
.n
);
883 fprintf(f
, "setword = %x, ", s
.setword
);
884 /* print out all the elements in the set */
887 fprintf(f
, "%d ", *x
);
891 fprintf(f
, "setword = (nil)");
895 /* code to be able to dump out the nfas
896 return 0 if okay dump
897 return 1 if screwed up
901 dump_nfas(int first_node
, int last_node
)
903 dump_nfas(first_node
, last_node
)
911 for (i
=first_node
; i
<=last_node
; ++i
){
914 fprintf(stderr
, "nfa_node %d {\n", t
->node_no
);
915 fprintf(stderr
, "\n\tnfa_set = %d\n", t
->nfa_set
);
916 fprintf(stderr
, "\taccept\t=\t%d\n", t
->accept
);
917 fprintf(stderr
, "\ttrans\t=\t(");
918 fprint_dfa_pair(stderr
, t
->trans
[0]);
919 fprintf(stderr
, ",");
920 fprint_dfa_pair(stderr
, t
->trans
[1]);
921 fprintf(stderr
, ")\n");
922 fprintf(stderr
, "\tlabel\t=\t{ ");
923 fprint_set(stderr
, t
->label
);
924 fprintf(stderr
, "\t}\n");
925 fprintf(stderr
, "}\n\n");
931 /* DLG-specific syntax error message generator
932 * (define USER_ZZSYN when compiling so don't get 2 definitions)
936 zzsyn(char *text
, int tok
, char *egroup
, SetWordType
*eset
, int etok
, int k
, char *bad_text
)
938 zzsyn(text
, tok
, egroup
, eset
, etok
, k
, bad_text
)
939 char *text
, *egroup
, *bad_text
;
946 fprintf(stderr
, ErrHdr
, file_str
[0]!=NULL
?file_str
[0]:"stdin", zzline
);
947 fprintf(stderr
, " syntax error at \"%s\"", (tok
==zzEOF_TOKEN
)?"EOF":text
);
948 if ( !etok
&& !eset
) {fprintf(stderr
, "\n"); return;}
949 if ( k
==1 ) fprintf(stderr
, " missing");
952 fprintf(stderr
, "; \"%s\" not", bad_text
);
953 if ( zzset_deg(eset
)>1 ) fprintf(stderr
, " in");
955 if ( zzset_deg(eset
)>0 ) zzedecode(eset
);
956 else fprintf(stderr
, " %s", zztokens
[etok
]);
957 if ( strlen(egroup
) > (size_t)0 ) fprintf(stderr
, " in %s", egroup
);
958 fprintf(stderr
, "\n");