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

📄 y.tab.c

📁 这是我自己实现的一个微小的编译程序,附可执行代码的虚拟机,是理解编译原理的绝好材料.
💻 C
📖 第 1 页 / 共 3 页
字号:
							 symtab[yyval.sym_off].nextlist = makelist(code_off+1);
							 emitCode((symtab[yyvsp[0].sym_off].type==INT)?op_read:op_readf,-1,-1,symtab[yyvsp[0].sym_off].place);
							 emitCode(op_jmp,-1,-1,-1);
							}
break;
case 24:
#line 181 "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);}
							 yyvsp[0].sym_off=p;
							 yyval.sym_off=sym_off++;
							 symtab[yyval.sym_off].nextlist=makelist(code_off+1);
							 emitCode((symtab[yyvsp[0].sym_off].type==INT)?op_write:op_writef,-1,-1,symtab[yyvsp[0].sym_off].place);
							 emitCode(op_jmp,-1,-1,-1);}
break;
case 25:
#line 189 "grammer.y"
{int temp=0;
							 yyval.sym_off=sym_off++;
							 if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=INT;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_add,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fadd,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fadd,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_fadd,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else
							 {
							 	type_error();
							 }
							}
break;
case 26:
#line 230 "grammer.y"
{int temp=0;
							 yyval.sym_off=sym_off++;
							 if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=INT;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_minus,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fminus,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fminus,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_fminus,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else
							 {
							 	type_error();
							 }
							}
break;
case 27:
#line 271 "grammer.y"
{
								yyval.sym_off=yyvsp[0].sym_off;
							}
break;
case 28:
#line 275 "grammer.y"
{int temp=0;
							 yyval.sym_off=sym_off++;
							 if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=INT;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_mult,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fmult,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fmult,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_fmult,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else
							 {
							 	type_error();
							 }
							 
							}
