- 1
- 0
- 约1.2万字
- 约 13页
- 2019-10-29 发布于安徽
- 举报
实用
文档
编译原理实验报告
实验名称: 递归下降语法分析器
实验类型: 验证型
指导教师:
专业班级:
姓 名:
学 号:
电子邮件:
实验地点:
实验成绩:
日期: 2012 年 5月 20 日
一、实验目的
通过设计、编制、调试一个递归下降语法分析程序,实现对语法分析器所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握此法分析器的实现方法。3、上机调试编出的语法程序。
二、实验过程
这次实验我是通过VB来写的。通过图形界面更为具体的现实每一步实现的步骤。主要用到listbox控件来表示每一步骤的实现。
1 、流程图:
开始
开始
按照语法树将字符串中每个字符i进行判断
输入字符串
是否有错
N
Y
i=“#”
N
Y
结束
输出结果
2、语法分析树:
E
E
T
E1
?
F
T1
i
?
(
E
)
+
T
E1
*
F
E1
3、主要程序的分析:
把每个过程分别用5个模块表示。分别是模块E(变量i,布尔值B1)、模块T(变量j,布尔值B2)、模块E1(变量l,布尔值B3,flag1)、模块T1(变量O,布尔值B4,falg2)、模块F(变量k、布尔值B5、flag3)。利用每个布尔值的真假来控制listbox中的进程显示。若该模块中的布尔值为真则可以做相应的移动。若为假则不能。而利用标志位flag来设置检测到的“(、)、+、*”。如果接受字符串中有“(”,则置flag3为真。即预示着在后面的字符串中要有“)”否则出现错误。其它类似。
流程分析:
i等于3的情况下执行T过程:
E--T--i
j等于3的情况下执行F过程:
E--T--F--(E)
j等于4的情况下执行T1过程:
E--T--T1-- ?
E--T--T1--*FT
i等于4的情况下执行E1过程:
E -- E1 -- ?
E -- E1--+TE1
具体流程分析:
输入一个字符串,提取字符串的每一个字符。读入第一个字符,如是E–T-F-i则结束进行第二个字符的判断。若是E–T-F-(则将flag3设置为1。并且进行下一个字符的判断直接是接在E的过程中,如语法树所示。直到遇到“)”将flag3重新设置0
若为E-T-T1- ?,则结束进行第二个字符的判断。若为E-T-T1-*。则将flag2设置为1.并且下一个字符的判断直接是在F的过程中,如语法树所示。直到将T1的过程执行完,将flag2重新设置为0
若为E-E1- ?。则直接进行下一个字符的判断。若为E - E1 - +。则下一个字符直接在F中进行,再下一个字符在E1中进行,并将flag1重新设置为0。.
差错检测以及重新输入:
A、若遇到输入的字符不是“i,*,#,+,(,)”则输出错误。或者在遇到最后字符“#”而此时flag1,flag2,fla3中其中有一个为1时,则输出相应的错误。错误1,错误2,错误3。
B、重新输入则将所有的参数变为初始值,并将listbox中的参数归0;
5、实验调试与检错
三、实验结果
1、输入字符串:
2逐个单步分析:
3分析结束:
4、整体分析:
6、重新输入:
四、讨论与分析
经过仔细的观察,所得的实验结果与预想的分析结果是相符一致的。这次实验是用VB写的,可以具体的检错和表示分析的步骤。程序整体式通过5个模块的布尔值得真假来实行嵌套的。首先是在E 的大框架下分为T和E1过程。先从T过程开始检索并设置布尔值例如输入一个错误的句子:“ i * ( # ”因为括弧的不完整所以flag3=1 后不会重新置0则出现错误即“错误3”或者输入:“i * #”则出现“错误2”。每个flag 标志位对应一个错误。
五、附录:
1、特殊字符(串)的定义便于后面的比较
六、实验者自评
这次词法分析器的程序我做的还是比较困难的,用了很长时间才把程序做出来,主要是在程序的分析问题出错语法倒是没有出错。这说明我对词法分析器的原理还没有做到彻底的掌握和对C的操作不熟练。但是经过同学和我自己不断的分析和查资料,最终将程序做好。并且没有错误。但是我的这个程序并没有那么完善,比如我不能分析//的注释内容反映出来/**/的内容也不能反映出来。这是个缺陷。由于是用的C编写的,
原创力文档

文档评论(0)