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

📄 y_tab.c

📁 这是我自己实现的一个微小的编译程序,附可执行代码的虚拟机,是理解编译原理的绝好材料.
💻 C
📖 第 1 页 / 共 3 页
字号:
{
    if (1 < yyrhs_count)
    {  /* draw the graphics for the reduction */
        YYDEBUG_INDENT(yynew_indent);
        while(1 < yyrhs_count--)
            printf("%s", YYDEBUG_REDUCE_STRING);
        putchar('+'); /* left rotated L would look nice */
        putchar('\n');
        YYDEBUG_INDENT(yynew_indent);
        putchar('|'); /* down arrow would look nice */
        putchar('\n');
    }
    YYDEBUG_INDENT(yynew_indent);
    /* Only print the resulting token name */
    while (*yyrule_string && ' ' != *yyrule_string)
        putchar(*yyrule_string++);
    putchar('\n');
}
#endif /* YYDEBUG_REDUCE */
#ifndef YYDEBUG_SHIFT_LEXEME
YYDEBUG_SHIFT_LEXEME(yyold_state, yynew_state, yytoken_string, yynew_indent)
int yyold_state;
int yynew_state;
char * yytoken_string;
int yynew_indent;
{
    YYDEBUG_INDENT(yynew_indent);
    printf("%s <-- `%s'\n", yytoken_string, YYDEBUG_LEXER_TEXT);
}
#endif /*  YYDEBUG_SHIFT_LEXEME */
#ifndef YYDEBUG_LOOK_AHEAD
YYDEBUG_LOOK_AHEAD(yynew_state, yytoken_num, yytoken_string, yyindent)
int yynew_state;
int yytoken_num;
char * yytoken_string;
int yyindent;
{
    YYDEBUG_INDENT(yyindent);
    printf("          .... look ahead at %s   `%s'\n",
           yytoken_string,
           (0 == yytoken_num)? "\0": YYDEBUG_LEXER_TEXT);
}
#endif /* YYDEBUG_LOOK_AHEAD */
#ifndef YYDEBUG_DISCARD_STATE
YYDEBUG_DISCARD_STATE(yynew_state, yyindent)
int yynew_state;
int yyindent;
{
    if (0 < yyindent)
    {  /* draw the graphics for the reduction */
        YYDEBUG_INDENT(yyindent-1);
        printf("%s", YYDEBUG_REDUCE_STRING);
        putchar('+'); /* left rotated L would look nice */
        printf("  discarding state\n");
        YYDEBUG_INDENT(yyindent-1);
        putchar('|'); /* down arrow would look nice */
        putchar('\n');
    }
    else
    {
        if (0 == yyindent)
            printf("discarding state\n");
        else
            printf("no more states to discard: parser will abort\n");
    }
}
#endif /* YYDEBUG_DISCARD_STATE */
#ifndef YYDEBUG_DISCARD_TOKEN
YYDEBUG_DISCARD_TOKEN(yynew_state, yytoken_num, yytoken_string, yyindent)
int yynew_state;
int yytoken_num;
char * yytoken_string;
int yyindent;
{
    YYDEBUG_INDENT(yyindent);
    printf("discarding token %s\n", yytoken_string);
}
#endif /* YYDEBUG_DISCARD_TOKEN */
#ifndef YYDEBUG_SHIFT_ERROR_LEXEME
YYDEBUG_SHIFT_ERROR_LEXEME(yyold_state, yynew_state, yyindent)
int yyold_state;
int yynew_state;
int yyindent;
{
    YYDEBUG_INDENT(yyindent);
    printf("error\n");
}
#endif /* YYDEBUG_SHIFT_ERROR_LEXEME */
#endif /* YYDEBUG */
int
yyparse()
{
    register int yym, yyn, yystate;
#if YYDEBUG
    register char *yys;
    extern char *getenv();

    if (yys = getenv("YYDEBUG"))
    {
        yyn = *yys;
        if (yyn >= '0' && yyn <= '9')
            yydebug = yyn - '0';
    }
#endif

    yynerrs = 0;
    yyerrflag = 0;
    yychar = (-1);

    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";
            if (5 > yydebug)
                printf("yydebug: state %d, reading %d (%s)\n", yystate,
                        yychar, yys);
            else
                YYDEBUG_LOOK_AHEAD(yystate, yychar, yys, yyssp-yyss);
        }
