📄 parse.c
字号:
{ int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); if (newss == NULL) return -1; yyss = newss; yyssp = newss + i; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); if (newvs == NULL) return -1; yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0;}#define YYABORT goto yyabort#define YYREJECT goto yyabort#define YYACCEPT goto yyaccept#define YYERROR goto yyerrlab#ifndef YYPARSE_PARAM#if defined(__cplusplus) || __STDC__#define YYPARSE_PARAM_ARG void#define YYPARSE_PARAM_DECL#else /* ! ANSI-C/C++ */#define YYPARSE_PARAM_ARG#define YYPARSE_PARAM_DECL#endif /* ANSI-C/C++ */#else /* YYPARSE_PARAM */#ifndef YYPARSE_PARAM_TYPE#define YYPARSE_PARAM_TYPE void *#endif#if defined(__cplusplus) || __STDC__#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM#define YYPARSE_PARAM_DECL#else /* ! ANSI-C/C++ */#define YYPARSE_PARAM_ARG YYPARSE_PARAM#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;#endif /* ANSI-C/C++ */#endif /* ! YYPARSE_PARAM */intyyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL{ int yym, yyn, yystate;#if YYDEBUG const 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 == NULL && yygrowstack()) goto yyoverflow; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0;yyloop: if ((yyn = yydefred[yystate])) goto yyreduce; 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("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); }#endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) {#if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]);#endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery;#if defined(lint) || defined(__GNUC__) goto yynewerror;#endifyynewerror: yyerror("syntax error");#if defined(lint) || defined(__GNUC__) goto yyerrlab;#endifyyerrlab: ++yynerrs;yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) {#if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);#endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else {#if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *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("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); }#endif yychar = (-1); goto yyloop; }yyreduce:#if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]);#endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) {case 1:#line 47 "Parse.y"{ savedTree = yyvsp[0].ptree; }break;case 2:#line 53 "Parse.y"{ TreeNode *t = yyvsp[-1].ptree; if (t!=NULL) { while (t->sibling!=NULL) t = t->sibling; t->sibling = yyvsp[0].ptree; yyval.ptree = yyvsp[-1].ptree; } else yyval.ptree = yyvsp[0].ptree; }break;case 3:#line 67 "Parse.y"{ yyval.ptree = yyvsp[0].ptree; }break;case 4:#line 72 "Parse.y"{yyval.ptree = yyvsp[0].ptree;}break;case 5:#line 73 "Parse.y"{yyval.ptree = yyvsp[0].ptree;}break;case 6:#line 74 "Parse.y"{yyval.ptree = yyvsp[0].ptree;}break;case 7:#line 78 "Parse.y"{ savedIdName = strdup(tokenString); }break;case 8:#line 83 "Parse.y"{savedFunName = savedIdName;}break;case 9:#line 87 "Parse.y"{ if (yyvsp[-2].type == Void) /*err*/; else { yyval.ptree = newDecNode(VarK); yyval.ptree->type = yyvsp[-2].type; yyval.ptree->child[0] = yyvsp[-1].ptree; } }break;case 10:#line 100 "Parse.y"{ TreeNode *t = yyvsp[-2].ptree; if (t!=NULL) { while (t->sibling != NULL) t = t->sibling; t->sibling = yyvsp[0].ptree; yyval.ptree = yyvsp[-2].ptree; } else yyval.ptree = yyvsp[0].ptree; }break;case 11:#line 112 "Parse.y"{yyval.ptree = yyvsp[0].ptree;}break;case 12:#line 114 "Parse.y"{ TreeNode *new_node = newStmtNode(AssignK); TreeNode *t = yyvsp[-4].ptree; if (t!=NULL) { while (t->sibling != NULL) t = t->sibling; t->sibling = new_node; yyval.ptree = yyvsp[-4].ptree; } else yyval.ptree = new_node; }break;case 13:#line 128 "Parse.y"{ yyval.ptree = newStmtNode(AssignK); yyval.ptree->child[0] = newExpNode(IdK); yyval.ptree->child[0]->attr.name = savedIdName; yyval.ptree->child[1] = yyvsp[0].ptree; }break;case 14:#line 136 "Parse.y"{yyval.type = Int;}break;case 15:#line 137 "Parse.y"{yyval.type = Float;}break;case 16:#line 138 "Parse.y"{yyval.type = Char;}break;case 17:#line 139 "Parse.y"{yyval.type = Void;}break;case 18:#line 143 "Parse.y"{ yyval.ptree = newDecNode(FunDefK); yyval.ptree->attr.name = savedFunName; yyval.ptree->type = yyvsp[-6].type; yyval.ptree->child[0] = yyvsp[-2].ptree; yyval.ptree->child[1] = yyvsp[0].ptree; }break;case 19:#line 151 "Parse.y"{ yyval.ptree = newDecNode(FunDefK); yyval.ptree->type = Void; yyval.ptree->attr.name = savedFunName; yyval.ptree->child[0] = yyvsp[-2].ptree; yyval.ptree->child[1] = yyvsp[0].ptree; }break;case 20:#line 161 "Parse.y"{ yyval.ptree = newDecNode(FunDecK); yyval.ptree->attr.name = savedFunName; yyval.ptree->type = yyvsp[-6].type; yyval.ptree->child[0] = yyvsp[-2].ptree; yyval.ptree->child[1] = NULL; }break;case 21:#line 169 "Parse.y"{ yyval.ptree = newDecNode(FunDecK); yyval.ptree->attr.name = savedFunName; yyval.ptree->type = Void; yyval.ptree->child[0] = yyvsp[-2].ptree; yyval.ptree->child[1] = NULL; }break;case 22:#line 178 "Parse.y"{yyval.ptree = yyvsp[0].ptree;}break;case 23:#line 179 "Parse.y"{yyval.ptree = NULL;}break;case 24:#line 183 "Parse.y"{ TreeNode *t = yyvsp[-2].ptree; if (t!=NULL) { while (t->sibling != NULL) t = t->sibling; t->sibling = yyvsp[0].ptree; yyval.ptree = yyvsp[-2].ptree; } else yyval.ptree = yyvsp[0].ptree; }break;case 25:#line 195 "Parse.y"{yyval.ptree = yyvsp[0].ptree;}break;case 26:#line 199 "Parse.y"{ yyval.ptree = newDecNode(ParamK); yyval.ptree->type = yyvsp[0].type; }break;case 27:#line 204 "Parse.y"{ yyval.ptree = newDecNode(ParamK); yyval.ptree->type = yyvsp[-1].type; yyval.ptree->attr.name = savedIdName; }break;case 28:#line 211 "Parse.y"{ yyval.ptree = newDecNode(ParamK); yyval.ptree->type = yyvsp[-3].type; yyval.ptree->attr.name = savedIdName; }break;case 29:#line 218 "Parse.y"{ yyval.ptree = newDecNode(ParamK); yyval.ptree->type = yyvsp[-4].type; yyval.ptree->attr.name = savedIdName; yyval.ptree->child[0] = yyvsp[-1].ptree; }break;case 30:#line 227 "Parse.y"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -