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 + -
显示快捷键?