📄 emitter.c
字号:
/**** emitter.c *****/
#include "global.h"
int compute(int lval,int rval,int op)
{
switch(op){
case '+':return lval+rval;
case '-':return lval-rval;
case '*':return lval*rval;
case '/':return lval/rval;
case DIV:return lval/rval;
case MOD:return lval%rval;
default:printf("unknown operator.\n");anserror=1;exit(1);
}
}
void emit(int t,int tval)
{//functype=0,后缀表达式,functype=1,解释
if(functype==0){
switch(t){
case '+':case '-':case '*':case '/':
printf("%c\n",t);fprintf(fpw,"%c\n",t);break;
case DIV:
printf("DIV\n");fprintf(fpw,"DIV\n");break;
case MOD:
printf("MOD\n");fprintf(fpw,"MOD\n");break;
case NUM:
printf("Push %d\n",tval);fprintf(fpw,"Push %d\n",tval);break;
case ID:
printf("%s\n",symtable[tval].lexptr);fprintf(fpw,"%s\n",symtable[tval].lexptr);break;
default:
printf("token %d,tokenval %d\n",t,tval);fprintf(fpw,"token %d,tokenval %d\n",t,tval);
}
}
else if(functype==1){
switch(t){
case '+':case '-':case '*':case '/':{
if(anserror==1){
printf("%c ",t);fprintf(fpw,"%c ",t);
}
op=t;Pop(&N,&rval);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);
break;
}
case DIV:{
if(anserror==1){
printf("DIV ");fprintf(fpw,"DIV ");
}
op=t;Pop(&N,&rval);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);
break;
}
case MOD:{
if(anserror==1){
printf("MOD ");fprintf(fpw,"MOD ");
}
op=t;Pop(&N,&rval);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);
break;
}
case NUM:{
Push(&N,tval);
ans=tval;
if(anserror==1){
printf("%d ",tval);
fprintf(fpw,"%d ",tval);
}
break;
}
case ID:
if(anserror==1){
printf("%s ",symtable[tval].lexptr);fprintf(fpw,"%s ",symtable[tval].lexptr);//anserror=1;
}
break;
default:
if(anserror==1){
printf("token %d,tokenval %d ",t,tval);fprintf(fpw,"token %d,tokenval %d\n",t,tval);
}//anserror=1;//不可计算
return;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -