⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.c

📁 在linux下实行的简单的c语言编译器
💻 C
📖 第 1 页 / 共 3 页
字号:
{    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 + -