文法描述:
G[E]:
E → T E’
E’→ + T E’|ε
T → F T’
T’→ * F T’|ε
F → ( E )|id
实验要求:
输入一个表达式,分析满足语法规则输出ACC,否则输出ERROR
使用递归下降子程序设计这个文法的语法分析程序。
程序设计:
#include<iostream>
#include<stdio.h>
using namespace std;
char lookahead;//当前正在处理的字符
char nextToken() {//向前读取一个字符
lookahead = getchar();
return lookahead;
}
void error() {//报告错误信息
cout << "ERROR" << endl;
}
void match(char t) {// 匹配一个终结符
if (lookahead == '#') cout << "ACC" << endl;
else if (lookahead == t) lookahead=nextToken();
else error();
}
void E();
void E1();
void T();
void T1();
void F();
void E() {
T();
E1();
}
void E1() {
if (lookahead == '+') {
match('+');
T();
E1();
}
}
void T() {
F();
T1();
}
void T1() {
if (lookahead == '*') {
match('*');
F();
T1();
}
}
void F() {
if (lookahead == 'i') match('i');
else if (lookahead == '(') {
match('(');
E();
if (lookahead == ')') match(')');
else error();
}
else error();
}
int main() {
lookahead=nextToken();
E();
match('#');
return 0;
}
代码测试:
实验收获:
对递归下降词法分析器的结构,
过程有了更进一步的了解,
通过学习书本和试验原理书上的内容,
对它的工作原理,
具体实行步骤有了进一步的掌握。
这次实验让我了解到如何设计、
编制并调试递归下降语法分析程序,
加深对递归下降语法分析原理的理解;
熟悉了构造递归下降语法分析程序的手工方式的相关原理,
根据识别语言单词的状态转换图。
由于本次试验是测试性试验,
所以要求输出的结果是成功与否,
输入一个句型,进过分析,判断它是否合法,
主要内容在于其判断过程中。
本次试验不光提高了自己的编程能力,
同时提高了对递归下降的了解。