📄 gram.tab.c
字号:
#line 121 "gram.y"{ ModeAssignAccptFlag = 0;; break;}}#line 705 "/usr/share/bison/bison.simple" yyvsp -= yylen; yyssp -= yylen;#if YYLSP_NEEDED yylsp -= yylen;#endif#if YYDEBUG if (yydebug) { short *yyssp1 = yyss - 1; YYFPRINTF (stderr, "state stack now"); while (yyssp1 != yyssp) YYFPRINTF (stderr, " %d", *++yyssp1); YYFPRINTF (stderr, "\n"); }#endif *++yyvsp = yyval;#if YYLSP_NEEDED *++yylsp = yyloc;#endif /* Now `shift' the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate;/*------------------------------------.| yyerrlab -- here on detecting error |`------------------------------------*/yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs;#ifdef YYERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { YYSIZE_T yysize = 0; char *yymsg; int yyx, yycount; yycount = 0; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ for (yyx = yyn < 0 ? -yyn : 0; yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) if (yycheck[yyx + yyn] == yyx) yysize += yystrlen (yytname[yyx]) + 15, yycount++; yysize += yystrlen ("parse error, unexpected ") + 1; yysize += yystrlen (yytname[YYTRANSLATE (yychar)]); yymsg = (char *) YYSTACK_ALLOC (yysize); if (yymsg != 0) { char *yyp = yystpcpy (yymsg, "parse error, unexpected "); yyp = yystpcpy (yyp, yytname[YYTRANSLATE (yychar)]); if (yycount < 5) { yycount = 0; for (yyx = yyn < 0 ? -yyn : 0; yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) if (yycheck[yyx + yyn] == yyx) { const char *yyq = ! yycount ? ", expecting " : " or "; yyp = yystpcpy (yyp, yyq); yyp = yystpcpy (yyp, yytname[yyx]); yycount++; } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else yyerror ("parse error; also virtual memory exhausted"); } else#endif /* defined (YYERROR_VERBOSE) */ yyerror ("parse error"); } goto yyerrlab1;/*--------------------------------------------------.| yyerrlab1 -- error raised explicitly by an action |`--------------------------------------------------*/yyerrlab1: if (yyerrstatus == 3) { /* If just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (yychar == YYEOF) YYABORT; YYDPRINTF ((stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1])); yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ goto yyerrhandle;/*-------------------------------------------------------------------.| yyerrdefault -- current state does not do anything special for the || error token. |`-------------------------------------------------------------------*/yyerrdefault:#if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ /* If its default is to accept any token, ok. Otherwise pop it. */ yyn = yydefact[yystate]; if (yyn) goto yydefault;#endif/*---------------------------------------------------------------.| yyerrpop -- pop the current state because it cannot handle the || error token |`---------------------------------------------------------------*/yyerrpop: if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp;#if YYLSP_NEEDED yylsp--;#endif#if YYDEBUG if (yydebug) { short *yyssp1 = yyss - 1; YYFPRINTF (stderr, "Error: state stack now"); while (yyssp1 != yyssp) YYFPRINTF (stderr, " %d", *++yyssp1); YYFPRINTF (stderr, "\n"); }#endif/*--------------.| yyerrhandle. |`--------------*/yyerrhandle: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yyerrdefault; yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) goto yyerrdefault; yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) goto yyerrpop; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval;#if YYLSP_NEEDED *++yylsp = yylloc;#endif yystate = yyn; goto yynewstate;/*-------------------------------------.| yyacceptlab -- YYACCEPT comes here. |`-------------------------------------*/yyacceptlab: yyresult = 0; goto yyreturn;/*-----------------------------------.| yyabortlab -- YYABORT comes here. |`-----------------------------------*/yyabortlab: yyresult = 1; goto yyreturn;/*---------------------------------------------.| yyoverflowab -- parser overflow comes here. |`---------------------------------------------*/yyoverflowlab: yyerror ("parser stack overflow"); yyresult = 2; /* Fall through. */yyreturn:#ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss);#endif return yyresult;}#line 127 "gram.y"#include "lex.yy.c"void appendNonTerm( char *name, int modeAssign ){ BODY *body; body = setNonTerm(); entryNonTerm( name, body, modeAssign, StartFlag, ModeBlock, 0 ); BodyNo = 0;}BODY *setNonTerm( void ){ int i; BODY *body; BODY *top = NULL, *prev = NULL; for( i = 0; i < BodyNo; i++ ){ if( (body = malloc( sizeof(BODY) )) == NULL ){ errMes( "Can't alloc nonterminal list buffer" ); } strcpy( body->name, BodyName[ i ] ); body->abort = 0; if( prev != NULL ){ prev->next = body; } else { top = body; } prev = body; } body->next = NULL; return( top );}CLASS *entryNonTerm( char *name, BODY *body, int modeAccpt, int start, int member, int tmp ){ CLASS *class; class = getClass( name ); if( class != NULL ){ if( member ){ errMes("Accepted flag of class \"%s\" is re-assigned", HeadName ); ErrParse++; } } else { if( (class = malloc( sizeof(CLASS) )) == NULL ){ errMes( "Can't alloc memory for Class Finite Automaton." ); } strcpy( class->name, name ); if( modeAccpt ){ if( member ){ class->no = CurClassNo; } else { if( !tmp ){ outputHeader( name ); class->no = CurClassNo; } } } else { class->no = -1; } class->branch = 0; class->usedFA = 0; class->used = 1; /* non-terminal does not appear in voca */ class->bodyList = NULL; class->tmp = tmp; class->next = NULL; if( ClassListTail == NULL ){ ClassList = class; } else { ClassListTail->next = class; } ClassListTail = class; } if( body != NULL ) pushBody( class, body ); if( start ){ StartFlag = 0; if( StartSymbol == NULL ){ StartSymbol = class; } else { errMes("Start symbol is redifined as \"%s\"", class->name ); ErrParse++; } } return( class );}void pushBody( CLASS *class, BODY *newbody ){ BODYLIST *bodyList = class->bodyList; BODYLIST *preBodyList = NULL; BODYLIST *newBodyList; BODY *body; int cmp; int defineNo = 1; while( bodyList != NULL ){ body = bodyList->body; cmp = strcmp( body->name, newbody->name ); if( cmp > 0 ) break; if( cmp == 0 ){ if( unifyBody( class->name, body, newbody ) ){ warnMes( "Class \"%s\" is defined as \"%s..\" again.", class->name, body->name ); } return; } preBodyList = bodyList; bodyList = bodyList->next; defineNo++; } if( (newBodyList = malloc( sizeof(BODYLIST) )) == NULL ){ errMes( "Can't alloc class body buffer." ); } newBodyList->body = newbody; if( preBodyList != NULL ){ preBodyList->next = newBodyList; } else { class->bodyList = newBodyList; } newBodyList->next = bodyList; class->branch++;}int unifyBody( char *className, BODY *body, BODY *newbody ){ BODY *bodyNext, *newbodyNext; char *newClassName; BODY *newBody; CLASS *class; bodyNext = body->next; newbodyNext = newbody->next; while( 1 ){ if( bodyNext == NULL && newbodyNext == NULL ){ return( -1 ); } if( newbodyNext == NULL ){ if( body->abort ){ return( -1 ); } else { body->abort = 1; return( 0 ); } } if( bodyNext == NULL ){ body->abort = 1; body->next = newbodyNext; return( 0 ); } if( strcmp( bodyNext->name, newbodyNext->name ) ) break; body = bodyNext; newbody = newbodyNext; bodyNext = body->next; newbodyNext = newbody->next; } class = getClass( body->name ); if( class != NULL && class->tmp ){ entryNonTerm( body->name, newbodyNext, 0, 0, 0, 1 ); } else { newClassName = getNewClassName( className ); entryNonTerm( newClassName, bodyNext, 0, 0, 0, 1 ); entryNonTerm( newClassName, newbodyNext, 0, 0, 0, 1 ); if( (newBody = malloc( sizeof(BODY) )) == NULL ){ errMes( "Can't alloc body buffer of tmp class, \"%s\".", newClassName ); } strcpy( newBody->name, newClassName ); newBody->abort = 0; newBody->next = NULL; body->next = newBody; newbody->next = newBody; } return( 0 );}char *getNewClassName( char *keyname ){ static char classname[ SYMBOL_LEN ]; static int tmpClassNo = 0; sprintf( classname, "%s#%d", keyname , tmpClassNo++ ); if( !SW_SemiQuiet ){ fprintf( stderr, "\rNow modifying grammar to minimize states[%d]", GramModifyNum ); NoNewLine = 1; } GramModifyNum++; return( classname );}void setGram( void ){ char *name; if( (yyin = fopen( GramFile, "r" )) == NULL ){ errMes( "Can't open grammar file \"%s\"", GramFile ); } if( SW_Compati ){ strcpy( HeaderFile, "/dev/null" ); } if( (FPheader = fopen( HeaderFile, "w" )) == NULL ){ errMes( "Can't open Header File for writting\"%s\"", HeaderFile ); } fprintf( FPheader, "/* Header of class reduction flag for finite automaton parser\n" " made with mkfa %s\n\n" " Do logicalAND between label and FA's field #4,#5.\n" "*/\n\n", VerNo ); if( !SW_Quiet ) fputs( "Now parsing grammar file\n", stderr ); yyparse(); if( !SW_Quiet ){ fprintf( stderr, "\rNow modifying grammar to minimize states[%d]\n", GramModifyNum - 1 ); NoNewLine = 0; } if( StartSymbol == NULL ) StartSymbol = ClassList; fprintf( FPheader, "/* Start Symbol: %s */\n", StartSymbol->name ); fclose( FPheader ); if( (name = chkNoInstantClass()) != NULL ){ errMes( "Prototype-declared Class \"%s\" has no instant definitions", name ); } if( ErrParse ) errMes( "%d fatal errors exist", ErrParse );}void outputHeader( char *name ){ if( ClassNo >= CLASSFLAG_MAX ){ if( !SW_Compati ){ warnMes( "Class accepted flag overflow.\"%s\"", name ); CurClassNo = -1; } } else { if( !SW_Compati ){ fprintf( FPheader, "#define ACCEPT_%s 0x%08x\n", name, 1 << ClassNo ); } CurClassNo = ClassNo++; }}char *chkNoInstantClass( void ){ CLASS *class = ClassList; while( class != NULL ){ if( !class->branch ) return( class->name ); class = class->next; } return( NULL );}int yyerror( char *mes ){ errMes(mes ); ErrParse++; return( 0 );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -