精品编译原理课程设计 LL1递归下降分析器Word文件下载.docx
- 文档编号:15325852
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:10
- 大小:120.87KB
精品编译原理课程设计 LL1递归下降分析器Word文件下载.docx
《精品编译原理课程设计 LL1递归下降分析器Word文件下载.docx》由会员分享,可在线阅读,更多相关《精品编译原理课程设计 LL1递归下降分析器Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
我们知道,语言的语法结构是用上下文无关文法描述的。
按照语法分析树的建立方法,我们可以粗略地把语法分析办法分成两类,一类是自上而下分析,另一类是自下而上分析法。
而自上而下这种方法是带“回溯”的,且存在许多困难和缺点。
首先,是文法的左递归性问题。
一个文法是含有左递归的,如果存在非终结符P且,含有左递归的文法使上述的自上而下的分析过程陷入无限循环。
即,当试图用P去匹配输入串时,我们会发现,在没有识别任何输入符号的情况下,有得重新要求P去进行新的匹配。
因此,使用自上而下分析法必须消除文法的左递归性。
其次,由于回溯,就碰到一大堆麻烦问题。
如果我们走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作(指中间代码产生工作和各种表格的簿记工作)推倒重来。
这些事情既麻烦又费时间,所以,最好应设法消除回溯。
第三,在自上而下分析过程中,当一个非终结符用某一候选匹配成功时,这种成功可能仅是暂时的。
第四,当最终报告分析不成功时,我们难于知道输入串中出错的确切位置。
最后,由于带回溯的自上而下分析实际上采用了一种穷尽一切可能的试探法,因此,效率很低,代价极高。
严重的低效使得这种分析法只有理论意义,而在实践上价值不大。
由于上述原因,我们需要把原算术表达式改写为LL
(1)文法,LL
(1)文法的文法条件如下:
文法不含左递归。
对于文法中每一个非终结符A的各个产生式的候选首集符两两不相交。
即,若,则
对文法中的每个非终结符A,若它存在某个候选首符集包含ε,则
LL
(1)中的第一个L表示从左到右扫描输入串,第二个L表示最左推导,1表示分析时每一步只需向前查看一个符号。
当一个文法满足LL
(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。
这样的一个分析程序称为递归下降分析器。
2、概要设计
编程实现给定算术表达式的递归下降分析器。
算术表达式文法如下:
E-->
E+T|E-T|T
T-->
T*F|T/F|F
F-->
(E)|i
首先改写文法为LL
(1)文法;
然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;
过程体按规则右部符号串的顺序编写。
上述算法表达式文法属于比较典型的递归下降语法分析。
需要先将原算术表达式方法改写为LL
(1)文法为:
TE’
E’-->
+TE’|-TE’|ε
FT’
T’-->
*FT’|/FT’|ε
然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。
具体方法为:
(1)当遇到终结符a时,则编写语句
If(当前读到的输入符号==a)读入下一个输入符号
(2)当遇到非终结符A时,则编写语句调用A()。
(3)当遇到A-->
ε规则时,则编写语句
If(当前读到的输入符号不属于Follow(A))error()
(4)当某个非终结符的规则有多个候选式时,按LL
(1)文法的条件能唯一地选择一个候选式进行推导.
递归下降子程序流程图:
图1递归下降子程序流程图
3、详细设计
#include<
iostream.h>
charinputstream[50];
//存储输入句子
inttemp=0;
//数组下标
intright;
//判断输出信息
voide();
voide1();
voidt();
voidt1();
voidf();
voidmain()
{
right=1;
cout<
<
"
---------------------------------------------------"
endl;
请输入您要分析的字符串以#结束(^为空字符):
cin>
>
inputstream;
开始进行语法分析"
e();
if((inputstream[temp]=='
#'
)&
&
right)
cout<
分析成功"
else
分析失败"
}
voide()
E->
TE'
t();
e1();
voide1()
if(inputstream[temp]=='
+'
)
{
E'
->
+TE'
temp++;
t();
e1();
}
elseif(inputstream[temp]=='
-'
-TE'
elseif(inputstream[temp]!
='
||inputstream[temp]!
)'
T'
^"
return;
right=0;
voidt()
T->
FT'
f();
t1();
voidt1()
*'
*FT'
f();
t1();
/'
/FT'
inputstream[temp]!
voidf()
i'
F->
i"
if(inputstream[temp]=='
('
{
cout<
(E)"
temp++;
e();
if(inputstream[temp]=='
{
cout<
temp++;
}
else
right=0;
elseright=0;
4、测试分析
图2测试分析成功
图3测试分析失败
5、用户手册
开发工具:
visualc++6.0
开发环境:
windowsXP操作系统
运行环境:
windows9x,windowsNT,Windows2000,windowsXP
注意:
输入时,程序最多只能接受50个字符,输入完算术表达式后要以“#”号结束。
6、课程总结
通过一个星期的努力,终于把编译原理课程设计给完成了。
我觉得编译原理这门课是一门非常难学的课程,它涉及文法、词法分析、语法分析属性文法和语义分析等等一系列内容,课本里的内容和定义也非常的抽象且枯燥。
如果上课没有好好的认真听课,自己独自学习就感到非常的吃力,而且效果也不好。
本人因为上课无法做到打醒十二分专心听课,经常会分神,所以学习的效果也不怎么好。
这也给做编译原理课程设计带来了困难。
本次课程设计,我选的课程设计题目是LL
(1)递归下降分析器,这个题目涉及的内容有关课本第四章语法分析——自上而下分析里面的内容。
在开始动手对题目进行设计和编程之前,我重复的仔细认真的阅读和理解课本第四章里面的内容,弄懂自上而下分析面临的问题、何谓左递归,搞清楚如何消除左递归、如何消除回溯、提左因子,理解构造LL
(1)文件需要什么条件。
虽然这花费了一定的时间和精力,但那点付出也是值得的,通过复习让我加深理解了有关自上而下语法分析的内容,而且也为用高级语言实现递归下降分析器带来便利。
在用C++编程时,基本上没有遇到什么困难,只需把所有递归过程都写出就行了。
但是要注意的是,在编写代码时,要根据LL
(1)文法的工作原理去设计。
通过本次课程设计清楚地了解到递归下降分析法的优缺点,其优点是简单、直观,易于构造分析程序。
缺点是对文法要求高,必须是LL
(1)文法,同时由于递归调用较多,影响分析器的效率。
课程设计虽然只有短短的一周,但让我认识到学习好编译原理,是对程序设计和编译的一个很好的进化桥梁和奠基石。
今后学习的日子还很长,希望通过这次编译原理的课程设计,不仅对编程语言的进一步复习,还是对更深层次的学习作一个简单的准备。
编程的能力不是一朝一夕能锻炼出来,坚持学习,坚持编程的学习,多看,多编是最好的学习和提高方法。
通过本次编译原理课程设计,对面向对象的定义又有了更深一步的理解,对编译程序有了进一步的理解,同时也认识到自己各方面知识的薄弱点,以后在学习中也能有针对性对这方面进行深入学习。
学习更好的知识重在基础,编译原理的学习为我们提供非常好的桥梁和道路。
7、参考文献
《编译原理》 机械工业出版社出版
AlfredV.Aho RaviSethi JeffreyD,Ullman著
李建中 姜守旭等译
《程序设计语言 编译原理(第三版)》 国防工业出版社出版
陈火旺 刘春林 谭庆平 赵克佳 刘越 著
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品编译原理课程设计 LL1递归下降分析器 精品 编译 原理 课程设计 LL1 递归 下降 分析器