dlgauto.h
来自「本工具提供一个词法分析器和语法分析器的集成开发环境」· C头文件 代码 · 共 480 行
H
480 行
/* dlgauto.h automaton * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to the Purdue Compiler Construction Tool * Set (PCCTS) -- PCCTS is in the public domain. An individual or * company may do whatever they wish with source code distributed with * PCCTS or the code generated by PCCTS, including the incorporation of * PCCTS, or its output, into commerical software. * * We encourage users to develop software with PCCTS. However, we do ask * that credit is given to us for developing PCCTS. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like PCCTS and have developed a nice tool with the * output, please mention that you developed it using PCCTS. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * ANTLR 1.33 * Will Cohen and Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-1998 */#ifndef ZZDEFAUTO_H#define ZZDEFAUTO_H/* 10-Apr-97 133MR1 Uses __USE_PROTOS show should #include pcctscfg.h */#include "pcctscfg.h"zzchar_t *zzlextext; /* text of most recently matched token */zzchar_t *zzbegexpr; /* beginning of last reg expr recogn. */zzchar_t *zzendexpr; /* beginning of last reg expr recogn. */int zzbufsize = 0; /* number of characters in zzlextext */ /* MR7 */int zzbegcol = 0; /* column that first character of token is in*/int zzendcol = 0; /* column that last character of token is in */int zzline = 1; /* line current token is on */int zzreal_line=1; /* line of 1st portion of token that is not skipped */int zzchar; /* character to determine next state */int zzbufovf; /* indicates that buffer too small for text */int zzcharfull = 0;static zzchar_t *zznextpos;/* points to next available position in zzlextext*/static int zzclass;#ifdef __USE_PROTOSvoid zzerrstd(const char *);void (*zzerr)(const char *)=zzerrstd;/* pointer to error reporting function */extern int zzerr_in(void);#elsevoid zzerrstd();void (*zzerr)()=zzerrstd; /* pointer to error reporting function */extern int zzerr_in();#endifstatic FILE *zzstream_in=0;static int (*zzfunc_in)() = zzerr_in;static zzchar_t *zzstr_in=0;#ifdef USER_ZZMODE_STACKint zzauto = 0;#elsestatic int zzauto = 0;#endifstatic int zzadd_erase;static char zzebuf[70];#ifdef ZZCOL#define ZZINC (++zzendcol)#else#define ZZINC#endif#define ZZGETC_STREAM {zzchar = getc(zzstream_in); zzclass = ZZSHIFT(zzchar);}#define ZZGETC_FUNC {zzchar = (*zzfunc_in)(); zzclass = ZZSHIFT(zzchar);}#define ZZGETC_STR { \ if (*zzstr_in){ \ zzchar = *zzstr_in; \ ++zzstr_in; \ }else{ \ zzchar = EOF; \ } \ zzclass = ZZSHIFT(zzchar); \}#define ZZNEWSTATE (newstate = dfa[state][zzclass])#ifndef ZZCOPY#define ZZCOPY \ /* Truncate matching buffer to size (not an error) */ \ if (zznextpos < lastpos){ \ *(zznextpos++) = zzchar; \ }else{ \ zzbufovf = 1; \ }#endifvoid#ifdef __USE_PROTOSzzrdstream( FILE *f )#elsezzrdstream( f )FILE *f;#endif{ /* make sure that it is really set to something, otherwise just leave it be. */ if (f){ /* make sure that there is always someplace to get input before closing zzstream_in */#if 0 if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );#endif zzline = 1; zzstream_in = f; zzfunc_in = NULL; zzstr_in = 0; zzcharfull = 0; }}void#ifdef __USE_PROTOSzzrdfunc( int (*f)() )#elsezzrdfunc( f )int (*f)();#endif{ /* make sure that it is really set to something, otherwise just leave it be. */ if (f){ /* make sure that there is always someplace to get input before closing zzstream_in */#if 0 if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );#endif zzline = 1; zzstream_in = NULL; zzfunc_in = f; zzstr_in = 0; zzcharfull = 0; }}void#ifdef __USE_PROTOSzzrdstr( zzchar_t *s )#elsezzrdstr( s )zzchar_t *s;#endif{ /* make sure that it is really set to something, otherwise just leave it be. */ if (s){ /* make sure that there is always someplace to get input before closing zzstream_in */#if 0 if (zzstream_in && zzstream_in!=stdin) fclose( zzstream_in );#endif zzline = 1; zzstream_in = NULL; zzfunc_in = 0; zzstr_in = s; zzcharfull = 0; }}voidzzclose_stream(){#if 0 fclose( zzstream_in ); zzstream_in = NULL; zzfunc_in = NULL;#endif}/* saves dlg state, but not what feeds dlg (such as file position) */void#ifdef __USE_PROTOSzzsave_dlg_state(struct zzdlg_state *state)#elsezzsave_dlg_state(state)struct zzdlg_state *state;#endif{ state->stream = zzstream_in; state->func_ptr = zzfunc_in; state->str = zzstr_in; state->auto_num = zzauto; state->add_erase = zzadd_erase; state->lookc = zzchar; state->char_full = zzcharfull; state->begcol = zzbegcol; state->endcol = zzendcol; state->line = zzline; state->lextext = zzlextext; state->begexpr = zzbegexpr; state->endexpr = zzendexpr; state->bufsize = zzbufsize; state->bufovf = zzbufovf; state->nextpos = zznextpos; state->class_num = zzclass;}void#ifdef __USE_PROTOSzzrestore_dlg_state(struct zzdlg_state *state)#elsezzrestore_dlg_state(state)struct zzdlg_state *state;#endif{ zzstream_in = state->stream; zzfunc_in = state->func_ptr; zzstr_in = state->str; zzauto = state->auto_num; zzadd_erase = state->add_erase; zzchar = state->lookc; zzcharfull = state->char_full; zzbegcol = state->begcol; zzendcol = state->endcol; zzline = state->line; zzlextext = state->lextext; zzbegexpr = state->begexpr; zzendexpr = state->endexpr; zzbufsize = state->bufsize; zzbufovf = state->bufovf; zznextpos = state->nextpos; zzclass = state->class_num;}void#ifdef __USE_PROTOSzzmode( int m )#elsezzmode( m )int m;#endif{ /* points to base of dfa table */ if (m<MAX_MODE){ zzauto = m; /* have to redo class since using different compression */ zzclass = ZZSHIFT(zzchar); }else{ sprintf(zzebuf,"Invalid automaton mode = %d ",m); zzerr(zzebuf); }}/* erase what is currently in the buffer, and get a new reg. expr */voidzzskip(){ zzadd_erase = 1;}/* don't erase what is in the zzlextext buffer, add on to it */voidzzmore(){ zzadd_erase = 2;}/* substitute c for the reg. expr last matched and is in the buffer */#ifdef __USE_PROTOSvoidzzreplchar(zzchar_t c)#elsevoidzzreplchar(c)zzchar_t c;#endif{ /* can't allow overwriting null at end of string */ if (zzbegexpr < &zzlextext[zzbufsize-1]){ *zzbegexpr = c; *(zzbegexpr+1) = '\0'; } zzendexpr = zzbegexpr; zznextpos = zzbegexpr + 1;}/* replace the string s for the reg. expr last matched and in the buffer */void#ifdef __USE_PROTOSzzreplstr(register zzchar_t *s)#elsezzreplstr(s)register zzchar_t *s;#endif{ register zzchar_t *l= &zzlextext[zzbufsize -1]; zznextpos = zzbegexpr; if (s){ while ((zznextpos <= l) && (*(zznextpos++) = *(s++))!=0){ /* empty */ } /* correct for NULL at end of string */ zznextpos--; } if ((zznextpos <= l) && (*(--s) == 0)){ zzbufovf = 0; }else{ zzbufovf = 1; } *(zznextpos) = '\0'; zzendexpr = zznextpos - 1;}voidzzgettok(){ register int state, newstate; /* last space reserved for the null char */ register zzchar_t *lastpos;skip: zzreal_line = zzline; zzbufovf = 0; lastpos = &zzlextext[zzbufsize-1]; zznextpos = zzlextext; zzbegcol = zzendcol+1;more: zzbegexpr = zznextpos;#ifdef ZZINTERACTIVE /* interactive version of automaton */ /* if there is something in zzchar, process it */ state = newstate = dfa_base[zzauto]; if (zzcharfull){ ZZINC; ZZCOPY; ZZNEWSTATE; } if (zzstr_in) while (zzalternatives[newstate]){ state = newstate; ZZGETC_STR; ZZINC; ZZCOPY; ZZNEWSTATE; } else if (zzstream_in) while (zzalternatives[newstate]){ state = newstate; ZZGETC_STREAM; ZZINC; ZZCOPY; ZZNEWSTATE; } else if (zzfunc_in) while (zzalternatives[newstate]){ state = newstate; ZZGETC_FUNC; ZZINC; ZZCOPY; ZZNEWSTATE; } /* figure out if last character really part of token */ if ((state != dfa_base[zzauto]) && (newstate == DfaStates)){ zzcharfull = 1; --zznextpos; }else{ zzcharfull = 0; state = newstate; } *(zznextpos) = '\0'; /* Able to transition out of start state to some non err state?*/ if ( state == dfa_base[zzauto] ){ /* make sure doesn't get stuck */ zzadvance(); }#else /* non-interactive version of automaton */ if (!zzcharfull) zzadvance(); else ZZINC; state = dfa_base[zzauto]; if (zzstr_in) while (ZZNEWSTATE != DfaStates){ state = newstate; ZZCOPY; ZZGETC_STR; ZZINC; } else if (zzstream_in) while (ZZNEWSTATE != DfaStates){ state = newstate; ZZCOPY; ZZGETC_STREAM; ZZINC; } else if (zzfunc_in) while (ZZNEWSTATE != DfaStates){ state = newstate; ZZCOPY; ZZGETC_FUNC; ZZINC; } zzcharfull = 1; if ( state == dfa_base[zzauto] ){ if (zznextpos < lastpos){ *(zznextpos++) = zzchar; }else{ zzbufovf = 1; } *zznextpos = '\0'; /* make sure doesn't get stuck */ zzadvance(); }else{ *zznextpos = '\0'; }#endif#ifdef ZZCOL zzendcol -= zzcharfull;#endif zzendexpr = zznextpos -1; zzadd_erase = 0; (*actions[accepts[state]])(); switch (zzadd_erase) { case 1: goto skip; case 2: goto more; }}voidzzadvance(){ if (zzstream_in) { ZZGETC_STREAM; zzcharfull = 1; ZZINC;} if (zzfunc_in) { ZZGETC_FUNC; zzcharfull = 1; ZZINC;} if (zzstr_in) { ZZGETC_STR; zzcharfull = 1; ZZINC;} if (!(zzstream_in || zzfunc_in || zzstr_in)){ zzerr_in(); }}void#ifdef __USE_PROTOSzzerrstd(const char *s)#elsezzerrstd(s)char *s;#endif{ zzLexErrCount++; /* MR11 */ fprintf(stderr, "%s near line %d (text was '%s')\n", ((s == NULL) ? "Lexical error" : s), zzline,zzlextext);}intzzerr_in(){ fprintf(stderr,"No input stream, function, or string\n"); /* return eof to get out gracefully */ return EOF;}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?