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

📄 parser.cpp

📁 一个简单的语法分析器,实现对布尔表达式,算术表达式的分析,以及if语句,FOR语句,WHILE语句,DO_WHILE语句的分析
💻 CPP
字号:
#include <iostream.h>
#include "Parser.h"
int main()
{
	Parser();
	return 0;
}

void Parser()
{
	error_count = 0;
	variable_count = 0;
	temp_count = 0;
	lineOfProc = 0;
	lineOfEqu = -1;
	curr_addr = 0;
	curr_code = 0;
	expr_length = 0;
	for(int i = 0; i < 30; i++)
		curr_name[i] = '\0';
	SymbleIn.open("tokenOut.txt", ios::nocreate);
	if(SymbleIn.fail())
	{
		cout << "file symbleOut.txt open failed, maybe it doesn't exist" << endl;
		return;
	}

	EquOut.open("equ.txt");
	if(EquOut.fail())
	{
		cout << "file equ.txt open failed" << endl;
		return;
	}
	cout << "##############################################" << endl;
	cout << "#################语法分析器###################" << endl;
	cout << "##############################################" << endl;
	cout << "正在进行分析任务......" << endl;
	GetNextSymble();
	if(curr_code == 18)          //pogram
	{
		GetNextSymble();
		if(curr_code == 27)      //biao zhi fu
		{
			GetNextSymble();
			if(curr_code == 42)
			{
				GetNextSymble();
			}
			if(curr_code == 25)    //var
			{
				Statement();
			}
			if(curr_code == 2)     //begin
			{
				Begin();
				if(curr_code == 38)     //程序要以.做为结束
					return;
				else
					Error(7);
			}
			else
			{
				Error(3);
			}
		}
		else
		{
			Error(2);
			return;
		}
	}
	else
	{
		Error(1);
		return;
	}


	int index = 0;
	while(index < lineOfEqu)
	{
		Gen_Equ(equ[index].op, equ[index].arg1, equ[index].arg2, equ[index].result);
		index++;
	}
	SymbleIn.close();
	EquOut.close();
}

//出错处理函数
void Error(int n)
{
	error_count++;
	switch(n)
	{
	case 1:
		cout << "ERROR " << error_count << ": 程序第一行缺少关键字program" << endl;
		break;
	case 2:
		cout << "ERROR " << error_count << ": program后缺少程序名" << endl;
		break;
	case 3:
		cout << "ERROR " << error_count << ": 该程序没有任何可执行语句" << endl;
		break;
	case 4:
		cout << "ERROR " << error_count << ": 第" << lineOfProc << "行声明语句有错误" << endl;
		break;
	case 5:
		cout << "ERROR " << error_count << ": 缺少end" << endl;
		break;
	case 6:
		cout << "ERROR " << error_count << ": 第" << lineOfProc << "缺少;" << endl;
		break;
	case 7:
		cout << "ERROR " << error_count << ": 程序要以.做为结尾" << endl;
		break;
	case 8:
		cout << "ERROR " << error_count << ": 第" << lineOfProc << "行语句有错误" << endl;
		break;
	case 9:
		cout << "ERROR " << error_count << ": 第" << lineOfProc << "行if条件语句有误" << endl;
		break; 
	default:
		break;
	}
}

//取出tokenOut.txt表中下一个待分析的标志符
//存放到全局变量curr_neme,curr_addr,curr_code中
void GetNextSymble()
{
	//char ch;
	int temp_label;
	if(!SymbleIn.eof())
		SymbleIn >> temp_label >> curr_name >> curr_addr >> curr_code >> lineOfProc;
	else
		curr_code = 0;
	SymbleIn.get();     //为了取出每行末尾的回车符与换行符
	SymbleIn.get();
	return;
}

//变量声明语句的分析
//不做特别处理,只是简单检查有无逻辑错误
//并统计变量个数,将其写入symbleOut.txt输出表中
void Statement()
{
	GetNextSymble();
	while(curr_code != 2)         //不为关键字begin
	{
		if(curr_code == 27)        //为标志符
		{
			variable_count++;
			GetNextSymble();
			if(curr_code == 37)      //,
			{
				GetNextSymble();
				if(curr_code != 27)
					Error(4);
			}
			else
			{
				if(curr_code == 40)     //:
				{
					GetNextSymble();
					if(curr_code == 3 || curr_code == 6 ||
						curr_code ==14 || curr_code == 19)
					{
						GetNextSymble();
						if(curr_code != 42)
							Error(6);
						else
							GetNextSymble();
					}
					else
						Error(4);
				}
				else
					Error(4);
			}
		}
		else
		{
			Error(4);
			GetNextSymble();
		}
	}
}

//开始分析可执行语句,即为begin后的语句
int Begin()
{
	//GetNextSymble();
	int rtn = Sen_Analysis();
	if(curr_code != 10)           //与begin配套的end
	{
		Error(5);
	}
	else
		GetNextSymble();
	return rtn;
}

int Sen_Analysis()
{
	int rtn = 0;
	GetNextSymble();
	switch(curr_code)
	{
	case 27:                      //标志符,说明是赋值语句
		Sen_Assign();
		rtn = expr_rtn_addr;
		break;
	case 12:
		rtn = Sen_For();             //for语句
		break;
	case 13:                       //if语句
		rtn = Sen_If();
		break;
	case 20:                       //repeat循环语句
		rtn = Sen_Repeat();
		break;
	case 26:                        //while循环语句
		rtn = Sen_While();
		break;
	case 10:                        //若为end,直接退出函数
		return 0;
	default:                        //其他语句为错误
		Error(8);
		break;
	}
	Sen_Analysis();
	return rtn;
}
//四元式入栈
int EquPush(int op, int arg1, int arg2, int result)
{
	lineOfEqu++;
	equ[lineOfEqu].op = op;
	equ[lineOfEqu].arg1 = arg1;
	equ[lineOfEqu].arg2 = arg2;
	equ[lineOfEqu].result = result;
	return lineOfEqu;
}
//回填函数
void BackPatch(int equ_num, int jmp_addr)
{
	equ[equ_num].result = jmp_addr;
}
//返回一个临时变量
int New_Temp()
{
	return --temp_count;
}
//产生四元式
void Gen_Equ(int op, int arg1, int arg2, int result)
{
	switch(op)
	{
	case 1:
		EquOut << "( 0    " << arg1 << "  " << arg2 << "  " << result << " )" <<endl; 
		break;
	case 2:
		EquOut << "( +    " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 3:
		EquOut << "( -    " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 4:
		EquOut << "( *    " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 5:
		EquOut << "( /    " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 6:
		EquOut << "( j    " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 7:
		EquOut << "( j<   " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 8:
		EquOut << "( j>   " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 9:
		EquOut << "( j=   " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 10:
		EquOut << "( j<=  " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 11:
		EquOut << "( j>=  " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	case 12:
		EquOut << "( j<>  " << arg1 << "  " << arg2 << "  " << result << " )" <<endl;
		break;
	default:
		break;
	}
}

⌨️ 快捷键说明

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