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

📄 emitter.c

📁 编译原理 做一个后缀翻译 还有抽象堆栈机代码翻译
💻 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 + -