编译原理 实验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*#,要求输出为“非法的符号串”。
注意:
- 表达式中允许使用运算符(+-*/)、分割符(括号)、字符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; }
上一篇:
IDEA上Java项目控制台中文乱码