语法分析实验报告
一、实验目的:
1. 了解单词(内部编码)符号串中的短语句型结构形成规律。
2. 理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算
法化方法。
二、实验内容:
构造自己设计的小语言的语法分析器:
1. 小语言的语法描述(语法规则)的设计即文法的设计;
2. 把文法形式符号中所隐含的信息内容挖掘出来并用 LL 或 LR
的资料形式(分析表)表示出来;
3. 语法分析的数据输入形式和输出形式的确定;
4. 语法分析程序各个模块的设计与调试。
主要设备和材料:电脑、winxp 操作系统、VC 语言系统
三、实验分工:
学 号
姓 名
实 验 分 工
08
08150
0815
实验代码设计及编写
检查校对代码
写电子版实验报告
查找、分析、整理资料
查找、分析、整理资料
08150
08150
08050
0815
081
四、实验步骤:
1、语法规则
① <程序> ::= {<变量定义语句> | <赋值语句> | <条件
语句> |
② <变量定义语句> ::= var 变量{,变量};
<循环语句> }
③ <赋值语句> ::= 变量 := <表达式>;
④ <表达式> ::= 标识符{运算符 标识符 };
⑤ <标识符> ::= 变量 |常量
⑥ <运算符 > ::= + | - | * | / | >= | <=
⑦ <条件语句> ::= []
⑧ ::=
语句 | 循环语句}[end]
if(表达式) then[begin] {赋值语句 |条件
[begin] {赋值语句 | 条件语句 | 循
⑨ ::=
环语句} [end]
⑩ <循环语句> ::= while(表达式) [begin] {赋值语句 | 条
件语句 | 循环语句} [end]
<输出语句> ::= prn 表达式
--注 1:若 if 语句、else 语句、循环语句中出现 begin,后面的 end
必须出现,即 begin 与 end 同对出现
--注 2:if、while 后的"(",")"表示终结符,而不是定义成分优
先的说明符号
2、分析表:
: = 变量 常量 ,
; 运 算
(
)
符
变 量
定 义 ->② ->②
->② ->②
赋 值
语 句 ->③ ->③ ->③
->③ ->③
条 件
语 句 ->⑦ ->⑦ ->⑦
->⑦ ->⑦ ->⑦ ->⑦
循 环
语 句 ->⑩ ->⑩ ->⑩
->⑩ ->⑩ ->⑩ ->⑩
输 出
语 句
->
->
->
分析表(续):
while
var
begin
end
if
then
prn
->②
变 量 定 义
赋 值 语 句
条 件 语 句
->⑦ ->⑦ ->⑦ ->⑦
循 环 语 句 ->⑩
->⑩ ->⑩
输 出 语 句
3、调试和测试
->
五、源代码(见附录):
六、实验总结:
本实验在词法分析的基础上,对提取出的标识符进行语法判断。
对已有的语法规则运用 LL(1)文法判别并进行构造分析表时,遇到的
最大困难是:当发生规约冲突时,该如何处理。如对于产生式 s-->aAb,
当对 a 进行规约时,满足语法规则的β(用户输入串中当前要进行规
约的标识符)只有有限种,而不满足的却有无限种情况。当发生规约
冲突时,如何在这无限种情况中,确定冲突的具体信息,以便用户查
找。在反复的尝试和验证中,我们发现发生冲突的用户输入串满足一
定的规律,且按这种规律可以把这无限种情况化归为有限类,于是我
们找出其中规律并进行划分,然后再对这些有限类冲突进行处理。
七、实验心得:
通过这次实验有以下几点收获:
1. LR(1)的构造使得对理论的知识理解的更加透彻。其中 LR(1)
分析表构造了很多遍,一直无法得到正确结果,这是恒心的考验。
2. 在写程序中用类数组来存放单词属性使得对单词各项值的调用更
加方便,特别是对出错信息的检测有很大的作用。
3.本实验是在词法基础上的更进一步,在词法程序上添加语法程序,
更加理解二者之间的关系。词法分析为语法分析提供了词法单元,方
便分析,使程序模块化,易于读懂。
附录:
#include