教
师
评
分
评分点 1:实验方案分析
A:对实验方案有深刻的对比、分析
B:对实验方案有较为深刻的对比、分析
C:对实验方案有合理的对比、分析
D:对实验方案有比较合理的对比、分析
E:对实验方案没有对比、分析
评分点 2:实验结果的记录和分析
A:能用图、表等完整地记录实验结果,并有深刻的分析
B:能用图、表等比较完整地记录实验结果,并有合理的分析
C:能用图、表等记录实验结果,并有一定的分析
D:对实验记录不完整,对实验结果分析很少
E:对实验记录非常不完整,对实验结果没有分析
1 实验目的
• 理解和掌握算术表达式的文法构造,熟悉常用的语法分析方法。
• 理解和掌握布尔表达式的文法构造,熟悉常用的语法分析方法。
2 实验内容
• 根据 Sample 语言的语法规则判定输入的一串单词能否构成一个正确的算术表达式。
• 根据 Sample 语言的语法规则判定输入的一串单词能否构成一个正确的布尔表达式。
3 实验方案
3.1 方案描述
递归下降分析法的原理是利用函数之间的递归调用模拟语法树自上而下的构造过程,具体实
现方法概述如下:
1)每个非终结符对应一个解析函数;
2)产生式右侧为该产生式左侧非终结符所对应解析函数的“函数体”;
3)产生式右侧终结符对应从输入串中“消耗”该终结符的操作;
4)产生式中的‘|’对应函数体中的“if-else”语句;
5)对于扩展的 BNF 文法,产生式中的‘{}’对应函数体中的“while”语句。
构造文法:
<程序>→<声明语句>main()<复合语句><函数块>
<函数块>→<函数定义><函数块>|ε
<语句>→<声明语句>|<执行语句>
<声明语句>→<值声明>|<函数声明>|ε
<值声明>→<常量声明>|<变量声明>
<常量声明>→const <常量类型> <常量声明表>
<常量类型>→ int|char|float
<常量声明表>→<标识符>= <常量>;|<标识符>= <常量>,<常量声明表>
<变量声明>→<变量类型> <变量声明表>
<变量声明表>→<单变量声明>;|<单变量声明>,<变量声明表>
<单变量声明>→<变量>|<变量>=<表达式>
<变量类型>→ intlchar|float
<执行语句>→<数据处理语句>|<控制语句>|<复合语句>
<数据处理语句>→<赋值语句>|<函数调用语句>
<赋值语句>→<赋值表达式>;
<控制语句>→||||
<复合语句>→{<语句表> }
<语句表>→<语句> | <语句><语句表>
→if(<表达式>)<语句> | if(<表达式>) <语句> else <语句>
→for (<表达式>;<表达式>;<表达式>)<循环语句>
→while (<表达式>)<循环语句>
→do <循环用复合语句> while (<表达式>);
→ return;| return <表达式>;
<算术表达式>→<项>+<算术表达式>|<项>-<算术表达式>|<项>
<项>→<因子>*<项>|<因子>/<项>|<因子>%<项>|<因子>
<因子>→(<算术表达式>)|<常量>|<变量>|<函数调用>
<常量>→<数值型常量>|<字符型常量>
<变量>→<标识符>
<关系表达式>→ <算术表达式><关系运算符><算术表达式>
<关系运算符>→ >|<|>=|<=|==|!=
<布尔表达式>→<布尔项>||<布尔表达式>| < 布尔项>
<布尔项>→<布尔因子>&&<布尔项>| < 布尔因子>
<布尔因子>→<算术表达式>|<关系表达式>| !<布尔表达式>
<赋值表达式>→<标识符>=<表达式>
3.2 方案分析
递归分析程序的优点:
1. 实现思想简单明了。程序结构和语法规则直接对应。
2. 因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。
3. 需要书写程序的语言支持递归调用。如果递归调用机制是高效的,那么分析程
序也是高效的。
缺点:
对文法要求高,必须是 LL(1)文法,同时由于递归调用较多,影响分析器的效率。
4 实验测试
设计测试数据一共 5 组,如表 1 所示。
测试数据组数
1
2
表 1 测试数据
预期结果
报错
测试数据
#include
stdio.h>
((a+b)+c
报错
实际结果
3
4
5
6
a&&
a++c
a = b|c
i = i+3;
报错
报错
正确
正确
5 实验结论及分析
本次实验完成得不是很好,对语法分析不够完整,最终也没有画出实验结果的语法分析
树。通过这次实验,使我对递归下降分析过程有了更进一步的了解,递归下降实现的思想简
单明了,程序结构和语法规则直接对应。因为每一个过程表示一个非终结符号的处理,添加
语义加工工作比较方便。需要书写程序的语言支持递归调用。
语法分析器的实验比词法分析复杂很多,通过网课和资料的查找,艰难完成了本次实验,
然而最后的实验结果不够好。虽然基本实现了逻辑表达式以及算术表达式的语法分析,但是
还有很多句型以及没有考虑到的情况需要完善,难以应多各种复杂情况,还需要更多的测试
以及完善。