编译原理 实验2《递归下降分析法》

一,实验内容

对下列文法,用递归下降分析法对任意输入的符号串进行分析:

(1)E- TG

(2)G- +TG|—TG

(3)G- ε

(4)T- FS

(5)S- *FS|/FS

(6)S- ε

(7)F- (E)

(8)F- i

输出的格式如下:

(1)递归下降分析程序,编制人:姓名,学号,班级

(2)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#

(3)输出结果:i+i*i#为合法符号串

备注:输入一符号串如i+i*#,要求输出为“非法的符号串”。

注意:

  1. 表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;
  2. 如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)。

二,实验方法和步骤

1,消除左递归

给出的文法没有左递归,不需要再变

2,提取公共左因子

给出的文法没有公共左因子,这一步也略掉了

3,代码

#include<iostream>
#include<string>
using namespace std;

char line[100];
int i = 0;

bool E();		//声明5个函数
bool T();
bool G();
bool F();
bool S();

定义5个函数
bool E()
{
	if (T() && G())return true;
	else return false;
}
bool T()
{
	if (F() && S())return true;
	else return false;
}
bool G()
{
	if (line[i] == + || line[i] == -)
	{
		i++;
		if (T() && G())return true;
		else return false;
	}
	else return true;
}
bool S()
{
	if (line[i] == * || line[i] == /)
	{
		i++;
		if (F() && S())return true;
		else return false;
	}
	else return true;
}
bool F()
{
	if (line[i] == i)
	{
		i++;
		return true;
	}
	if (line[i] == ()
	{
		i++;
		if (E() && line[i] == ))
		{
			i++;
			return true;
		}
	}
	return false;
}

int main()
{
	cin.getline(line, 20);
	if (E() && line[i] == #)cout << "yes";
	else cout << "no";
	system("pause>nul");
	return 0;
}
经验分享 程序员 微信小程序 职场和发展