aparser.cpp

来自「本工具提供一个词法分析器和语法分析器的集成开发环境」· C++ 代码 · 共 753 行 · 第 1/2 页

CPP
753
字号
	int line;	line = LT(1)->getLine();    syntaxErrCount++;                                   /* MR11 */	fprintf(stderr, "line %d: syntax error at \"%s\"",					line, LT(1)->getText());	if ( !etok && !eset ) {fprintf(stderr, "\n"); return;}	if ( k==1 ) fprintf(stderr, " missing");	else	{		fprintf(stderr, "; \"%s\" not", LT(1)->getText());		if ( set_deg(eset)>1 ) fprintf(stderr, " in");	}	if ( set_deg(eset)>0 ) edecode(eset);	else fprintf(stderr, " %s", token_tbl[etok]);	if ( strlen(egroup) > 0 ) fprintf(stderr, " in %s", egroup);	fprintf(stderr, "\n");}/* is b an element of set p? */int ANTLRParser::set_el(ANTLRTokenType b, SetWordType *p){	return( p[DIVWORD(b)] & bitmask[MODWORD(b)] );}int ANTLRParser::set_deg(SetWordType *a){	/* 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[bsetsize]);	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);}void ANTLRParser::edecode(SetWordType *a){	register SetWordType *p = a;	register SetWordType *endp = &(p[bsetsize]);	register unsigned e = 0;	if ( set_deg(a)>1 ) fprintf(stderr, " {");	do {		register SetWordType t = *p;		register SetWordType *b = &(bitmask[0]);		do {			if ( t & *b ) fprintf(stderr, " %s", token_tbl[e]);			e++;		} while (++b < &(bitmask[sizeof(SetWordType)*8]));	} while (++p < endp);	if ( set_deg(a)>1 ) fprintf(stderr, " }");}/* input looks like: *      zzFAIL(k, e1, e2, ...,&zzMissSet,&zzMissText,&zzBadTok,&zzBadText,&zzErrk) * where the zzMiss stuff is set here to the token that did not match * (and which set wasn't it a member of). */// MR9 29-Sep-97    Stan Bochnak (S.Bochnak@microTool.com.pl)// MR9              Original fix to static allocated text didn't// MR9                work because a pointer to it was passed back// MR9                to caller.  Replace with instance variable.const int   SETWORDCOUNT=20;voidANTLRParser::FAIL(int k, ...){////  MR1 10-Apr-97	//    if (zzFAILtext == NULL) zzFAILtext=new char [1000];          // MR9    SetWordType **f=new SetWordType *[SETWORDCOUNT];             // MR1 // MR9    SetWordType **miss_set;    ANTLRChar **miss_text;    _ANTLRTokenPtr *bad_tok;    ANTLRChar **bad_text;////  7-Apr-97 133MR1//  		err_k is passed as a "int *", not "unsigned *"//    int	*err_k;                                                         // MR1    int i;    va_list ap;    va_start(ap, k);    zzFAILtext[0] = '\0';	if ( k > SETWORDCOUNT ) panic("FAIL: overflowed buffer");    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(zzFAILtext, " ");        strcat(zzFAILtext, LT(i)->getText());        if ( !set_el(LA(i), f[i-1]) ) break;    }    miss_set = va_arg(ap, SetWordType **);    miss_text = va_arg(ap, ANTLRChar **);    bad_tok = va_arg(ap, _ANTLRTokenPtr *);    bad_text = va_arg(ap, ANTLRChar **);    err_k = va_arg(ap, int *);                      					// MR1    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 = LT(1)->getText();        *bad_tok = LT(1);        *bad_text = (*bad_tok)->getText();        *err_k = k;////  MR4 20-May-97	erroneously deleted contents of f[]//  MR4			        reported by Bruce Guenter (bruceg@qcc.sk.ca)//  MR1 10-Apr-97	release temporary storage//      delete [] f;                                                      // MR1      return;                                                           // MR1    }/*  fprintf(stderr, "%s not in %dth set\n", zztokens[LA(i)], i);*/    *miss_set = f[i-1];    *miss_text = zzFAILtext;    *bad_tok = LT(i);    *bad_text = (*bad_tok)->getText();    if ( i==1 ) *err_k = 1;    else *err_k = k;////  MR4 20-May-97	erroneously deleted contents of f[]//  MR4			      reported by Bruce Guenter (bruceg@qcc.sk.ca)//  MR1 10-Apr-97	release temporary storage//    delete [] f;                                                        // MR1    return;                                                             // MR1}int ANTLRParser::_match_wdfltsig(ANTLRTokenType tokenWanted, SetWordType *whatFollows){	if ( dirty==LLk ) consume();	if ( LA(1)!=tokenWanted )	{        syntaxErrCount++;                                   /* MR11 */		fprintf(stderr,				"line %d: syntax error at \"%s\" missing %s\n",				LT(1)->getLine(),				(LA(1)==eofToken)?"<eof>":LT(1)->getText(),				token_tbl[tokenWanted]);		consumeUntil( whatFollows );		return 0;	}	else {		dirty++;		labase = (labase+1)&(LLk-1); // labase maintained even if !demand look/*		if ( !demand_look ) consume(); */		return 1;	}}int ANTLRParser::_setmatch_wdfltsig(SetWordType *tokensWanted,					ANTLRTokenType tokenTypeOfSet,					SetWordType *whatFollows){	if ( dirty==LLk ) consume();	if ( !set_el(LA(1), tokensWanted) )	{        syntaxErrCount++;                                   /* MR11 */		fprintf(stderr,				"line %d: syntax error at \"%s\" missing %s\n",				LT(1)->getLine(),				(LA(1)==eofToken)?"<eof>":LT(1)->getText(),				token_tbl[tokenTypeOfSet]);		consumeUntil( whatFollows );		return 0;	}	else {		dirty++;		labase = (labase+1)&(LLk-1); // labase maintained even if !demand look/*		if ( !demand_look ) consume(); */		return 1;	}}char *ANTLRParser::eMsgd(char *err,int d){	sprintf(eMsgBuffer, err, d);	// dangerous, but I don't care	return eMsgBuffer;}char *ANTLRParser::eMsg(char *err, char *s){	sprintf(eMsgBuffer, err, s);	return eMsgBuffer;}char *ANTLRParser::eMsg2(char *err,char *s, char *t){	sprintf(eMsgBuffer, err, s, t);	return eMsgBuffer;}void ANTLRParser::panic(char *msg){	fprintf(stderr, "ANTLR panic: %s\n", msg);	exit(PCCTS_EXIT_FAILURE);           // MR1}const ANTLRChar *ANTLRParser::          // MR1parserTokenName(int tok) {              // MR1	return token_tbl[tok];              // MR1}                                       // MR1void ANTLRParser::traceGuessDone(const ANTLRParserState *state) {  int   doIt=0;  if (traceCurrentRuleName == NULL) return;  if (traceOptionValue <= 0) {    doIt=0;  } else if (traceGuessOptionValue <= 0) {    doIt=0;  } else {    doIt=1;  };  if (doIt) {    fprintf(stderr,"guess done - returning to rule %s {\"%s\"} at depth %d",        state->traceCurrentRuleName,        LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),        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");  };}void ANTLRParser::traceGuessFail() {  int   doIt=0;  if (traceOptionValue <= 0) {    doIt=0;  } else if (guessing && traceGuessOptionValue <= 0) {    doIt=0;  } else {    doIt=1;  };  if (doIt) {    fprintf(stderr,"guess failed\n");  };}/* traceOption:     zero value turns off trace*/void ANTLRParser::tracein(const ANTLRChar * rule) {  int       doIt=0;  traceDepth++;  traceCurrentRuleName=rule;  if (traceOptionValue <= 0) {    doIt=0;  } else if (guessing && traceGuessOptionValue <= 0) {    doIt=0;  } else {    doIt=1;  };  if (doIt) {    fprintf(stderr,"enter rule %s {\"%s\"} depth %d",            rule,            LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),            traceDepth);    if (guessing) fprintf(stderr," guessing");    fprintf(stderr,"\n");  };  return;}void ANTLRParser::traceout(const ANTLRChar * rule) {  int       doIt=0;  traceDepth--;  if (traceOptionValue <= 0) {    doIt=0;  } else if (guessing && traceGuessOptionValue <= 0) {    doIt=0;  } else {    doIt=1;  };  if (doIt) {    fprintf(stderr,"exit rule %s {\"%s\"} depth %d",            rule,            LT(1)->getType() == eofToken ? "@" : LT(1)->getText(),            traceDepth+1);    if (guessing) fprintf(stderr," guessing");    fprintf(stderr,"\n");  };}int ANTLRParser::traceOption(int delta) {    int     prevValue=traceOptionValue;    traceOptionValue=traceOptionValue+delta;    if (traceCurrentRuleName != NULL) {      if (prevValue <= 0 && traceOptionValue > 0) {        fprintf(stderr,"trace enabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);      };      if (prevValue > 0 && traceOptionValue <= 0) {        fprintf(stderr,"trace disabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);      };    };    return  prevValue;}int ANTLRParser::traceGuessOption(int delta) {    int     prevValue=traceGuessOptionValue;    traceGuessOptionValue=traceGuessOptionValue+delta;    if (traceCurrentRuleName != NULL) {      if (prevValue <= 0 && traceGuessOptionValue > 0) {        fprintf(stderr,"guess trace enabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);      };      if (prevValue > 0 && traceGuessOptionValue <= 0) {        fprintf(stderr,"guess trace disabled in rule %s depth %d\n",traceCurrentRuleName,traceDepth);      };    };    return prevValue;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?