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