emitter.c

来自「编译原理 做一个后缀翻译 还有抽象堆栈机代码翻译」· C语言 代码 · 共 85 行

C
85
字号
/**** emitter.c *****/

#include "global.h"




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 '/':{
				/*printf("%c ",t);fprintf(fpw,"%c ",t);op=t;Pop(&N,&lval);Pop(&N,&rval);ans=compute(lval,rval,op);Push(&N,ans);
				if(N.top-N.base==1){
					Pop(&N,&ans);	
				}*/
				Push(&O,t);
				Push(&S,t);
				break;
			}
			case DIV:{
				/*printf("DIV ");fprintf(fpw,"DIV ");op=t;Pop(&N,&lval);Pop(&N,&rval);ans=compute(lval,rval,op);Push(&N,ans);
				if(N.top-N.base==1){
					Pop(&N,&ans);
				}*/
				Push(&O,t);
				Push(&S,t);
				break;
			}
			case MOD:{
				/*printf("MOD ");fprintf(fpw,"MOD ");op=t;Pop(&N,&lval);Pop(&N,&rval);ans=compute(lval,rval,op);Push(&N,ans);
				if(N.top-N.base==1){
					Pop(&N,&ans);
				}*/
				Push(&O,t);
				Push(&S,t);
				break;
			}
			case NUM:{
				 /*Push(&N,tval);
				 ans=tval;
				 printf("%d ",tval);
				 fprintf(fpw,"%d ",tval);*/
				 Push(&N,tval);
				 Push(&N,t);
				 Push(&S,tval);
				 Push(&S,t);
				 break;
			}
			case ID:
				/*printf("%s ",symtable[tval].lexptr);fprintf(fpw,"%s ",symtable[tval].lexptr);anserror=1;*/
				Push(&N,tval);
				Push(&N,t);
				Push(&S,tval);
				Push(&S,t);
				anserror=1;//不可计算
				break;
			default:
				/*printf("token %d,tokenval %d ",t,tval);fprintf(fpw,"token %d,tokenval %d\n",t,tval);anserror=1;*/
				Push(&N,tval);
				Push(&N,t);
				Push(&S,tval);
				Push(&S,t);
				anserror=1;//不可计算
				return;
		}
	}
}

⌨️ 快捷键说明

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