📄 parse-gram.c
字号:
#line 308 "parse-gram.y" { (yyval.list) = symbol_list_prepend ((yyvsp[-1].list), (yyvsp[0].symbol), (yylsp[0])); } break; case 50:#line 314 "parse-gram.y" { current_type = (yyvsp[0].uniqstr); } break; case 51:#line 318 "parse-gram.y" { symbol_class_set ((yyvsp[0].symbol), current_class, (yylsp[0])); symbol_type_set ((yyvsp[0].symbol), current_type, (yylsp[0])); } break; case 52:#line 323 "parse-gram.y" { symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1])); symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1])); symbol_user_token_number_set ((yyvsp[-1].symbol), (yyvsp[0].integer), (yylsp[0])); } break; case 53:#line 329 "parse-gram.y" { symbol_class_set ((yyvsp[-1].symbol), current_class, (yylsp[-1])); symbol_type_set ((yyvsp[-1].symbol), current_type, (yylsp[-1])); symbol_make_alias ((yyvsp[-1].symbol), (yyvsp[0].symbol), (yyloc)); } break; case 54:#line 335 "parse-gram.y" { symbol_class_set ((yyvsp[-2].symbol), current_class, (yylsp[-2])); symbol_type_set ((yyvsp[-2].symbol), current_type, (yylsp[-2])); symbol_user_token_number_set ((yyvsp[-2].symbol), (yyvsp[-1].integer), (yylsp[-1])); symbol_make_alias ((yyvsp[-2].symbol), (yyvsp[0].symbol), (yyloc)); } break; case 60:#line 364 "parse-gram.y" { if (yacc_flag) complain_at ((yyloc), _("POSIX forbids declarations in the grammar")); } break; case 61:#line 369 "parse-gram.y" { yyerrok; } break; case 62:#line 375 "parse-gram.y" { current_lhs = (yyvsp[0].symbol); current_lhs_location = (yylsp[0]); } break; case 64:#line 379 "parse-gram.y" { grammar_rule_end ((yylsp[0])); } break; case 65:#line 380 "parse-gram.y" { grammar_rule_end ((yylsp[0])); } break; case 67:#line 386 "parse-gram.y" { grammar_rule_begin (current_lhs, current_lhs_location); } break; case 68:#line 388 "parse-gram.y" { grammar_current_rule_symbol_append ((yyvsp[0].symbol), (yylsp[0])); } break; case 69:#line 390 "parse-gram.y" { grammar_current_rule_action_append ((yyvsp[0].chars), (yylsp[0])); } break; case 70:#line 392 "parse-gram.y" { grammar_current_rule_prec_set ((yyvsp[0].symbol), (yylsp[0])); } break; case 71:#line 394 "parse-gram.y" { grammar_current_rule_dprec_set ((yyvsp[0].integer), (yylsp[0])); } break; case 72:#line 396 "parse-gram.y" { grammar_current_rule_merge_set ((yyvsp[0].uniqstr), (yylsp[0])); } break; case 73:#line 400 "parse-gram.y" { (yyval.symbol) = (yyvsp[0].symbol); } break; case 74:#line 401 "parse-gram.y" { (yyval.symbol) = (yyvsp[0].symbol); } break; case 75:#line 406 "parse-gram.y" { (yyval.chars) = (yyvsp[0].chars); } break; case 76:#line 412 "parse-gram.y" { (yyval.symbol) = symbol_get ((yyvsp[0].chars), (yylsp[0])); symbol_class_set ((yyval.symbol), token_sym, (yylsp[0])); } break; case 77:#line 421 "parse-gram.y" { (yyval.chars) = (yyvsp[0].chars) + 1; (yyval.chars)[strlen ((yyval.chars)) - 1] = '\0'; } break; case 79:#line 430 "parse-gram.y" { muscle_code_grow ("epilogue", (yyvsp[0].chars), (yylsp[0])); scanner_last_string_free (); } break; }/* Line 1037 of yacc.c. */#line 1739 "parse-gram.c" yyvsp -= yylen; yyssp -= yylen; yylsp -= yylen; YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; *++yylsp = yyloc; /* 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 - YYNTOKENS] + *yyssp; if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate;/*------------------------------------.| yyerrlab -- here on detecting error |`------------------------------------*/yyerrlab: /* If not already recovering from an error, report this error. */ if (!yyerrstatus) { ++yynerrs;#if YYERROR_VERBOSE yyn = yypact[yystate]; if (YYPACT_NINF < yyn && yyn < YYLAST) { YYSIZE_T yysize = 0; int yytype = YYTRANSLATE (yychar); const char* yyprefix; char *yymsg; int yyx; /* Start YYX at -YYN if negative to avoid negative indexes in YYCHECK. */ int yyxbegin = yyn < 0 ? -yyn : 0; /* Stay within bounds of both yycheck and yytname. */ int yychecklim = YYLAST - yyn; int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; int yycount = 0; yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); yycount += 1; if (yycount == 5) { yysize = 0; break; } } yysize += (sizeof ("syntax error, unexpected ") + yystrlen (yytname[yytype])); yymsg = (char *) YYSTACK_ALLOC (yysize); if (yymsg != 0) { char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); yyp = yystpcpy (yyp, yytname[yytype]); if (yycount < 5) { yyprefix = ", expecting "; for (yyx = yyxbegin; yyx < yyxend; ++yyx) if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { yyp = yystpcpy (yyp, yyprefix); yyp = yystpcpy (yyp, yytname[yyx]); yyprefix = " or "; } } yyerror (yymsg); YYSTACK_FREE (yymsg); } else yyerror ("syntax error; also virtual memory exhausted"); } else#endif /* YYERROR_VERBOSE */ yyerror ("syntax error"); } yyerror_range[0] = yylloc; if (yyerrstatus == 3) { /* If just tried and failed to reuse look-ahead token after an error, discard it. */ if (yychar <= YYEOF) { /* If at end of input, pop the error token, then the rest of the stack, then return failure. */ if (yychar == YYEOF) for (;;) { yyerror_range[0] = *yylsp; YYPOPSTACK; if (yyssp == yyss) YYABORT; yydestruct ("Error: popping", yystos[*yyssp], yyvsp, yylsp); } } else { yydestruct ("Error: discarding", yytoken, &yylval, &yylloc); yychar = YYEMPTY; } } /* Else will try to reuse look-ahead token after shifting the error token. */ goto yyerrlab1;/*---------------------------------------------------.| yyerrorlab -- error raised explicitly by YYERROR. |`---------------------------------------------------*/yyerrorlab:#ifdef __GNUC__ /* Pacify GCC when the user code never invokes YYERROR and the label yyerrorlab therefore never appears in user code. */ if (0) goto yyerrorlab;#endif yyerror_range[0] = yylsp[1-yylen]; yylsp -= yylen; yyvsp -= yylen; yyssp -= yylen; yystate = *yyssp; goto yyerrlab1;/*-------------------------------------------------------------.| yyerrlab1 -- common code for both syntax error and YYERROR. |`-------------------------------------------------------------*/yyerrlab1: yyerrstatus = 3; /* Each real token shifted decrements this. */ for (;;) { yyn = yypact[yystate]; if (yyn != YYPACT_NINF) { yyn += YYTERROR; if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) { yyn = yytable[yyn]; if (0 < yyn) break; } } /* Pop the current state because it cannot handle the error token. */ if (yyssp == yyss) YYABORT; yyerror_range[0] = *yylsp; yydestruct ("Error: popping", yystos[yystate], yyvsp, yylsp); YYPOPSTACK; yystate = *yyssp; YY_STACK_PRINT (yyss, yyssp); } if (yyn == YYFINAL) YYACCEPT; *++yyvsp = yylval; yyerror_range[1] = yylloc; /* Using YYLLOC is tempting, but would change the location of the look-ahead. YYLOC is available though. */ YYLLOC_DEFAULT (yyloc, yyerror_range - 1, 2); *++yylsp = yyloc; /* Shift the error token. */ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); yystate = yyn; goto yynewstate;/*-------------------------------------.| yyacceptlab -- YYACCEPT comes here. |`-------------------------------------*/yyacceptlab: yyresult = 0; goto yyreturn;/*-----------------------------------.| yyabortlab -- YYABORT comes here. |`-----------------------------------*/yyabortlab: yydestruct ("Error: discarding lookahead", yytoken, &yylval, &yylloc); yychar = YYEMPTY; yyresult = 1; goto yyreturn;#ifndef yyoverflow/*----------------------------------------------.| yyoverflowlab -- parser overflow comes here. |`----------------------------------------------*/yyoverflowlab: yyerror ("parser stack overflow"); yyresult = 2; /* Fall through. */#endifyyreturn:#ifndef yyoverflow if (yyss != yyssa) YYSTACK_FREE (yyss);#endif return yyresult;}#line 436 "parse-gram.y"/* Return the location of the left-hand side of a rule whose right-hand side is RHS[1] ... RHS[N]. Ignore empty nonterminals in the right-hand side, and return an empty location equal to the end boundary of RHS[0] if the right-hand side is empty. */static YYLTYPElloc_default (YYLTYPE const *rhs, int n){ int i; YYLTYPE loc; /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;". The bug is fixed in 7.4.2m, but play it safe for now. */ loc.start = rhs[n].end; loc.end = rhs[n].end; /* Ignore empty nonterminals the start of the the right-hand side. Do not bother to ignore them at the end of the right-hand side, since empty nonterminals have the same end as their predecessors. */ for (i = 1; i <= n; i++) if (! equal_boundaries (rhs[i].start, rhs[i].end)) { loc.start = rhs[i].start; break; } return loc;}/* Add a lex-param or a parse-param (depending on TYPE) with declaration DECL and location LOC. */static voidadd_param (char const *type, char *decl, location loc){ static char const alphanum[26 + 26 + 1 + 10] = "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "_" "0123456789"; char const *name_start = NULL; char *p; /* Stop on last actual character. */ for (p = decl; p[1]; p++) if ((p == decl || ! memchr (alphanum, p[-1], sizeof alphanum)) && memchr (alphanum, p[0], sizeof alphanum - 10)) name_start = p; /* Strip the surrounding '{' and '}', and any blanks just inside the braces. */ while (*--p == ' ' || *p == '\t') continue; p[1] = '\0'; while (*++decl == ' ' || *decl == '\t') continue; if (! name_start) complain_at (loc, _("missing identifier in parameter declaration")); else { char *name; size_t name_len; for (name_len = 1; memchr (alphanum, name_start[name_len], sizeof alphanum); name_len++) continue; name = xmalloc (name_len + 1); memcpy (name, name_start, name_len); name[name_len] = '\0'; muscle_pair_list_grow (type, decl, name); free (name); } scanner_last_string_free ();}/*----------------------------------------------------.| When debugging the parser, display tokens' values. |`----------------------------------------------------*/static voidprint_token_value (FILE *file, int type, YYSTYPE const *value){ fputc (' ', file); switch (type) { case ID: fprintf (file, " = %s", value->symbol->tag); break; case INT: fprintf (file, " = %d", value->integer); break; case STRING: fprintf (file, " = \"%s\"", value->chars); break; case TYPE: fprintf (file, " = <%s>", value->uniqstr); break; case BRACED_CODE: case PERCENT_DESTRUCTOR: case PERCENT_LEX_PARAM: case PERCENT_PARSE_PARAM: case PERCENT_PRINTER: case PERCENT_UNION: case PROLOGUE: case EPILOGUE: fprintf (file, " = {{ %s }}", value->chars); break; default: fprintf (file, "unknown token type"); break; }}static voidgram_error (location const *loc, char const *msg){ complain_at (*loc, "%s", msg);}char const *token_name (int type){ return yytname[type];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -