Home | History | Annotate | Download | only in h
      1 /* dlgauto.h automaton
      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  * Will Cohen and Terence Parr
     25  * Parr Research Corporation
     26  * with Purdue University and AHPCRC, University of Minnesota
     27  * 1989-2000
     28  */
     29 
     30 #ifndef ZZDEFAUTO_H
     31 #define ZZDEFAUTO_H
     32 
     33 /*  10-Apr-97 133MR1	Uses __USE_PROTOS show should #include pcctscfg.h */
     34 
     35 #include "pcctscfg.h"
     36 
     37 zzchar_t	*zzlextext;	/* text of most recently matched token */
     38 zzchar_t	*zzbegexpr;	/* beginning of last reg expr recogn. */
     39 zzchar_t	*zzendexpr;	/* beginning of last reg expr recogn. */
     40 int	zzbufsize = 0;	/* number of characters in zzlextext */          /* MR7 */
     41 int	zzbegcol = 0;	/* column that first character of token is in*/
     42 int	zzendcol = 0;	/* column that last character of token is in */
     43 int	zzline = 1;	/* line current token is on */
     44 int	zzreal_line=1;	/* line of 1st portion of token that is not skipped */
     45 int	zzchar;		/* character to determine next state */
     46 int	zzbufovf;	/* indicates that buffer too small for text */
     47 int	zzcharfull = 0;
     48 static zzchar_t	*zznextpos;/* points to next available position in zzlextext*/
     49 static int 	zzclass;
     50 
     51 #ifdef __USE_PROTOS
     52 void	zzerrstd(const char *);
     53 void	(*zzerr)(const char *)=zzerrstd;/* pointer to error reporting function */
     54 extern int	zzerr_in(void);
     55 static int	(*zzfunc_in)(void) = zzerr_in;  /* MR20 */
     56 #else
     57 void	zzerrstd();
     58 void	(*zzerr)()=zzerrstd;	/* pointer to error reporting function */
     59 extern int	zzerr_in();
     60 static int	(*zzfunc_in)() = zzerr_in;      /* MR20 */
     61 #endif
     62 
     63 static FILE	*zzstream_in=0;
     64 static zzchar_t	*zzstr_in=0;
     65 
     66 #ifdef USER_ZZMODE_STACK
     67 int 	          zzauto = 0;
     68 #else
     69 static int     zzauto = 0;
     70 #endif
     71 static int	zzadd_erase;
     72 static char 	zzebuf[70];
     73 
     74 #ifdef ZZCOL
     75 #define ZZINC (++zzendcol)
     76 #else
     77 #define ZZINC
     78 #endif
     79 
     80 
     81 #define ZZGETC_STREAM {zzchar = getc(zzstream_in); zzclass = ZZSHIFT(zzchar);}
     82 #define ZZGETC_FUNC {zzchar = (*zzfunc_in)(); zzclass = ZZSHIFT(zzchar);}
     83 #define ZZGETC_STR { 			\
     84 	if (*zzstr_in){				\
     85 		zzchar = *zzstr_in;		\
     86 		++zzstr_in;				\
     87 	}else{						\
     88 		zzchar = EOF;			\
     89 	}							\
     90 	zzclass = ZZSHIFT(zzchar);	\
     91 }
     92 
     93 #define ZZNEWSTATE	(newstate = dfa[state][zzclass])
     94 
     95 #ifndef ZZCOPY
     96 #define ZZCOPY	\
     97 	/* Truncate matching buffer to size (not an error) */	\
     98 	if (zznextpos < lastpos){				\
     99 		*(zznextpos++) = zzchar;			\
    100 	}else{							\
    101 		zzbufovf = 1;					\
    102 	}
    103 #endif
    104 
    105 void
    106 #ifdef __USE_PROTOS
    107 zzrdstream( FILE *f )
    108 #else
    109 zzrdstream( f )
    110 FILE *f;
    111 #endif
    112 {
    113 	/* make sure that it is really set to something, otherwise just
    114 	   leave it be.
    115 	*/
    116 	if (f){
    117 		/* make sure that there is always someplace to get input
    118 		   before closing zzstream_in
    119 		*/
    120 #if 0
    121 		if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
    122 #endif
    123 		zzline = 1;
    124 		zzstream_in = f;
    125 		zzfunc_in = NULL;
    126 		zzstr_in = 0;
    127 		zzcharfull = 0;
    128 	}
    129 }
    130 
    131 void
    132 #ifdef __USE_PROTOS
    133 zzrdfunc( int (*f)(void) )
    134 #else
    135 zzrdfunc( f )
    136 int (*f)();
    137 #endif
    138 {
    139 	/* make sure that it is really set to something, otherwise just
    140 	   leave it be.
    141 	*/
    142 	if (f){
    143 		/* make sure that there is always someplace to get input
    144 		   before closing zzstream_in
    145 		*/
    146 #if 0
    147 		if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
    148 #endif
    149 		zzline = 1;
    150 		zzstream_in = NULL;
    151 		zzfunc_in = f;
    152 		zzstr_in = 0;
    153 		zzcharfull = 0;
    154 	}
    155 }
    156 
    157 
    158 void
    159 #ifdef __USE_PROTOS
    160 zzrdstr( zzchar_t *s )
    161 #else
    162 zzrdstr( s )
    163 zzchar_t *s;
    164 #endif
    165 {
    166 	/* make sure that it is really set to something, otherwise just
    167 	   leave it be.
    168 	*/
    169 	if (s){
    170 		/* make sure that there is always someplace to get input
    171 		   before closing zzstream_in
    172 		*/
    173 #if 0
    174 		if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );
    175 #endif
    176 		zzline = 1;
    177 		zzstream_in = NULL;
    178 		zzfunc_in = 0;
    179 		zzstr_in = s;
    180 		zzcharfull = 0;
    181 	}
    182 }
    183 
    184 
    185 #ifdef __USE_PROTOS
    186 void zzclose_stream(void)
    187 #else
    188 void zzclose_stream()
    189 #endif
    190 {
    191 #if 0
    192 	fclose( zzstream_in );
    193 	zzstream_in = NULL;
    194 	zzfunc_in = NULL;
    195 #endif
    196 }
    197 
    198 /* saves dlg state, but not what feeds dlg (such as file position) */
    199 void
    200 #ifdef __USE_PROTOS
    201 zzsave_dlg_state(struct zzdlg_state *state)
    202 #else
    203 zzsave_dlg_state(state)
    204 struct zzdlg_state *state;
    205 #endif
    206 {
    207 	state->stream = zzstream_in;
    208 	state->func_ptr = zzfunc_in;
    209 	state->str = zzstr_in;
    210 	state->auto_num = zzauto;
    211 	state->add_erase = zzadd_erase;
    212 	state->lookc = zzchar;
    213 	state->char_full = zzcharfull;
    214 	state->begcol = zzbegcol;
    215 	state->endcol = zzendcol;
    216 	state->line = zzline;
    217 	state->lextext = zzlextext;
    218 	state->begexpr = zzbegexpr;
    219 	state->endexpr = zzendexpr;
    220 	state->bufsize = zzbufsize;
    221 	state->bufovf = zzbufovf;
    222 	state->nextpos = zznextpos;
    223 	state->class_num = zzclass;
    224 }
    225 
    226 void
    227 #ifdef __USE_PROTOS
    228 zzrestore_dlg_state(struct zzdlg_state *state)
    229 #else
    230 zzrestore_dlg_state(state)
    231 struct zzdlg_state *state;
    232 #endif
    233 {
    234 	zzstream_in = state->stream;
    235 	zzfunc_in = state->func_ptr;
    236 	zzstr_in = state->str;
    237 	zzauto = state->auto_num;
    238 	zzadd_erase = state->add_erase;
    239 	zzchar = state->lookc;
    240 	zzcharfull = state->char_full;
    241 	zzbegcol = state->begcol;
    242 	zzendcol = state->endcol;
    243 	zzline = state->line;
    244 	zzlextext = state->lextext;
    245 	zzbegexpr = state->begexpr;
    246 	zzendexpr = state->endexpr;
    247 	zzbufsize = state->bufsize;
    248 	zzbufovf = state->bufovf;
    249 	zznextpos = state->nextpos;
    250 	zzclass = state->class_num;
    251 }
    252 
    253 void
    254 #ifdef __USE_PROTOS
    255 zzmode( int m )
    256 #else
    257 zzmode( m )
    258 int m;
    259 #endif
    260 {
    261 	/* points to base of dfa table */
    262 	if (m<MAX_MODE){
    263 		zzauto = m;
    264 		/* have to redo class since using different compression */
    265 		zzclass = ZZSHIFT(zzchar);
    266 	}else{
    267 		sprintf(zzebuf,"Invalid automaton mode = %d ",m);
    268 		zzerr(zzebuf);
    269 	}
    270 }
    271 
    272 /* erase what is currently in the buffer, and get a new reg. expr */
    273 
    274 #ifdef __USE_PROTOS
    275 void zzskip(void)
    276 #else
    277 void zzskip()
    278 #endif
    279 {
    280 	zzadd_erase = 1;
    281 }
    282 
    283 /* don't erase what is in the zzlextext buffer, add on to it */
    284 #ifdef __USE_PROTOS
    285 void zzmore()
    286 #else
    287 void zzmore()
    288 #endif
    289 {
    290 	zzadd_erase = 2;
    291 }
    292 
    293 /* substitute c for the reg. expr last matched and is in the buffer */
    294 #ifdef __USE_PROTOS
    295 void
    296 zzreplchar(zzchar_t c)
    297 #else
    298 void
    299 zzreplchar(c)
    300 zzchar_t c;
    301 #endif
    302 {
    303 	/* can't allow overwriting null at end of string */
    304 	if (zzbegexpr < &zzlextext[zzbufsize-1]){
    305 		*zzbegexpr = c;
    306 		*(zzbegexpr+1) = '\0';
    307 	}
    308 	zzendexpr = zzbegexpr;
    309 	if (c != '\0') {
    310 		zznextpos = zzbegexpr + 1;
    311 	}
    312 	else {
    313 		zznextpos = zzbegexpr;	/* MR30 Zero terminates string. */
    314 	}
    315 }
    316 
    317 /* replace the string s for the reg. expr last matched and in the buffer */
    318 void
    319 #ifdef __USE_PROTOS
    320 zzreplstr(register zzchar_t *s)
    321 #else
    322 zzreplstr(s)
    323 register zzchar_t *s;
    324 #endif
    325 {
    326 	register zzchar_t *l= &zzlextext[zzbufsize -1];
    327 
    328 	zznextpos = zzbegexpr;
    329 	if (s){
    330 	 	while ((zznextpos <= l) && (*(zznextpos++) = *(s++))!=0){
    331 			/* empty */
    332 		}
    333 		/* correct for NULL at end of string */
    334 		zznextpos--;
    335 	}
    336 	if ((zznextpos <= l) && (*(--s) == 0)){
    337 		zzbufovf = 0;
    338 	}else{
    339 		zzbufovf = 1;
    340 	}
    341 	*(zznextpos) = '\0';
    342 	zzendexpr = zznextpos - 1;
    343 }
    344 
    345 #ifdef __USE_PROTOS
    346 void zzgettok(void)
    347 #else
    348 void zzgettok()
    349 #endif
    350 {
    351 	register int state, newstate;
    352 	/* last space reserved for the null char */
    353 	zzchar_t *lastpos;  /* MR27 Remove register since address operator used. */
    354 
    355 skip:
    356 	zzreal_line = zzline;
    357 	zzbufovf = 0;
    358 	lastpos = &zzlextext[zzbufsize-1];
    359 	zznextpos = zzlextext;
    360 	zzbegcol = zzendcol+1;
    361 more:
    362 	zzbegexpr = zznextpos;
    363 #ifdef ZZINTERACTIVE
    364 	/* interactive version of automaton */
    365 	/* if there is something in zzchar, process it */
    366 	state = newstate = dfa_base[zzauto];
    367 	if (zzcharfull){
    368 		ZZINC;
    369 		ZZCOPY;
    370 		ZZNEWSTATE;
    371 	}
    372 	if (zzstr_in)
    373 		while (zzalternatives[newstate]){
    374 			state = newstate;
    375 			ZZGETC_STR;
    376 			ZZINC;
    377 			ZZCOPY;
    378 			ZZNEWSTATE;
    379 		}
    380 	else if (zzstream_in)
    381 		while (zzalternatives[newstate]){
    382 			state = newstate;
    383 			ZZGETC_STREAM;
    384 			ZZINC;
    385 			ZZCOPY;
    386 			ZZNEWSTATE;
    387 		}
    388 	else if (zzfunc_in)
    389 		while (zzalternatives[newstate]){
    390 			state = newstate;
    391 			ZZGETC_FUNC;
    392 			ZZINC;
    393 			ZZCOPY;
    394 			ZZNEWSTATE;
    395 		}
    396 	/* figure out if last character really part of token */
    397 	if ((state != dfa_base[zzauto]) && (newstate == DfaStates)){
    398 		zzcharfull = 1;
    399 		--zznextpos;
    400 	}else{
    401 		zzcharfull = 0;
    402 		state = newstate;
    403 	}
    404 	*(zznextpos) = '\0';
    405 	/* Able to transition out of start state to some non err state?*/
    406 	if ( state == dfa_base[zzauto] ){
    407 		/* make sure doesn't get stuck */
    408 		zzadvance();
    409 	}
    410 #else
    411 	/* non-interactive version of automaton */
    412 	if (!zzcharfull)
    413 		zzadvance();
    414 	else
    415 		ZZINC;
    416 	state = dfa_base[zzauto];
    417 	if (zzstr_in)
    418 		while (ZZNEWSTATE != DfaStates){
    419 			state = newstate;
    420 			ZZCOPY;
    421 			ZZGETC_STR;
    422 			ZZINC;
    423 		}
    424 	else if (zzstream_in)
    425 		while (ZZNEWSTATE != DfaStates){
    426 			state = newstate;
    427 			ZZCOPY;
    428 			ZZGETC_STREAM;
    429 			ZZINC;
    430 		}
    431 	else if (zzfunc_in)
    432 		while (ZZNEWSTATE != DfaStates){
    433 			state = newstate;
    434 			ZZCOPY;
    435 			ZZGETC_FUNC;
    436 			ZZINC;
    437 		}
    438 	zzcharfull = 1;
    439 	if ( state == dfa_base[zzauto] ){
    440 		if (zznextpos < lastpos){
    441 			*(zznextpos++) = zzchar;
    442 		}else{
    443 			zzbufovf = 1;
    444 		}
    445 		*zznextpos = '\0';
    446 		/* make sure doesn't get stuck */
    447 		zzadvance();
    448 	}else{
    449 		*zznextpos = '\0';
    450 	}
    451 #endif
    452 #ifdef ZZCOL
    453 	zzendcol -= zzcharfull;
    454 #endif
    455 	zzendexpr = zznextpos -1;
    456 	zzadd_erase = 0;
    457 	(*actions[accepts[state]])();
    458 	switch (zzadd_erase) {
    459 		case 1: goto skip;
    460 		case 2: goto more;
    461 	}
    462 }
    463 
    464 #ifdef __USE_PROTOS
    465 void zzadvance(void)
    466 #else
    467 void zzadvance()
    468 #endif
    469 {
    470 	if (zzstream_in) { ZZGETC_STREAM; zzcharfull = 1; ZZINC;}
    471 	if (zzfunc_in) { ZZGETC_FUNC; zzcharfull = 1; ZZINC;}
    472 	if (zzstr_in) { ZZGETC_STR; zzcharfull = 1; ZZINC;}
    473 	if (!(zzstream_in || zzfunc_in || zzstr_in)){
    474 		zzerr_in();
    475 	}
    476 }
    477 
    478 void
    479 #ifdef __USE_PROTOS
    480 zzerrstd(const char *s)
    481 #else
    482 zzerrstd(s)
    483 char *s;
    484 #endif
    485 {
    486         zzLexErrCount++;                /* MR11 */
    487         fprintf(stderr,
    488                 "%s near line %d (text was '%s')\n",
    489                 ((s == NULL) ? "Lexical error" : s),
    490                 zzline,zzlextext);
    491 }
    492 
    493 #ifdef __USE_PROTOS
    494 int zzerr_in(void)
    495 #else
    496 int zzerr_in()
    497 #endif
    498 {
    499 	fprintf(stderr,"No input stream, function, or string\n");
    500 	/* return eof to get out gracefully */
    501 	return EOF;
    502 }
    503 
    504 #endif
    505