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

📄 parser.c

📁 编译原理 做一个后缀翻译 还有抽象堆栈机代码翻译
💻 C
字号:
/*********************  parser.c  ******************************/
#include "global.h"

void parse();			//函数声明
int expr();
int term();
void factor();
void match(int t);

int lookahead;

void parse()                  // 分析并翻译表达式列表
{	
	lookahead=lexan();
	while(lookahead!=DONE){
	//	if(lookahead==13){
	//		printf("\n");
	//		lookahead=lexan();
	//		continue;
	//	}
		expr();
		match(';');
	}
}

int expr()
{
	int t;
	term();
	while(1){
		switch(lookahead){
			case '+':
			case '-':
				t=lookahead;
				match(lookahead);
				//printf("lookahead1:%d,%c\n",lookahead,lookahead);
				term();
				emit(t,NONE);
				continue;
			default:
				return 0;
		}
	}
}

int term()
{
	int t;
	//printf("look:%d,%c\n",lookahead,lookahead);
	factor();
	while(1)
		switch(lookahead){
			case '*':
			case '/':
			case DIV:
			case MOD:
				t=lookahead;
				match(lookahead);
				factor();
				emit(t,NONE);
				continue;
			default:
				return 0;
		}
}

void factor()
{
//printf("lookahead:%d,%c\n",lookahead,lookahead);
	switch(lookahead){
		case '(':
			match('(');
			expr();
			match(')');
			break;
		case NUM:
			emit(NUM,tokenval);
			match(NUM);
			break;
		case ID:
			emit(ID,tokenval);
			match(ID);
			break;
		default:
			error("syntax error");
	}
}

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

⌨️ 快捷键说明

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