📄 parser.c
字号:
yyState = yyNDefault [yyState]; }#else yyState = yyNBasePtr [* yyStateStackPtr ++] [yyNonterminal];#endif * yyAttrStackPtr ++ = yySynAttribute; if (yyState < yyFirstFinalState) goto yyParseLoop; /* read reduce ? */#ifdef YYDEBUG yyStateStackPtr [0] = yyStateStackPtr [-1];#endif } } else { /* read */ yyRead: yyStateStackPtr ++; yyGetAttribute (yyAttrStackPtr ++, Attribute); yyTerminal = yyGetToken ();#ifdef YYDEBUG if (Parser_Debug) { yyPrintState (yyStateStackPtr [-1]); (void) fprintf (yyTrace, "shift %s, lookahead: %s", yyGetTokenName (yyPrevTerminal), yyGetTokenName (yyTerminal)); yyNl (); yyPrevTerminal = yyTerminal; }#endif yyIsRepairing = rfalse; } } yyAbort:#ifdef YYDEBUG if (Parser_Debug) { yyPrintState (* yyStateStackPtr); (void) fprintf (yyTrace, "fail parse started at %ld", yyStartCount); yyNl (); }#endif return ++ yyErrorCount; yyAccept:#ifdef YYDEBUG if (Parser_Debug) { yyPrintState (* yyStateStackPtr); (void) fprintf (yyTrace, "accept parse started at %ld", yyStartCount); yyNl (); }#endif return yyErrorCount; }#ifndef NO_RECOVERstatic void yyErrorRecovery#if defined __STDC__ | defined __cplusplus (yySymbolRange * yyTerminal, yyStateRange * yyStateStack, short yyStackPtr)#else (yyTerminal, yyStateStack, yyStackPtr) yySymbolRange * yyTerminal ; yyStateRange * yyStateStack ; short yyStackPtr ;#endif {#define yyContinueSize 5000 rbool yyTokensSkipped ; tSet yyContinueSet ; tSet yyRestartSet ; int yyLength ; char yyContinueString [yyContinueSize + 2]; if (yyControl.yyMessages) { /* 1. report an error */ ErrorMessage (xxSyntaxError, xxError, Attribute.Position); /* 2. report the offending token */ (void) strcpy (yyContinueString, yyGetTokenName (* yyTerminal));#ifdef SPELLING if (strncmp (yyContinueString, TokenPtr, TokenLength)) { yyContinueString [yyLength = strlen (yyContinueString)] = ' '; (void) GetWord (& yyContinueString [++ yyLength]); }#endif ErrorMessageI (xxTokenFound, xxInformation, Attribute.Position, xxString, yyContinueString); /* 3. report the set of expected terminal symbols */ MakeSet (& yyContinueSet, (short) yyLastTerminal); yyComputeContinuation (yyStateStack, yyStackPtr, & yyContinueSet, rtrue); yyLength = 0; yyContinueString [0] = '\0'; while (! IsEmpty (& yyContinueSet)) { char * yyTokenString = yyGetTokenName (Extract (& yyContinueSet)); int yyl = strlen (yyTokenString); if (yyLength + yyl >= yyContinueSize) break; (void) strcpy (& yyContinueString [yyLength], yyTokenString); yyLength += yyl; yyContinueString [yyLength ++] = ' '; } yyContinueString [-- yyLength] = '\0'; ErrorMessageI (xxExpectedTokens, xxInformation, Attribute.Position, xxString, yyContinueString); ReleaseSet (& yyContinueSet); } /* 4. compute the set of terminal symbols for restart of the parse */ MakeSet (& yyRestartSet, (short) yyLastTerminal); yyComputeRestartPoints (yyStateStack, yyStackPtr, & yyRestartSet); /* 5. skip terminal symbols until a restart point is reached */ yyTokensSkipped = rfalse; while (! IsElement (* yyTerminal, & yyRestartSet)) {#ifdef YYDEBUG yySymbolRange yyPrevTerminal = * yyTerminal;#endif * yyTerminal = yyGetToken (); yyTokensSkipped = rtrue;#ifdef YYDEBUG if (Parser_Debug) { yyPrintState (yyStateStack [yyStackPtr]); (void) fprintf (yyTrace, "skip %s, lookahead: %s", yyGetTokenName (yyPrevTerminal), yyGetTokenName (* yyTerminal)); yyNl (); }#endif } ReleaseSet (& yyRestartSet); /* 6. report the restart point */ if (yyTokensSkipped & yyControl.yyMessages) ErrorMessage (xxRestartPoint, xxInformation, Attribute.Position); }/* compute the set of terminal symbols that can be accepted (read) in a given stack configuration (eventually after reduce actions)*/static void yyComputeContinuation#if defined __STDC__ | defined __cplusplus (yyStateRange * yyStack, short yyStackPtr, tSet * yyContinueSet, rbool yyreduce)#else (yyStack, yyStackPtr, yyContinueSet, yyreduce) yyStateRange * yyStack ; short yyStackPtr ; tSet * yyContinueSet ; rbool yyreduce ;#endif { register yySymbolRange yyTerminal; register yyStateRange yyState = yyStack [yyStackPtr]; AssignEmpty (yyContinueSet); for (yyTerminal = yyFirstTerminal; yyTerminal <= yyLastTerminal; yyTerminal ++) { if (yyNext (yyState, yyTerminal) != yyNoState && yyIsContinuation (yyTerminal, yyStack, yyStackPtr, yyreduce)) { Include (yyContinueSet, (short) yyTerminal); } } }/* check whether a given terminal symbol can be accepted (read) in a certain stack configuration (eventually after reduce actions)*/static rbool yyIsContinuation#if defined __STDC__ | defined __cplusplus (yySymbolRange yyTerminal, yyStateRange * yyStateStack, short yyStackPtr, rbool yyreduce)#else (yyTerminal, yyStateStack, yyStackPtr, yyreduce) yySymbolRange yyTerminal ; yyStateRange * yyStateStack ; short yyStackPtr ; rbool yyreduce ;#endif { register yyStateRange yState ; register yytNonterminal yyNonterminal ; while (yyStackPtr >= (short) yyIsContStackSize) /* pass Stack by value */ ExtendArray ((char * *) & yyIsContStackPtr, & yyIsContStackSize, (unsigned long) sizeof (yyStateRange));#ifdef BCOPY bcopy ((char *) yyStateStack, (char *) yyIsContStackPtr, (int) sizeof (yyStateRange) * (yyStackPtr + 1));#else (void) memcpy ((char *) yyIsContStackPtr, (char *) yyStateStack, (int) sizeof (yyStateRange) * (yyStackPtr + 1));#endif yState = yyIsContStackPtr [yyStackPtr]; for (;;) { yyIsContStackPtr [yyStackPtr] = yState; yState = yyNext (yState, yyTerminal); if (yState == yyNoState) return rfalse; do { /* reduce */ if (yState > yyLastReduceState) { /* dynamic ? */ yState = yyCondition [yState - yyLastReduceState]; } if (yState <= yyLastStopState) { /* read, read reduce, or accept? */ return rtrue; } else if (yyreduce) { /* reduce */ yyStackPtr -= yyLength [yState - yyFirstReduceState]; yyNonterminal = yyLeftHandSide [yState - yyFirstReduceState]; } else { return rfalse; } yState = yyNext (yyIsContStackPtr [yyStackPtr], (yySymbolRange) yyNonterminal); if (yyStackPtr >= (short) yyIsContStackSize) ExtendArray ((char * *) & yyIsContStackPtr, & yyIsContStackSize, (unsigned long) sizeof (yyStateRange)); yyStackPtr ++; } while (yState >= yyFirstFinalState); } }/* compute a set of terminal symbols that can be used to restart parsing in a given stack configuration. we simulate parsing until end of file using a suffix program synthesized by the function (array) yyContinuation. All symbols acceptable in the states reached during the simulation can be used to restart parsing.*/static void yyComputeRestartPoints#if defined __STDC__ | defined __cplusplus (yyStateRange * yyStateStack, short yyStackPtr, tSet * yyRestartSet)#else (yyStateStack, yyStackPtr, yyRestartSet) yyStateRange * yyStateStack ; short yyStackPtr ; tSet * yyRestartSet ;#endif { register yyStateRange yState ; register yytNonterminal yyNonterminal ; tSet yyContinueSet ; while (yyStackPtr >= (short) yyCompResStackSize) /* pass Stack by value */ ExtendArray ((char * *) & yyCompResStackPtr, & yyCompResStackSize, (unsigned long) sizeof (yyStateRange));#ifdef BCOPY bcopy ((char *) yyStateStack, (char *) yyCompResStackPtr, (int) sizeof (yyStateRange) * (yyStackPtr + 1));#else (void) memcpy ((char *) yyCompResStackPtr, (char *) yyStateStack, (int) sizeof (yyStateRange) * (yyStackPtr + 1));#endif MakeSet (& yyContinueSet, (short) yyLastTerminal); AssignEmpty (yyRestartSet); yState = yyCompResStackPtr [yyStackPtr]; for (;;) { if (yyStackPtr >= (short) yyCompResStackSize) ExtendArray ((char * *) & yyCompResStackPtr, & yyCompResStackSize, (unsigned long) sizeof (yyStateRange)); yyCompResStackPtr [yyStackPtr] = yState; yyComputeContinuation (yyCompResStackPtr, yyStackPtr, & yyContinueSet, rfalse); Union (yyRestartSet, & yyContinueSet);#ifdef YYDCRP { int yyLength = 0; char yyContinueString [yyContinueSize + 2]; yyContinueString [0] = '\0'; while (! IsEmpty (& yyContinueSet)) { char * yyTokenString = yyGetTokenName (Extract (& yyContinueSet)); int yyl = strlen (yyTokenString); if (yyLength + yyl >= yyContinueSize) break; (void) strcpy (& yyContinueString [yyLength], yyTokenString); yyLength += yyl; yyContinueString [yyLength ++] = ' '; } yyContinueString [-- yyLength] = '\0'; (void) fprintf (yyTrace, "%5d union %s", yState, yyContinueString); yyNl (); }#endif yState = yyNext (yState, yyContinuation [yState]); if (yState >= yyFirstFinalState) { /* final state ? */ if (yState <= yyLastReadReduceState) { /* read reduce ? */ yyStackPtr ++; yState = yyFinalToProd [yState - yyFirstReadReduceState];#ifdef YYDCRP yyCompResStackPtr [yyStackPtr] = yyCompResStackPtr [yyStackPtr - 1]; (void) fprintf (yyTrace, "%5d shift %s", yyCompResStackPtr [yyStackPtr], yyGetTokenName (yyContinuation [yyCompResStackPtr [yyStackPtr]])); yyNl ();#endif } do { /* reduce */ if (yState > yyLastReduceState) { /* dynamic ? */#ifdef YYDCRP (void) fprintf (yyTrace, "%5d dynamic decision %d", yyCompResStackPtr [yyStackPtr], yState - yyLastReduceState); yyNl ();#endif yState = yyCondition [yState - yyLastReduceState]; } if (yyFirstReduceState <= yState && yState <= yyLastStopState) { /* accept */#ifdef YYDCRP (void) fprintf (yyTrace, "%5d accept", yyCompResStackPtr [yyStackPtr]); yyNl ();#endif ReleaseSet (& yyContinueSet); return; } else if (yState < yyFirstFinalState) { /* read */ goto yyRead; } else { /* reduce */#ifdef YYDCRP (void) fprintf (yyTrace, "%5d reduce %s", yyCompResStackPtr [yyStackPtr], yyRule [yState - yyLastReadReduceState]); yyNl ();#endif yyStackPtr -= yyLength [yState - yyFirstReduceState]; yyNonterminal = yyLeftHandSide [yState - yyFirstReduceState]; } yState = yyNext (yyCompResStackPtr [yyStackPtr], (yySymbolRange) yyNonterminal); yyStackPtr ++; } while (yState >= yyFirstFinalState); } else { /* read */yyRead:#ifdef YYDCRP (void) fprintf (yyTrace, "%5d shift %s", yyCompResStackPtr [yyStackPtr], yyGetTokenName (yyContinuation [yyCompResStackPtr [yyStackPtr]])); yyNl ();#endif yyStackPtr ++; } } }/* access the parse table: Next : State x Symbol -> Action */static yyStateRange yyNext#if defined __STDC__ | defined __cplusplus (yyStateRange yyState, yySymbolRange yySymbol)#else (yyState, yySymbol) yyStateRange yyState; yySymbolRange yySymbol;#endif { if (yySymbol <= yyLastTerminal) { for (;;) { register yytComb * yyTCombPtr = yyTBasePtr [yyState] + yySymbol;#if defined YYTDefault & defined YYaccDefault register unsigned long * yylp;#endif if (yyTCombPtr->Check == yyState) return yyTCombPtr->Next;#ifdef YYTDefault#ifdef YYaccDefault return (yylp = yyDefaultLook [yyState]) && (yylp [yySymbol >> 5] >> (yySymbol & 0x1f)) & 1 ? yyTDefault [yyState] : yyNoState;#else if ((yyState = yyTDefault [yyState]) == yyNoState) return yyNoState;#endif#else return yyNoState;#endif } }#ifdef YYNDefault for (;;) { register yytComb * yyNCombPtr = yyNBasePtr [yyState] + yySymbol; if (yyNCombPtr->Check == yyState) return yyNCombPtr->Next; yyState = yyNDefault [yyState]; }#else return yyNBasePtr [yyState] [yySymbol];#endif }#endifvoid BeginParser ARGS ((void)) {/* line 158 "Parser.lrk" */ BeginScanner (); i_lparent = MakeIdent ("(" , 1); i_rparent = MakeIdent (")" , 1);#ifdef SHARE snostmt = mnostmt (); snoword = mnoword (); snotext = mnotext ();#endif }void CloseParser ARGS ((void)) {/* line 172 "Parser.lrk" */ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -