parser.c

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

C
96
字号
/*********************  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 + =
减小字号Ctrl + -
显示快捷键?