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

📄 expression.cpp

📁 一个简单的语法分析器,实现对布尔表达式,算术表达式的分析,以及if语句,FOR语句,WHILE语句,DO_WHILE语句的分析
💻 CPP
字号:
//算术表达式分析
//算术表达式文法:
//E --> E+T | E-T| T
//T --> T*F | T/F| F
//F --> i |(E)
//修改为无左递归的文法为:
//E --> TE1
//E1 --> +TE1 | -TE1 | e
//T --> FT1
//T1 --> *FT1 |/FT1 |e
//F --> i | (E)
#include "Parser.h"

//开始分析表达式,用递归下降的分析方法
int Expression_Analysis()
{
	Expression_Init();
	return E_AddSub();
}
//分析E --> TE1
int E_AddSub()
{
	cout << "E_AddSub()" << endl;
	return E_AddSub(T_MulDiv());
}
//分析E1 --> +TE1 | -TE1 | e
int E_AddSub(int temp)
{
	cout << "E_AddSub(int)" << endl;
	int rtn = temp;
	if(expr[pos].code == 35)         //+
	{
		int op = expr[pos].code;
		pos ++;
		int temp_addr = T_MulDiv();
		int t1 = New_Temp();
		if(!expr_rtn_addr_control)
		{
			expr_rtn_addr_control = true;
			expr_rtn_addr = EquPush(2, temp, temp_addr, t1);
		}
		else
			EquPush(2, temp, temp_addr, t1);
		rtn = E_AddSub(t1);
	}
	if(expr[pos].code == 36)        // -
	{
		int op = expr[pos].code;
		pos ++;
		int temp_addr = T_MulDiv();
		int t1 = New_Temp();
		if(!expr_rtn_addr_control)
		{
			expr_rtn_addr_control = true;
			expr_rtn_addr = EquPush(3, temp, temp_addr, t1);
		}
		else
			EquPush(3, temp, temp_addr, t1);
		rtn = E_AddSub(t1);
	}
	return rtn;
}
//T --> FT1
int T_MulDiv()
{
	cout << "T_MulDiv()" <<endl;
	return T_MulDiv(F_Number());
}
//分析T1 --> *FT1 |/FT1 |e
int T_MulDiv(int temp)
{
	cout << "T_MulDiv(int)" << endl;
	int rtn = temp;
	if(expr[pos].code == 34)         //*
	{
		int op = expr[pos].code;
		pos ++;
		int temp_addr = F_Number();
		int t1 = New_Temp();
		if(!expr_rtn_addr_control)
		{
			expr_rtn_addr_control = true;
			expr_rtn_addr = EquPush(4, temp, temp_addr, t1);
		}
		else
			EquPush(4, temp, temp_addr, t1);
		rtn = T_MulDiv(t1);
	}
	if(expr[pos].code == 39)        // /
	{

		int op = expr[pos].code;
		pos ++;
		int temp_addr = F_Number();
		int t1 = New_Temp();
		if(!expr_rtn_addr_control)
		{
			expr_rtn_addr_control = true;
			expr_rtn_addr = EquPush(5, temp, temp_addr, t1);
		}
		else{
					cout << "/" << endl;
			EquPush(5, temp, temp_addr, t1);
		}
		rtn = T_MulDiv(t1);
	}
	return rtn;
}
//分析F --> i | (E)
int F_Number()
{
	cout << "F_Number()" << endl;
	int rtn = 0;
	if(expr[pos].code == 32)           // (
	{
		pos ++;
		rtn = E_AddSub();
		if(expr[pos].code != 33)         //)
			cout << "missing )" <<endl;
		else
		{
			pos++;
			cout << expr[pos].code << endl;
		}
	}
	
	if(expr[pos].code == 27 || expr[pos].code == 28 || expr[pos].code == 29)
	{
		cout << expr[pos].code << endl;
		rtn = expr[pos].addr;
		pos ++;
	}
	return rtn;
}

⌨️ 快捷键说明

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