3.3 语法分析程序设计
Token文件Program标识符const处理常量说明varbeginForend处理程序结束部分处理赋值语句处理程序头部beginvar处理for语句处理变量说明begin根据读取的前导字对语句进行分类if处理if语句输出文件while处理while语句其他图 2 语法分析总流程
不断地读入token文件中的单词,根据不同的语句,使用不同的方法进行分析,直到token文件的结束。程序头部以program开头,变量说明以var开头,常量说明是以const开头的,从begin开始就是可执行语句,可执行语句分为五种:for语句(以for语句开头),while语句(以while开头),if语句(以if开头),repeat语句(以repeat开头),赋值语句(以标识符开头) 。每当读到前导词,表明一个新的语法结构的开始,以此识别该语法单位是否符合定义。 3.4 语义分析和中间代码生成程序的设计
4. 结果及测试分析
4.1软件运行环境及限制
程序是使用C#语言编写的,开发软件是VS2013。VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。所写的目标代码适用于微软支持的所有平台。使用VS调试程序会很方便,可以实时观察程序的运行状态。用VS制作界面会显得非常地简单,但是也存在一定的缺点。VS的集成度比较高,所以要修改封装好的一些函数不会太简单。
4
4.2测试数据说明
输入数据:
program example1; const
a:=1;b:=3;c:='fasdf'; var
a,b,c:integer; x:char;
begin a:=3; b:=12;
if(a+3*c>b) then c:=3; while a>b do c:=5;
repeat a:=10; until a+3>b; for x:=1+2 to 3 do b:=100;
end.
这是sample语言的一个比较简单的测试程序,它有着sample语言最基本的格式,如函数头部、常量说明、变量说明、执行语句、条件语句,循环语句等等。用这个测试程序来观察程序的效果。 4.3运行结果及功能说明
图 3 词法分析结果
图3是正常词法分析的结果,可以看出,程序会将每个单词显示到token文件显示区,同时显示单词在源文件的位置。并且会将标识符和常量添加到符号表
5
并显示到符号表显示区。下面的图4是当测试程序有错误时的情况。
图 4 词法分析有错误的程序
可以看到当我在b:=12;后面加上一个 “’”后,会出现报错。并且if语句位置上少了个“)”也会出现报错,实现了词法分析的相关功能。
图 5语法分析结果
6
从图5看到,语法分析能够正确地处理token串,并分析出各类语句,直到程序的结束。输出结果的显示层次感不强,没有按照一级级地缩进,这里是语法分析的一点问题。下面的图6是语法分析处理错误的功能演示。
图 6 语法分析错误处理
我修改了程序的部分地方,通过语法分析就能够检测到错误的地方,并显示出错误可能的原因,并且能够在错误的前提下继续执行后面的程序,直到语法分析结束。
5.总结及心得体会
通过编译原理实验课,我掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程、构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识是机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。
然而,我认为自己在实验课上做的并不够好。首先,在总体实验内容来说,我没能够完成所有的内容,只完成了词法分析和语法分析的程序;其次,就完成的两个实验来说,功能上还是不够完善,有一些bug。最后,运行界面上过于简陋,不够美观。由于时间的有限性,这些不足是无法继续改善了。这也让我意识到对于做每一件事,你的付出时间和你的成果是成正比的。所以,对于做一件事,要舍得花时间,肯花时间,这样最后的效果才会更好。对于编译原理,整体看下来自己做得不算好。意识到不足,我更加地明白自己能力不够强。在今后的学习里,需要更加地努力才行,能力越强,自己的提升空间就会越大,完成一件事的效率也才会更高。争取在以后做一个高效率,强能力的人。
7