err.h
来自「本工具提供一个词法分析器和语法分析器的集成开发环境」· C头文件 代码 · 共 1,161 行 · 第 1/2 页
H
1,161 行
/* * err.h * * Standard error handling mechanism * * 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. * * Has grown to hold all kinds of stuff (err.h is increasingly misnamed) * * ANTLR 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1989-1998 */#ifndef ERR_H#define ERR_H#include "pcctscfg.h"/* *//* 7-Apr-97 133MR1 *//* Proper choice of STDC and cplusplus pre-processor symbols (?) *//* */#include PCCTS_STRING_H#ifdef __STDC__#include <stdarg.h>#endif#ifdef __cplusplus#include PCCTS_STDARG_H#endif#ifndef __STDC__#ifndef __cplusplus#include <varargs.h>#endif#endif#ifdef DUM/* Define usable bits per unsigned int word (used for set stuff) */#ifdef PC#define BSETWORDSIZE 16#define BSETLOGWORDSIZE 4#else#define BSETWORDSIZE 32#define BSETLOGWORDSIZE 5#endif#endif#define BSETWORDSIZE 8#define BSETLOGWORDSIZE 3 /* SetWordType is 8bits */#define BSETMODWORD(x) ((x) & (BSETWORDSIZE-1)) /* x % BSETWORDSIZE */#define BSETDIVWORD(x) ((x) >> BSETLOGWORDSIZE) /* x / BSETWORDSIZE *//* This is not put into the global pccts_parser structure because it is * hidden and does not need to be saved during a "save state" operation *//* maximum of 32 bits/unsigned int and must be 8 bits/byte */static SetWordType bitmask[] = { 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080};#ifdef zzTRACE_RULESint zzTraceOptionValueDefault=1;int zzTraceOptionValue=1;int zzTraceGuessOptionValue=1;char *zzTraceCurrentRuleName=NULL;int zzTraceDepth=0;#endifint zzGuessSeq=0; /* MR10 */int zzSyntaxErrCount=0; /* MR11 */int zzLexErrCount=0; /* MR11 */void#ifdef __USE_PROTOSzzresynch(SetWordType *wd,SetWordType mask)#elsezzresynch(wd,mask)SetWordType *wd, mask;#endif{ static int consumed = 1; /* if you enter here without having consumed a token from last resynch * force a token consumption. */ if ( !consumed ) {zzCONSUME; consumed=1; return;} /* MR10 */ /* if current token is in resynch set, we've got what we wanted */ if ( wd[LA(1)]&mask || LA(1) == zzEOF_TOKEN ) {consumed=0; return;} /* scan until we find something in the resynch set */ while ( !(wd[LA(1)]&mask) && LA(1) != zzEOF_TOKEN ) {zzCONSUME;} consumed=1;}/* *//* 7-Apr-97 133MR1 for C++ and MR7 for C *//* Change suggested by Eli Sternheim (eli@interhdl.com) *//* */void#ifdef __USE_PROTOSzzconsumeUntil(SetWordType *st)#elsezzconsumeUntil(st)SetWordType *st;#endif{ int tmp; /* MR7 */ while ( !zzset_el( (tmp=LA(1)), st) && tmp!=1 /* Eof */) { /* MR7 */ zzCONSUME; } /* MR7 */}/* *//* 7-Apr-97 133MR1 for C++ and MR7 for C *//* Change suggested by Eli Sternheim (eli@interhdl.com) *//* */void#ifdef __USE_PROTOSzzconsumeUntilToken(int t)#elsezzconsumeUntilToken(t)int t;#endif{ int tmp; /* MR7 */ while ( (tmp=LA(1)) !=t && tmp!=1 /* Eof */) { zzCONSUME; } /* MR7 */}/* input looks like: * zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText) * where the zzMiss stuff is set here to the token that did not match * (and which set wasn't it a member of). */void#ifdef __USE_PROTOSzzFAIL(int k, ...)#elsezzFAIL(va_alist)va_dcl#endif{#ifdef LL_K static char text[LL_K*ZZLEXBUFSIZE+1]; SetWordType *f[LL_K];#else static char text[ZZLEXBUFSIZE+1]; SetWordType *f[1];#endif SetWordType **miss_set; char **miss_text; int *bad_tok; char **bad_text; int *err_k; int i; va_list ap;#ifndef __USE_PROTOS int k;#endif#ifdef __USE_PROTOS va_start(ap, k);#else va_start(ap); k = va_arg(ap, int); /* how many lookahead sets? */#endif text[0] = '\0'; for (i=1; i<=k; i++) /* collect all lookahead sets */ { f[i-1] = va_arg(ap, SetWordType *); } for (i=1; i<=k; i++) /* look for offending token */ { if ( i>1 ) strcat(text, " "); strcat(text, LATEXT(i)); if ( !zzset_el((unsigned)LA(i), f[i-1]) ) break; } miss_set = va_arg(ap, SetWordType **); miss_text = va_arg(ap, char **); bad_tok = va_arg(ap, int *); bad_text = va_arg(ap, char **); err_k = va_arg(ap, int *); if ( i>k ) { /* bad; lookahead is permutation that cannot be matched, * but, the ith token of lookahead is valid at the ith position * (The old LL sub 1 (k) versus LL(k) parsing technique) */ *miss_set = NULL; *miss_text = zzlextext; *bad_tok = LA(1); *bad_text = LATEXT(1); *err_k = k; return; }/* fprintf(stderr, "%s not in %dth set\n", zztokens[LA(i)], i);*/ *miss_set = f[i-1]; *miss_text = text; *bad_tok = LA(i); *bad_text = LATEXT(i); if ( i==1 ) *err_k = 1; else *err_k = k;}#ifdef __USE_PROTOSvoid zzTraceGuessDone(zzantlr_state *state)#elsevoid zzTraceGuessDone(state) zzantlr_state *state;#endif{#ifdef zzTRACE_RULES#ifdef ZZCAN_GUESS int doIt=0; if (zzTraceCurrentRuleName == NULL) return; if (zzTraceOptionValue <= 0) { doIt=0; } else if (zzTraceGuessOptionValue <= 0) { doIt=0; } else { doIt=1; }; if (doIt) { fprintf(stderr,"guess done - returning to rule %s {\"%s\"} at depth %d", state->traceCurrentRuleName, LATEXT(1), state->traceDepth); if (state->guessing != 0) { fprintf(stderr," (guess mode continues - an enclosing guess is still active)"); } else { fprintf(stderr," (guess mode ends)"); }; fprintf(stderr,"\n"); };#endif#endif}void#ifdef __USE_PROTOSzzsave_antlr_state(zzantlr_state *buf)#elsezzsave_antlr_state(buf)zzantlr_state *buf;#endif{#ifdef LL_K int i;#endif#ifdef ZZCAN_GUESS buf->guess_start = zzguess_start; buf->guessing = zzguessing;#endif buf->asp = zzasp;#ifdef GENAST buf->ast_sp = zzast_sp;#endif#ifdef ZZINF_LOOK buf->inf_labase = zzinf_labase; buf->inf_last = zzinf_last;/* MR6 Gunnar Rxnning (gunnar@candleweb.no) *//* MR6 Additional state needs to be saved/restored */ buf->inf_tokens = zzinf_tokens; /* MR6 */ buf->inf_text = zzinf_text; /* MR6 */ buf->inf_text_buffer = zzinf_text_buffer; /* MR6 */ buf->inf_line = zzinf_line; /* MR6 */#endif#ifdef DEMAND_LOOK buf->dirty = zzdirty;#endif#ifdef LL_K for (i=0; i<LL_K; i++) buf->tokenLA[i] = zztokenLA[i]; for (i=0; i<LL_K; i++) strcpy(buf->textLA[i], zztextLA[i]); buf->lap = zzlap; buf->labase = zzlabase;#else buf->token = zztoken; strcpy(buf->text, zzlextext);#endif#ifdef zzTRACE_RULES /* MR10 */ buf->traceOptionValue=zzTraceOptionValue; buf->traceGuessOptionValue=zzTraceGuessOptionValue; buf->traceCurrentRuleName=zzTraceCurrentRuleName; buf->traceDepth=zzTraceDepth;#endif}void#ifdef __USE_PROTOSzzrestore_antlr_state(zzantlr_state *buf)#elsezzrestore_antlr_state(buf)zzantlr_state *buf;#endif{#ifdef zzTRACE_RULES int prevTraceOptionValue;#endif#ifdef LL_K int i;#endif#ifdef ZZCAN_GUESS zzguess_start = buf->guess_start; zzguessing = buf->guessing;#endif zzasp = buf->asp;#ifdef GENAST zzast_sp = buf->ast_sp;#endif#ifdef ZZINF_LOOK zzinf_labase = buf->inf_labase; zzinf_last = buf->inf_last;/* MR6 Gunnar Rxnning (gunnar@candleweb.no) *//* MR6 Additional state needs to be saved/restored */ zzinf_tokens = buf->inf_tokens; /* MR6 */ zzinf_text = buf->inf_text; /* MR6 */ zzinf_text_buffer = buf->inf_text_buffer; /* MR6 */ zzinf_line = buf->inf_line; /* MR6 */#endif#ifdef DEMAND_LOOK zzdirty = buf->dirty;#endif#ifdef LL_K for (i=0; i<LL_K; i++) zztokenLA[i] = buf->tokenLA[i]; for (i=0; i<LL_K; i++) strcpy(zztextLA[i], buf->textLA[i]); zzlap = buf->lap; zzlabase = buf->labase;#else zztoken = buf->token; strcpy(zzlextext, buf->text);#endif#ifdef zzTRACE_RULES prevTraceOptionValue=zzTraceOptionValue; zzTraceOptionValue=buf->traceOptionValue; if ( (prevTraceOptionValue > 0) != (zzTraceOptionValue > 0)) { if (zzTraceOptionValue > 0) { fprintf(stderr,"trace enable restored in rule %s depth %d\n", zzTraceCurrentRuleName,zzTraceDepth); }; if (zzTraceOptionValue <= 0) { fprintf(stderr,"trace disable restored in rule %s depth %d\n", zzTraceCurrentRuleName,zzTraceDepth); }; }; zzTraceOptionValue=buf->traceOptionValue; /* MR10 */ zzTraceGuessOptionValue=buf->traceGuessOptionValue; /* MR10 */ zzTraceCurrentRuleName=buf->traceCurrentRuleName; /* MR10 */ zzTraceDepth=buf->traceDepth; /* MR10 */ zzTraceGuessDone(buf); /* MR10 */#endif}void#ifdef __USE_PROTOSzzedecode(SetWordType *a)#elsezzedecode(a)SetWordType *a;#endif{ register SetWordType *p = a; register SetWordType *endp = &(p[zzSET_SIZE]); register unsigned e = 0; if ( zzset_deg(a)>1 ) fprintf(stderr, " {"); do { register SetWordType t = *p; register SetWordType *b = &(bitmask[0]); do { if ( t & *b ) fprintf(stderr, " %s", zztokens[e]); e++; } while (++b < &(bitmask[sizeof(SetWordType)*8])); } while (++p < endp); if ( zzset_deg(a)>1 ) fprintf(stderr, " }");}#ifndef USER_ZZSYN/* standard error reporting function */void#ifdef __USE_PROTOSzzsyn(char *text, int tok, char *egroup, SetWordType *eset, int etok, int k, char *bad_text)#elsezzsyn(text, tok, egroup, eset, etok, k, bad_text)char *text, *egroup, *bad_text;int tok;int etok;int k;SetWordType *eset;#endif{ zzSyntaxErrCount++; /* MR11 */ fprintf(stderr, "line %d: syntax error at \"%s\"", zzline, (tok==zzEOF_TOKEN)?"EOF":bad_text); if ( !etok && !eset ) {fprintf(stderr, "\n"); return;} if ( k==1 ) fprintf(stderr, " missing"); else { fprintf(stderr, "; \"%s\" not", bad_text); if ( zzset_deg(eset)>1 ) fprintf(stderr, " in"); } if ( zzset_deg(eset)>0 ) zzedecode(eset); else fprintf(stderr, " %s", zztokens[etok]); if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup); fprintf(stderr, "\n");}#endif/* is b an element of set p? */int#ifdef __USE_PROTOSzzset_el(unsigned b, SetWordType *p)#elsezzset_el(b,p)unsigned b;SetWordType *p;#endif{ return( p[BSETDIVWORD(b)] & bitmask[BSETMODWORD(b)] );}int#ifdef __USE_PROTOSzzset_deg(SetWordType *a)#elsezzset_deg(a)SetWordType *a;#endif{ /* Fast compute degree of a set... the number of elements present in the set. Assumes that all word bits are used in the set */ register SetWordType *p = a; register SetWordType *endp = &(a[zzSET_SIZE]); register int degree = 0; if ( a == NULL ) return 0; while ( p < endp ) { register SetWordType t = *p; register SetWordType *b = &(bitmask[0]); do { if (t & *b) ++degree; } while (++b < &(bitmask[sizeof(SetWordType)*8])); p++; } return(degree);}#ifdef DEMAND_LOOK#ifdef LL_Kint#ifdef __USE_PROTOS_zzmatch(int _t, char **zzBadText, char **zzMissText, int *zzMissTok, int *zzBadTok, SetWordType **zzMissSet)#else_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)int _t;char **zzBadText;char **zzMissText;int *zzMissTok, *zzBadTok;SetWordType **zzMissSet;#endif{ if ( zzdirty==LL_K ) { zzCONSUME; } if ( LA(1)!=_t ) { *zzBadText = *zzMissText=LATEXT(1); *zzMissTok= _t; *zzBadTok=LA(1); *zzMissSet=NULL; return 0; } zzMakeAttr zzdirty++; zzlabase++; return 1;}int#ifdef __USE_PROTOS_zzmatch_wsig(int _t)#else_zzmatch_wsig(_t)int _t;#endif{ if ( zzdirty==LL_K ) { zzCONSUME; } if ( LA(1)!=_t ) { return 0; } zzMakeAttr zzdirty++; zzlabase++; return 1;}#elseint#ifdef __USE_PROTOS_zzmatch(int _t, char **zzBadText, char **zzMissText, int *zzMissTok, int *zzBadTok, SetWordType **zzMissSet)#else_zzmatch(_t, zzBadText, zzMissText, zzMissTok, zzBadTok, zzMissSet)int _t;char **zzBadText;char **zzMissText;int *zzMissTok, *zzBadTok;SetWordType **zzMissSet;#endif{ if ( zzdirty ) {zzCONSUME;} if ( LA(1)!=_t ) { *zzBadText = *zzMissText=LATEXT(1); *zzMissTok= _t; *zzBadTok=LA(1); *zzMissSet=NULL; return 0; } zzdirty = 1; zzMakeAttr return 1;}int#ifdef __USE_PROTOS_zzmatch_wsig(int _t)#else_zzmatch_wsig(_t)int _t;#endif{ if ( zzdirty ) {zzCONSUME;} if ( LA(1)!=_t ) { return 0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?