#endif
    }
    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
    {
#if YYDEBUG
        if (yydebug)
            if (5 > yydebug)
                printf("yydebug: state %d, shifting to state %d\n",
                        yystate, yytable[yyn]);
            else
                YYDEBUG_SHIFT_LEXEME(yystate, yytable[yyn], yys, yyssp-yyss);
#endif
        if (yyssp >= yyss + yystacksize - 1)
        {
            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;
#ifdef lint
    goto yynewerror;
#endif
yynewerror:
    yyerror("syntax error");
#ifdef lint
    goto yyerrlab;
#endif
yyerrlab:
    ++yynerrs;
yyinrecovery:
    if (yyerrflag < 3)
    {
        yyerrflag = 3;
        for (;;)
        {
            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
            {
#if YYDEBUG
                if (yydebug)
                    if (5 > yydebug)
                        printf("yydebug: state %d, error recovery shifting\
 to state %d\n", *yyssp, yytable[yyn]);
                    else
                        YYDEBUG_SHIFT_ERROR_LEXEME(*yyssp, yytable[yyn], yyssp-yyss);
#endif
                if (yyssp >= yyss + yystacksize - 1)
                {
                    goto yyoverflow;
                }
                *++yyssp = yystate = yytable[yyn];
                *++yyvsp = yylval;
                goto yyloop;
            }
            else
            {
#if YYDEBUG
                if (yydebug)
                    if (5 > yydebug)
                        printf("yydebug: error recovery discarding state %d\n",
                            *yyssp);
                    else
                        YYDEBUG_DISCARD_STATE(*yyssp, yyssp-yyss-1);
#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";
            if (5 > yydebug)
                printf("yydebug: state %d, error recovery discards token %d (%s)\n",
                    yystate, yychar, yys);
            else 
                YYDEBUG_DISCARD_TOKEN(yystate, yychar, yys, yyssp-yyss);
        }
#endif
        yychar = (-1);
        goto yyloop;
    }
yyreduce:
    yym = yylen[yyn];
    yyval = yyvsp[1-yym];
#if YYDEBUG
    if (yydebug)
        if (5 > yydebug)
            printf("yydebug: state %d, reducing by rule %d (%s)\n",
                    yystate, yyn, yyrule[yyn]);
        else
            YYDEBUG_REDUCE(yystate, yyn, yyrule[yyn], yyssp-yyss-yym, yym);
#endif
    switch (yyn)
    {
case 1:
#line 77 "grammer.y"
{int i;printf("sym_off(符号个数)=%d\ncode_off(代码行数)=%d\n",sym_off,code_off);YYACCEPT;}
break;
case 2:
#line 79 "grammer.y"
{offset = 0;}
break;
case 3:
#line 80 "grammer.y"
{}
break;
case 4:
#line 81 "grammer.y"
{}
break;
case 5:
#line 83 "grammer.y"
{int p = lookup(yyvsp[-2].idname);
							 if(p!=-1){printf("error: line %d variable %s redefinition",yylineno,name+yyvsp[-2].idname);exit(1);}
							 
							 /*$2.sym_off=p;*/
							 
							 enterID(sym_off,yyvsp[-2].idname,symtab[yyvsp[0].sym_off].type);
							 yyvsp[-2].sym_off=sym_off++;
							 addType(yyvsp[-2].sym_off,symtab[yyvsp[0].sym_off].type);/*变量合法,add type and alloc memery space*/}
break;
case 6:
#line 92 "grammer.y"
{yyval.sym_off=sym_off++;symtab[yyval.sym_off].type=REAL;}
break;
case 7:
#line 93 "grammer.y"
{yyval.sym_off=sym_off++;symtab[yyval.sym_off].type=INT;}
break;
case 8:
#line 95 "grammer.y"
{backpatch(symtab[yyvsp[-1].sym_off].nextlist,symtab[yyvsp[0].sym_off].place);}
break;
case 9:
#line 97 "grammer.y"
{yyval.sym_off=sym_off++;
							 symtab[yyval.sym_off].nextlist=symtab[yyvsp[-1].sym_off].nextlist;
							 }
break;
case 10:
#line 101 "grammer.y"
{backpatch(symtab[yyvsp[-3].sym_off].nextlist,symtab[yyvsp[-1].sym_off].place);
							 yyval.sym_off=yyvsp[0].sym_off;						}
break;
case 11:
#line 103 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 12:
#line 105 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 13:
#line 106 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 14:
#line 107 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 15:
#line 108 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 16:
#line 109 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 17:
#line 110 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 18:
#line 112 "grammer.y"
{if(symtab[yyvsp[-7].sym_off].type==BOOL/*&&symtab[$4.sym_off].type==symtab[$6.sym_off].type*/)
							 {/*不对语句设置类型*/
							  yyval.sym_off = sym_off++;
							  backpatch(symtab[yyvsp[-7].sym_off].truelist,symtab[yyvsp[-6].sym_off].place);
							  backpatch(symtab[yyvsp[-7].sym_off].falselist,symtab[yyvsp[-2].sym_off].place);
							  symtab[yyval.sym_off].nextlist = merge(symtab[yyvsp[-4].sym_off].nextlist,symtab[yyvsp[-1].sym_off].nextlist);
							  /*symtab[$$.sym_off].nextlist = merge(symtab[$$.sym_off].nextlist,symtab[$6.sym_off].nextlist); //开始按照教材上写,在ELSE前有符号N,再加上这一句,不能正确回填,去掉后正常*/
							 }
							 else type_error();}
break;
case 19:
#line 121 "grammer.y"
{if(symtab[yyvsp[-4].sym_off].type==BOOL)
							  {
							 	yyval.sym_off = sym_off++;
							 	backpatch(symtab[yyvsp[-4].sym_off].truelist,symtab[yyvsp[-3].sym_off].place);
							 	symtab[yyval.sym_off].nextlist=merge(symtab[yyvsp[-4].sym_off].falselist,symtab[yyvsp[-1].sym_off].nextlist);
							  }
							  else type_error();}
break;
case 20:
#line 129 "grammer.y"
{yyval.sym_off=sym_off++;symtab[yyval.sym_off].place=code_off;}
break;
case 21:
#line 131 "grammer.y"
{
								backpatch(symtab[yyvsp[0].sym_off].nextlist,symtab[yyvsp[-4].sym_off].place);
								backpatch(symtab[yyvsp[-3].sym_off].truelist,symtab[yyvsp[-1].sym_off].place);
								symtab[yyval.sym_off].nextlist=symtab[yyvsp[-3].sym_off].falselist;
								/*emitCode(op_jmp,-1,-1,symtab[$2.sym_off].place);*/
							}
break;
case 22:
#line 138 "grammer.y"
{int temp=0;
							 int p=lookup(yyvsp[-2].idname);
							 if(p==-1){printf("ERROR: line %d identifier %s undefined.",yylineno,name+yyvsp[-2].idname);exit(1);}
							 yyvsp[-2].sym_off=p;
							 yyval.sym_off=sym_off++;
							 
							 if(symtab[yyvsp[-2].sym_off].type==symtab[yyvsp[0].sym_off].type)
							 {
							 	symtab[yyval.sym_off].nextlist = makelist(code_off+1);
							 	emitCode(op_mov,symtab[yyvsp[0].sym_off].place,-1,symtab[yyvsp[-2].sym_off].place);
							 	emitCode(op_jmp,-1,-1,-1);
							 }
							 else if(symtab[yyvsp[-2].sym_off].type==REAL&&symtab[yyvsp[0].sym_off].type==INT)/*需要类型转换*/
							 {
							 	/*symtab[$3.sym_off].type=REAL;				//不能修改变量类型,原为bug*/
							 	symtab[yyval.sym_off].nextlist = makelist(code_off+3);
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[0].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);/*考虑到表达式的值只是临时变量,所以就在其上类型转换*/
							 	emitCode(op_mov,temp,-1,symtab[yyvsp[-2].sym_off].place);
							 	emitCode(op_jmp,-1,-1,-1);
							 }
							 else if(symtab[yyvsp[-2].sym_off].type==INT&&symtab[yyvsp[0].sym_off].type==REAL)/*需要类型转换*/
							 {
							 	/*symtab[$3.sym_off].type=INT;*/
							 	symtab[yyval.sym_off].nextlist = makelist(code_off+3);	/*此处设置不正确,导致bug*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[0].sym_off].place,-1,temp);
							 	emitCode(op_realtoint,temp,-1,temp);/*考虑到表达式的值只是临时变量,所以就在其上类型转换*/
							 	emitCode(op_mov,temp,-1,symtab[yyvsp[-2].sym_off].place);
							 	emitCode(op_jmp,-1,-1,-1);
							 }
							 else type_error();}
break;
case 23:
#line 172 "grammer.y"
{int p=lookup(yyvsp[0].idname);
							 if(p==-1){printf("ERROR: line %d identifier %s is undefined.",yylineno,name+yyvsp[0].idname);exit(1);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -