📄 gram.c
字号:
&& isspace(bp[4])) { bp += 4; return TERMINAL; } else if (c == '%' && strncmp(bp, "start", 5) == 0 && isspace(bp[5])) { bp += 5; return START; } else if (c == '"') { char *p = strchr(bp, '"'); if (p == NULL) { yyerror("missing \" in assembler template\n"); p = strchr(bp, '\n'); if (p == NULL) p = strchr(bp, '\0'); } assert(p); yylval.string = alloc(p - bp + 1); strncpy(yylval.string, bp, p - bp); yylval.string[p - bp] = 0; bp = *p == '"' ? p + 1 : p; code++; return TEMPLATE; } else if (isdigit(c)) { int n = 0; do { int d = c - '0'; if (n > (INT_MAX - d)/10) yyerror("integer greater than %d\n", INT_MAX); else n = 10*n + d; c = get(); } while (c != EOF && isdigit(c)); bp--; yylval.n = n; return INT; } else if (isalpha(c)) { char *p = bp - 1; while (isalpha(*bp) || isdigit(*bp) || *bp == '_') bp++; yylval.string = alloc(bp - p + 1); strncpy(yylval.string, p, bp - p); yylval.string[bp - p] = 0; return ID; } else if (isprint(c)) yyerror("invalid character `%c'\n", c); else yyerror("invalid character `\\%03o'\n", (unsigned char)c); } return 0;}void yywarn(char *fmt, ...) { va_list ap; va_start(ap, fmt); if (yylineno > 0) fprintf(stderr, "line %d: ", yylineno); fprintf(stderr, "warning: "); vfprintf(stderr, fmt, ap);}#line 403 "y.tab.c"#define YYABORT goto yyabort#define YYACCEPT goto yyaccept#define YYERROR goto yyerrlab#if YYDEBUG#ifdef __cplusplusextern "C" char *getenv();#elseextern char *getenv();#endif#endifintyyparse(){ register int yym, yyn, yystate; register YYSTYPE *yyvsp; register short *yyssp; short *yysse;#if YYDEBUG register YYCONST char *yys; if (yys = getenv("YYDEBUG")) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; }#endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == 0) { yyss = (short *) yymalloc (YYSTACKSIZE * sizeof (short)); if (yyss == 0) goto yyabort; yyvs = (YYSTYPE *) yymalloc (YYSTACKSIZE * sizeof (YYSTYPE)); if (yyvs == 0) { yyfree (yyss); goto yyabort; } yystacksize = YYSTACKSIZE; } yysse = yyss + yystacksize - 1; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; goto yyloop;yypush_lex: yyval = yylval; yystate = yytable[yyn];yypush: if (yyssp >= yysse) { int depth = yyssp - yyss; if (yygrow() != 0) goto yyoverflow; yysse = yyss + yystacksize -1; yyssp = depth + yyss; yyvsp = depth + yyvs; } *++yyssp = yystate; *++yyvsp = yyval;yyloop: if (yyn = yydefred[yystate]) goto yyreduce; yyn = yysindex[yystate]; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); }#endif } if (yyn != 0 && ((yyn += yychar), ((unsigned)yyn <= (unsigned)YYTABLESIZE)) && yycheck[yyn] == yychar) {#if YYDEBUG if (yydebug) printf("yydebug: state %d, shifting to state %d\n", yystate, yytable[yyn]);#endif if (yyerrflag > 0) --yyerrflag; yychar = (-1); goto yypush_lex; } yyn = yyrindex[yystate]; if (yyn != 0 && ((yyn += yychar), ((unsigned)yyn <= (unsigned)YYTABLESIZE)) && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery;#ifdef lint goto yynewerror;#endifyynewerror: yyerror("syntax error");#ifdef lint goto yyerrlab;#endifyyerrlab: ++yynerrs;yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { yyn = yysindex[*yyssp]; if (yyn != 0 && ((yyn += YYERRCODE), ((unsigned)yyn <= (unsigned)YYTABLESIZE)) && yycheck[yyn] == YYERRCODE) {#if YYDEBUG if (yydebug) printf("yydebug: state %d, error recovery shifting\ to state %d\n", *yyssp, yytable[yyn]);#endif goto yypush_lex; } else {#if YYDEBUG if (yydebug) printf("yydebug: error recovery discarding state %d\n", *yyssp);#endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, error recovery discards token %d (%s)\n", yystate, yychar, yys); }#endif yychar = (-1); goto yyloop; }yyreduce:#if YYDEBUG if (yydebug) printf("yydebug: state %d, reducing by rule %d (%s)\n", yystate, yyn, yyrule[yyn]);#endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) {case 1:#line 22 "lburg/gram.y"{ yylineno = 0; }break;case 2:#line 23 "lburg/gram.y"{ yylineno = 0; }break;case 6:#line 31 "lburg/gram.y"{ if (nonterm(yyvsp[-1].string)->number != 1) yyerror("redeclaration of the start symbol\n"); }break;case 8:#line 36 "lburg/gram.y"{ yyerrok; }break;case 10:#line 40 "lburg/gram.y"{ term(yyvsp[-2].string, yyvsp[0].n); }break;case 12:#line 44 "lburg/gram.y"{ rule(yyvsp[-5].string, yyvsp[-3].tree, yyvsp[-2].string, yyvsp[-1].string); }break;case 14:#line 46 "lburg/gram.y"{ yyerrok; }break;case 15:#line 49 "lburg/gram.y"{ nonterm(yyval.string = yyvsp[0].string); }break;case 16:#line 52 "lburg/gram.y"{ yyval.tree = tree(yyvsp[0].string, 0, 0); }break;case 17:#line 53 "lburg/gram.y"{ yyval.tree = tree(yyvsp[-3].string, yyvsp[-1].tree, 0); }break;case 18:#line 54 "lburg/gram.y"{ yyval.tree = tree(yyvsp[-5].string, yyvsp[-3].tree, yyvsp[-1].tree); }break;case 19:#line 57 "lburg/gram.y"{ if (*yyvsp[0].string == 0) yyval.string = "0"; }break;#line 630 "y.tab.c" } yyssp -= yym; yyvsp -= yym; yym = yylhs[yyn]; yystate = *yyssp; if (yystate == 0 && yym == 0) {#if YYDEBUG if (yydebug) printf("yydebug: after reduction, shifting from state 0 to\ state %d\n", YYFINAL);#endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, reading %d (%s)\n", YYFINAL, yychar, yys); }#endif } if (yychar == 0) goto yyaccept; goto yyloop; } yyn = yygindex[yym]; if (yyn != 0 && ((yyn += yystate), ((unsigned)yyn <= (unsigned)YYTABLESIZE)) && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym];#if YYDEBUG if (yydebug) printf("yydebug: after reduction, shifting from state %d \to state %d\n", *yyssp, yystate);#endif goto yypush;yyoverflow: yyerror("yacc stack overflow");yyabort: return (1);yyaccept: return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -