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

📄 parser.c

📁 编译原理 做一个后缀翻译 还有抽象堆栈机代码翻译
💻 C
字号:
/**** parser.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);
	}
}


int lookahead;

void expr();
void match(int t)
{
	if(lookahead==t)
		lookahead=lexan();
	else error("syntax error");
}

void factor()
{
	int tt,ttv;
	switch(lookahead){
	case '(':
		match('(');expr();match(')');break;
	case NUM:
		emit(NUM,tokenval);match(NUM);break;
	/*case ID:
		emit(ID,tokenval);match(ID);break;*/
	case ID:
		{tt=lookahead;ttv=tokenval;match(ID);
			if(lookahead=='='){//id=expr();
				if(functype==0) {printf("lvalue ");fprintf(fpw,"lvalue ");}
				if(functype==1) {
					printf("%s ",symtable[ttv].lexptr);fprintf(fpw,"%s ",symtable[ttv].lexptr);
					match('=');expr();
					if(anserror!=1){printf("= ");fprintf(fpw,"= ");}
					break;
				}
				emit(tt,ttv);
				match('=');
				expr();
				printf("=\n");fprintf(fpw,"=\n");
				break;
			}
			else{//id;
				if(functype==0) {printf("rvalue ");fprintf(fpw,"rvalue ");}
				if(functype==1) {
					anserror=1;
				}
				emit(tt,ttv);
				break;
			}
		}
	default:
		error("syntax error");
	}
}

void term()
{
	int t;
	factor();
	while(1)
		switch(lookahead){
		case '*':
		case '/':
		case DIV:
		case MOD: t=lookahead;match(lookahead);factor();emit(t,NONE);continue;
		default:return;
	}
}

void expr()
{
	int t;
	term();
	while(1)
		switch(lookahead){
		case '+':
		case '-': t=lookahead;match(lookahead);term();emit(t,NONE);continue;
		default :return;
	}
}

void parse()
{
	int tval,op,t;
	Elemtype *s,*n;
	lookahead=lexan();
	while(lookahead!=DONE){
		anserror=0;
		expr();
		match(';');
		if(functype==1) {//若是进行翻译
			if(anserror==0){//可以计算,输出结果
				while(O.top!=O.base){
					Pop(&O,&t);
					switch(t){
						case '+':case '-':case '*':case '/':op=t;Pop(&N,&t);Pop(&N,&rval);Pop(&N,&t);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);break;
						case MOD:op=t;Pop(&N,&t);Pop(&N,&rval);Pop(&N,&t);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);break;
						case DIV:op=t;Pop(&N,&t);Pop(&N,&rval);Pop(&N,&t);Pop(&N,&lval);ans=compute(lval,rval,op);Push(&N,ans);break;
					}
				}
				Pop(&N,&ans);
				printf("\n%d\n",ans);
				fprintf(fpw,"\n%d\n",ans);
			}
			else{//不能计算,输出后缀表达式后换行
				s=S.base+1;
				while(S.top!=s){
					t=*s;
					switch(t){
						case NUM:tval=*(s-1);printf("%d ",tval);fprintf(fpw,"%d ",tval);s=s+2;break;
						case ID:tval=*(s-1);printf("%s ",symtable[tval].lexptr);fprintf(fpw,"%s ",symtable[tval].lexptr);s=s+2;break;
						case '+':case '-':case '*':case '/':
							tval=*s;printf("%c ",tval);fprintf(fpw,"%c ",tval);s=s+1;break;
						case DIV:
						  printf("DIV ");fprintf(fpw,"DIV ");s=s+1;break;
						case MOD:
							printf("MOD ");fprintf(fpw,"MOD ");s=s+1;break;
					}
				}
				printf("\n");
				fprintf(fpw,"\n");
			}
		}
		if(functype==0){//堆栈机代码显示后换一行
			printf("\n");
			fprintf(fpw,"\n");
		}
	 DestroyStack(&N);
	 DestroyStack(&O);
	 DestroyStack(&S);
 }
 fclose(fpo);//关闭输入文件
 fclose(fpw);//关闭输出文件
}

⌨️ 快捷键说明

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