一,实验内容
对下列文法,用递归下降分析法对任意输入的符号串进行分析:
(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*#,要求输出为“非法的符号串”。
注意:
- 表达式中允许使用运算符(+-*/)、分割符(括号)、字符I,结束符#;
- 如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好)。
二,实验方法和步骤
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;
}