break;
case 29:
#line 317 "grammer.y"
{int temp=0;
							 yyval.sym_off=sym_off++;
							 if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=INT;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_div,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==INT)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fdiv,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==INT))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	/*symtab[$1.sym_off].type=REAL;		/*如果存储是常量或变量被以后用到,为避免再次转换,所以要设置类型,否则生成代码产生错误结果* /*/
							 	temp=mem_off;
							 	emitCode(op_mov,symtab[yyvsp[-2].sym_off].place,-1,temp);
							 	emitCode(op_inttoreal,temp,-1,temp);
							 	emitCode(op_fdiv,temp,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else if((symtab[yyvsp[-2].sym_off].type==REAL)&&(symtab[yyvsp[0].sym_off].type==REAL))
							 {
							 	symtab[yyval.sym_off].type=REAL;
							 	symtab[yyval.sym_off].place = mem_off++;
							 	emitCode(op_fdiv,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 	
							 }
							 else
							 {
							 	type_error();
							 }
							}
break;
case 30:
#line 358 "grammer.y"
{
							 	yyval.sym_off=yyvsp[0].sym_off;
							}
break;
case 31:
#line 362 "grammer.y"
{yyval.sym_off=yyvsp[-2].sym_off;}
break;
case 32:
#line 363 "grammer.y"
{yyval.sym_off=sym_off++;
							 symtab[yyval.sym_off].type=INT;
							 symtab[yyval.sym_off].place=mem_off++;
							 emitCode(op_cmov,yyvsp[0].ival,-1,symtab[yyval.sym_off].place);
							}
break;
case 33:
#line 368 "grammer.y"
{yyval.sym_off=sym_off++;
							 symtab[yyval.sym_off].type=REAL;
							 symtab[yyval.sym_off].place=mem_off++;
							 emitFCode(op_fcmov,yyvsp[0].dval,-1,symtab[yyval.sym_off].place);
							}
break;
case 34:
#line 373 "grammer.y"
{int p=lookup(yyvsp[0].idname);
							 if(p==-1){printf("ERROR:line %d variable %s is undefined.",yylineno,name+yyvsp[0].idname);exit(1);}
							 yyval.sym_off=p;
							}
break;
case 35:
#line 378 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 36:
#line 379 "grammer.y"
{yyval.sym_off=sym_off++;
							 if((symtab[yyvsp[-3].sym_off].type==BOOL)&&(symtab[yyvsp[-1].sym_off].type==BOOL))
							 {
							 	backpatch(symtab[yyvsp[-3].sym_off].falselist,symtab[yyvsp[-1].sym_off].place);
							 	symtab[yyval.sym_off].truelist=merge(symtab[yyvsp[-3].sym_off].truelist,symtab[yyvsp[0].sym_off].truelist);
							 	symtab[yyval.sym_off].falselist=symtab[yyvsp[0].sym_off].falselist;
							 	/*symtab[$$.sym_off].place=mem_off++;*/
							 	/*emitCode(op_or,symtab[$1.sym_off],place,symtab[$3.sym_off].place,symtab[$$.symtab].place);*/
							 }
							 else
							 {
							 	type_error();	
							 }
							}
break;
case 37:
#line 393 "grammer.y"
{yyval.sym_off=sym_off++;
							 if((symtab[yyvsp[-3].sym_off].type==BOOL)&&(symtab[yyvsp[0].sym_off].type==BOOL))
							 {
							 	backpatch(symtab[yyvsp[-3].sym_off].truelist,symtab[yyvsp[-1].sym_off].place);
							 	backpatch(symtab[yyvsp[-3].sym_off].falselist,symtab[yyvsp[-1].sym_off].place);
							 	backpatch(symtab[yyvsp[0].sym_off].truelist,code_off);
							 	backpatch(symtab[yyvsp[0].sym_off].falselist,code_off);
							 	symtab[yyval.sym_off].place=mem_off++;
							 	emitCode(op_xor,symtab[yyvsp[-3].sym_off].place,symtab[yyvsp[-1].sym_off].place,symtab[yyval.sym_off].place);
							 	symtab[yyval.sym_off].truelist=symtab[yyval.sym_off].falselist=NULL;	/*不需要回填*/
							 }
							 else
							 {
							 	type_error();	
							 }
							}
break;
case 38:
#line 410 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 39:
#line 411 "grammer.y"
{yyval.sym_off=sym_off++;
							 if((symtab[yyvsp[-3].sym_off].type==BOOL)&&(symtab[yyvsp[0].sym_off].type==BOOL))
							 {
							 	backpatch(symtab[yyvsp[-3].sym_off].truelist,symtab[yyvsp[-2].sym_off].place);
							 	symtab[yyval.sym_off].truelist=symtab[yyvsp[-1].sym_off].truelist;
							 	symtab[yyval.sym_off].falselist=merge(symtab[yyvsp[-3].sym_off].falselist,symtab[yyvsp[0].sym_off].falselist);
							 	symtab[yyval.sym_off].place=mem_off++;
							 	emitCode(op_and,symtab[yyvsp[-3].sym_off].place,symtab[yyvsp[-1].sym_off].place,symtab[yyval.sym_off].place);
							 }
							 else
							 {
							 	type_error();	
							 }
							}
break;
case 40:
#line 426 "grammer.y"
{yyval.sym_off=yyvsp[0].sym_off;}
break;
case 41:
#line 427 "grammer.y"
{yyval.sym_off=sym_off++;
							 if(symtab[yyvsp[-1].sym_off].type==BOOL)
							 {
							 	symtab[yyval.sym_off].place=mem_off++;
							 	symtab[yyval.sym_off].truelist=symtab[yyvsp[-1].sym_off].falselist;
							 	symtab[yyval.sym_off].falselist=symtab[yyvsp[-1].sym_off].truelist;
							 	/*emitCode(op_neg,symtab[$3.sym_off].place,-1,symtab[$$.sym_off],place);*/
							 }
							 
							}
break;
case 42:
#line 437 "grammer.y"
{yyval.sym_off=sym_off++;
							 symtab[yyval.sym_off].place=mem_off++;
							 symtab[yyval.sym_off].type=BOOL;
							 symtab[yyval.sym_off].truelist=makelist(code_off+2);
							 symtab[yyval.sym_off].falselist=makelist(code_off+1);
							 switch(yyvsp[-1].relop)
							 {
							 	case RA:operator=op_a;break;
							 	case RAE:operator=op_ae;break;
							 	case RE:operator=op_e;break;
							 	case RB:operator=op_b;break;
							 	case RBE:operator=op_be;break;
							 	
							 	
							 }/*经过试验,关系操作操作数可以是不同类型,不用转换*/
							 emitCode(operator,symtab[yyvsp[-2].sym_off].place,symtab[yyvsp[0].sym_off].place,symtab[yyval.sym_off].place);
							 emitCode(op_zjmp,symtab[yyval.sym_off].place,-1,-1);/*不成立时为0跳转*/
							 emitCode(op_jmp,-1,-1,-1);
							}
break;
#line 1107 "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 + -