📄 parser.c
字号:
#define yyPrintResult(State, Line, Condition) Condition#endif#if defined YYDEBUG | defined YYDEC_TABLE#define yyGotoReduce(State, Rule) { yyState = State; goto yyReduce; }#define yyGotoRead(State) { yyState = State; goto yyRead; }#else#define yyGotoReduce(State, Rule) goto Rule;#define yyGotoRead(State) { yyState = State; goto yyRead; }#endifstatic unsigned long yyStateStackSize = yyInitStackSize;static yyStateRange * yyStateStack ;static yyStateRange * yyEndOfStack ;static unsigned long yyAttrStackSize = yyInitStackSize;static tParsAttribute * yyAttributeStack ;#if defined YYTrialParse | defined YYReParsestatic yyStateRange * yyStateStackPtr ;static tParsAttribute * yyAttrStackPtr ;#endifstatic yyStateRange * yyIsContStackPtr ;static unsigned long yyIsContStackSize = yyInitStackSize;static yyStateRange * yyCompResStackPtr ;static unsigned long yyCompResStackSize = yyInitStackSize;int Parser ARGS ((void)) { return Parser2 (yyStartState); }int Parser2#if defined __STDC__ | defined __cplusplus (int yyStartSymbol)#else (yyStartSymbol) int yyStartSymbol;#endif { int yyErrorCount;#if defined YYDEBUG | defined YYDCRP yyTrace = stdout;#endif BeginParser (); MakeArray ((char * *) & yyStateStack, & yyStateStackSize, (unsigned long) sizeof (yyStateRange)); MakeArray ((char * *) & yyAttributeStack, & yyAttrStackSize, (unsigned long) sizeof (tParsAttribute)); MakeArray ((char * *) & yyIsContStackPtr, & yyIsContStackSize, (unsigned long) sizeof (yyStateRange)); MakeArray ((char * *) & yyCompResStackPtr, & yyCompResStackSize, (unsigned long) sizeof (yyStateRange));#if defined YYTrialParse | defined YYReParse | defined YYGetLook MakeArray ((char * *) & yyBuffer, & yyBufferSize, (unsigned long) sizeof (yytBuffer));#endif yyEndOfStack = & yyStateStack [yyStateStackSize - 1];#if defined YYTrialParse | defined YYReParse yyStateStackPtr = yyStateStack; yyAttrStackPtr = yyAttributeStack; yyBufferNext = 1; yyBufferLast = 1; yyParseLevel = 0;#endif#ifdef YYDEBUG if (Parser_Debug) { (void) fprintf (yyTrace, " #|Position|State|Mod|Lev|Action |Terminal and Lookahead or Rule\n"); yyNl (); }#endif yyControl.yyMode = yystandard; yyControl.yyActions = rtrue; yyControl.yyMessages = rtrue; yyErrorCount = yyParse ((yyStateRange) yyStartSymbol, (yySymbolRange) yyGetToken (), (int) yyStartLine [yyStartSymbol]); ReleaseArray ((char * *) & yyStateStack, & yyStateStackSize, (unsigned long) sizeof (yyStateRange)); ReleaseArray ((char * *) & yyAttributeStack, & yyAttrStackSize, (unsigned long) sizeof (tParsAttribute)); ReleaseArray ((char * *) & yyIsContStackPtr, & yyIsContStackSize, (unsigned long) sizeof (yyStateRange)); ReleaseArray ((char * *) & yyCompResStackPtr, & yyCompResStackSize, (unsigned long) sizeof (yyStateRange));#if defined YYTrialParse | defined YYReParse | defined YYGetLook ReleaseArray ((char * *) & yyBuffer, & yyBufferSize, (unsigned long) sizeof (yytBuffer));#endif return yyErrorCount; }#ifdef YYTrialParse#ifdef YYMemoParse#define MemoryClear(Position) yyBuffer [Position].yyStart = 0#endifstatic int yyTrialParse#if defined __STDC__ | defined __cplusplus (yyStateRange yyStartSymbol, yySymbolRange yyToken, int yyLine)#else (yyStartSymbol, yyToken, yyLine) yyStateRange yyStartSymbol ; yySymbolRange yyToken ; int yyLine ;#endif { int yyErrorCount ; unsigned long yyPrevStateStackPtr = yyStateStackPtr - yyStateStack; unsigned long yyPrevAttrStackPtr = yyAttrStackPtr - yyAttributeStack; long yyPrevBufferNext ; yytControl yyPrevControl ; BEFORE_TRIAL#ifdef YYMemoParse if (yyBuffer [yyBufferNext].yyStart == yyStartSymbol) return 0; if (yyBuffer [yyBufferNext].yyStart == - yyStartSymbol) return 1;#endif yyPrevControl = yyControl; yyStateStackPtr ++; yyAttrStackPtr ++; yyParseLevel ++; if (yyControl.yyMode == yystandard) yyBufferSet (yyToken); yyPrevBufferNext = yyBufferNext; yyControl.yyMode = yytrial; yyControl.yyActions = rfalse; yyControl.yyMessages = rfalse; yyErrorCount = yyParse (yyStartSymbol, yyToken, yyLine);#ifdef YYMemoParse yyBuffer [yyPrevBufferNext].yyStart = yyErrorCount ? - yyStartSymbol : yyStartSymbol;#endif yyStateStackPtr = yyStateStack + yyPrevStateStackPtr; yyAttrStackPtr = yyAttributeStack + yyPrevAttrStackPtr; yyBufferNext = yyPrevBufferNext; yyControl = yyPrevControl; yyParseLevel --; Attribute = yyBuffer [yyBufferNext].yyAttribute; AFTER_TRIAL return yyErrorCount; }#endif#ifdef YYReParsestatic int ReParse#if defined __STDC__ | defined __cplusplus (yyStateRange yyStartSymbol, int yyFrom, int yyTo, rbool yyActions, rbool yyMessages)#else (yyStartSymbol, yyFrom, yyTo, yyActions, yyMessages) yyStateRange yyStartSymbol ; int yyFrom, yyTo ; rbool yyActions, yyMessages ;#endif { int yyErrorCount = 1; if (1 <= yyFrom && yyFrom <= yyTo && yyTo <= yyBufferLast) { unsigned long yyPrevStateStackPtr = yyStateStackPtr - yyStateStack; unsigned long yyPrevAttrStackPtr = yyAttrStackPtr - yyAttributeStack; long yyPrevBufferNext = yyBufferNext; int yyToToken = yyBuffer [yyTo].yyToken; yytControl yyPrevControl ; yyPrevControl = yyControl; yyStateStackPtr ++; yyAttrStackPtr ++; yyParseLevel ++; yyBufferNext = yyFrom - 1; yyBuffer [yyTo].yyToken= EofToken; yyControl.yyMode = yyreparse; yyControl.yyActions = yyActions; yyControl.yyMessages = yyMessages; yyErrorCount = yyParse (yyStartSymbol, (yySymbolRange) yyGetToken (), (int) yyStartLine [yyStartSymbol]); yyStateStackPtr = yyStateStack + yyPrevStateStackPtr; yyAttrStackPtr = yyAttributeStack + yyPrevAttrStackPtr; yyBufferNext = yyPrevBufferNext; yyControl = yyPrevControl; yyParseLevel --; yyBuffer [yyTo].yyToken= yyToToken; Attribute = yyBuffer [yyBufferNext].yyAttribute; } else { Message ("invalid call of ReParse", xxError, Attribute.Position); } return yyErrorCount; }#endifstatic char * yyGetTokenName#if defined __STDC__ | defined __cplusplus (yySymbolRange yyTerminal)#else (yyTerminal) yySymbolRange yyTerminal;#endif { if (yyTerminal <= yyLastTerminal && Parser_TokenName [yyTerminal]) return Parser_TokenName [yyTerminal]; else return "_unknown_"; }static int yyParse#if defined __STDC__ | defined __cplusplus (yyStateRange yyStartSymbol, yySymbolRange yyToken, int yyLine)#else (yyStartSymbol, yyToken, yyLine) yyStateRange yyStartSymbol ; yySymbolRange yyToken ; int yyLine ;#endif { register yyStateRange yyState = yyStartSymbol; register yySymbolRange yyTerminal = yyToken; register rbool yyIsRepairing = rfalse; tParsAttribute yySynAttribute ; /* synthesized attribute */ int yyErrorCount = 0;#if ! (defined YYTrialParse | defined YYReParse) register yyStateRange * yyStateStackPtr = yyStateStack; register tParsAttribute *yyAttrStackPtr = yyAttributeStack;#endif#ifdef YYDEBUG long yyStartCount = yyCount + 1; yySymbolRange yyPrevTerminal = yyToken;#endif#ifdef YYGetLook yySymbolRange yy2;#endif/* line 155 "Parser.lrk" */#ifdef YYDEBUG if (Parser_Debug) { yyPrintState (yyStartSymbol); (void) fprintf (yyTrace, "parse for predicate in line %d, lookahead: %s", yyLine, yyGetTokenName (yyTerminal)); yyNl (); }#endif yyParseLoop: for (;;) { if (yyStateStackPtr >= yyEndOfStack) { unsigned long yyyStateStackPtr = yyStateStackPtr - yyStateStack; unsigned long yyyAttrStackPtr = yyAttrStackPtr - yyAttributeStack; ExtendArray ((char * *) & yyStateStack, & yyStateStackSize, (unsigned long) sizeof (yyStateRange)); ExtendArray ((char * *) & yyAttributeStack, & yyAttrStackSize, (unsigned long) sizeof (tParsAttribute)); yyStateStackPtr = yyStateStack + yyyStateStackPtr; yyAttrStackPtr = yyAttributeStack + yyyAttrStackPtr; yyEndOfStack = & yyStateStack [yyStateStackSize - 1];#ifdef YYDEBUG if (Parser_Debug) { yyPrintState (yyState); (void) fprintf (yyTrace, "extend stack from %ld to %ld", yyStateStackSize / 2, yyStateStackSize); yyNl (); }#endif } * yyStateStackPtr = yyState; yyTermTrans: for (;;) { /* SPEC State = Next (State, Terminal); terminal transit */ register yytComb * yyTCombPtr = yyTBasePtr [yyState] + yyTerminal;#if defined YYTDefault & defined YYaccDefault register unsigned long * yylp;#endif if (yyTCombPtr->Check == yyState) { yyState = yyTCombPtr->Next; break; }#ifdef YYTDefault#ifdef YYaccDefault if ((yylp = yyDefaultLook [yyState]) && (yylp [yyTerminal >> 5] >> (yyTerminal & 0x1f)) & 1) { yyState = yyTDefault [yyState]; break; }#else if ((yyState = yyTDefault [yyState]) != yyNoState) goto yyTermTrans;#endif#endif /* syntax error */ if (! yyIsRepairing) { /* report and recover */ yySymbolRange yyyTerminal = (yySymbolRange) yyTerminal;#ifdef YYTrialParse if (yyControl.yyMode == yytrial) YYABORT;#endif MY_ERROR#ifndef NO_RECOVER yyErrorCount ++; yyErrorRecovery (& yyyTerminal, yyStateStack, yyStateStackPtr - yyStateStack); yyTerminal = yyyTerminal; yyIsRepairing = rtrue;#else YYABORT;#endif }#ifndef NO_RECOVER yyState = * yyStateStackPtr; for (;;) { yySymbolRange yyRepairToken; tScanAttribute yyRepairAttribute; yyStateRange yyNextState = yyNext (yyState, (yySymbolRange) yyTerminal); if (yyNextState != yyNoState && /* read or read reduce ? */ yyNextState <= yyLastReadReduceState) { yyState = yyNextState; /* restart point reached */ yyIsRepairing = rfalse; /* stop error recovery */ goto yyFinal; } yyRepairToken = yyContinuation [yyState]; /* repair */ yyState = yyNext (yyState, yyRepairToken); if (yyState > yyLastReduceState) { /* dynamic ? */ yyState = yyCondition [yyState - yyLastReduceState]; } if (yyState <= yyLastReadReduceState) { /* read or read reduce ? */ ErrorAttribute ((int) yyRepairToken, & yyRepairAttribute); if (yyControl.yyMessages) ErrorMessageI (xxTokenInserted, xxRepair, Attribute.Position, xxString, yyGetTokenName (yyRepairToken));#ifdef YYDEBUG if (Parser_Debug) { yyPrintState (* yyStateStackPtr); (void) fprintf (yyTrace, "insert %s", yyGetTokenName (yyRepairToken)); yyNl (); yyPrintState (* yyStateStackPtr); (void) fprintf (yyTrace, "shift %s, lookahead: %s", yyGetTokenName (yyRepairToken), yyGetTokenName (yyTerminal)); yyNl (); }#endif if (yyState >= yyFirstFinalState) { /* avoid second push */ yyState = yyFinalToProd [yyState - yyFirstReadReduceState]; } yyGetAttribute (yyAttrStackPtr ++, yyRepairAttribute); * ++ yyStateStackPtr = yyState; } if (yyState >= yyFirstFinalState) goto yyFinal; /* final state ? */ }#endif } yyFinal: if (yyState >= yyFirstFinalState) { /* final state ? */ if (yyState <= yyLastReadReduceState) { /* read reduce ? */ yyStateStackPtr ++; yyGetAttribute (yyAttrStackPtr ++, Attribute); yyTerminal = yyGetToken ();#ifdef YYDEBUG if (Parser_Debug) { yyStateStackPtr [0] = yyStateStackPtr [-1]; yyPrintState (* yyStateStackPtr); (void) fprintf (yyTrace, "shift %s, lookahead: %s", yyGetTokenName (yyPrevTerminal), yyGetTokenName (yyTerminal)); yyNl (); yyPrevTerminal = yyTerminal; }#endif yyIsRepairing = rfalse; } for (;;) { register yytNonterminal yyNonterminal; /* left-hand side */ yyReduce:#ifdef YYDEBUG if (Parser_Debug) { if (yyState <= yyLastReadReduceState) /* read reduce ? */ yyState = yyFinalToProd [yyState - yyFirstReadReduceState]; yyPrintState (* yyStateStackPtr); if (yyState <= yyLastReduceState) { (void) fprintf (yyTrace, "reduce %s", yyRule [yyState - yyLastReadReduceState]); yyNl (); } else { (void) fprintf (yyTrace, "dynamic decision %d", yyState - yyLastReduceState); yyNl (); } }#endif#ifdef YYDEC_TABLE if (yyLastStopState < yyState && yyState <= yyLastReduceState) { register int yyd = yyLength [yyState - yyFirstReduceState]; yyStateStackPtr -= yyd; yyAttrStackPtr -= yyd; yyNonterminal = yyLeftHandSide [yyState - yyFirstReduceState]; }#endifswitch (yyState) {case 65:YYACCEPT;case 66: yyDecrement (1) yySetNT (yyNTprogram) {/* line 198 "Parser.lrk" */ ;{ TreeRoot = mprogram (yyA [0].statements.tree); } ;} break;case 67: yySetNT (yyNTstatements) {/* line 201 "Parser.lrk" */ yyS.statements.tree = dnostmt; ;} break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -