📄 y.tab.c
字号:
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 + -