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

📄 emitter.c

📁 将简单中缀算术表达式变换成: (1)后缀形式 (2)生成书上描述的抽象堆栈机的代码 (3)对常量算术表达式
💻 C
字号:
#include "global.h"
emit(t,tval)
int t,tval;
{
	if(flag==1)    //输出表达式操作
	{
		switch(t)
		{
		case '+':case'-': case '*':case '/':
			fprintf(fp2,"%c\n",t);break;
		case DIV:
			fprintf(fp2,"DIV\n");break;
		case MOD:
			fprintf(fp2,"MOD\n");break;
		case NUM:
			fprintf(fp2,"push %d\n",tval);break;
		case ID:
			fprintf(fp2,"rvalue %s\n",symtable[tval].lexptr);break;
		default:
			fprintf(fp2,"token %d, tokenval %d\n",t,tval);
		}
	}
	else if(flag==0) //求值操作
	{
		if(wflag==1)  //表达式含标识符的只进行后缀表达式输出操作
		{
			switch(t)
			{
			case '+':case'-': case '*':case '/':
				fprintf(fp2,"%c ",t);break;
			case DIV:
				fprintf(fp2,"DIV ");break;
			case MOD:
				fprintf(fp2,"MOD ");break;
			case NUM:
				fprintf(fp2,"%d ",tval);break;
			case ID:
				fprintf(fp2,"%s ",symtable[tval].lexptr);break;
			default:
				fprintf(fp2,"\ntoken %d, tokenval %d\n",t,tval);
			}
		}
		else  //对不含标识符的表达式利用栈的相关操作进行求值
		{
			int a,b;
			switch(t)
			{
			case '+':
				a=pop();b=pop();
				push(a+b);
				break;
			case'-':
				a=pop();b=pop();
				push(a-b);
				break;
			case'*':
				a=pop();b=pop();
				push(a*b);
				break;
			case'/':
				a=pop();b=pop();
				push(a/b);
				break;
				
			case DIV:
				a=pop();b=pop();
				push(a/b);
				break;
				
			case MOD:
				a=pop();b=pop();
				push(a%b);
				break;
			case NUM:
				push(tval);break;
				
			default:
				printf("token %d, tokenval %d\n",t,tval);
			}
		}
	}
}

⌨️ 快捷键说明

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