编译原理课程设计-LL(1)递归下降分析器(共12页)_第1页
编译原理课程设计-LL(1)递归下降分析器(共12页)_第2页
编译原理课程设计-LL(1)递归下降分析器(共12页)_第3页
编译原理课程设计-LL(1)递归下降分析器(共12页)_第4页
编译原理课程设计-LL(1)递归下降分析器(共12页)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上仲恺农业技术学院编译原理课程设计课程设计题目 :LL(1)递归下降分析器姓 名 :院(系) : 专业班级 :学 号 : 指导教师 : 设计日期 :专心-专注-专业目 录12389910题目:LL(1)递归下降分析器1、需求分析语法分析是编译过程的核心部分。语法分析器的任务是识别和处理比单词更大的语法单位。如:程序设计语言中的表达式,各种说明和语句乃至全部源程序,指出其中的语法错误;必要时,可生成内部形式,便于下一阶段处理。我们知道,语言的语法结构是用上下文无关文法描述的。按照语法分析树的建立方法,我们可以粗略地把语法分析办法分成两类,一类是自上而下分析,另一类是自下而

2、上分析法。而自上而下这种方法是带“回溯”的,且存在许多困难和缺点。首先,是文法的左递归性问题。一个文法是含有左递归的,如果存在非终结符P且,含有左递归的文法使上述的自上而下的分析过程陷入无限循环。即,当试图用P去匹配输入串时,我们会发现,在没有识别任何输入符号的情况下,有得重新要求P去进行新的匹配。因此,使用自上而下分析法必须消除文法的左递归性。其次,由于回溯,就碰到一大堆麻烦问题。如果我们走了一大段错路,最后必须回头,那么,就应把已经做的一大堆语义工作(指中间代码产生工作和各种表格的簿记工作)推倒重来。这些事情既麻烦又费时间,所以,最好应设法消除回溯。第三,在自上而下分析过程中,当一个非终结

3、符用某一候选匹配成功时,这种成功可能仅是暂时的。第四,当最终报告分析不成功时,我们难于知道输入串中出错的确切位置。最后,由于带回溯的自上而下分析实际上采用了一种穷尽一切可能的试探法,因此,效率很低,代价极高。严重的低效使得这种分析法只有理论意义,而在实践上价值不大。由于上述原因,我们需要把原算术表达式改写为LL(1)文法,LL(1)文法的文法条件如下:文法不含左递归。对于文法中每一个非终结符A的各个产生式的候选首集符两两不相交。即,若,则 对文法中的每个非终结符A,若它存在某个候选首符集包含,则LL(1)中的第一个L表示从左到右扫描输入串,第二个L表示最左推导,1表示分析时每一步只需向前查看一

4、个符号。当一个文法满足LL(1)条件时,我们就可以为它构造一个不带回溯的自上而下分析程序,这个分析程序是由一组递归过程组成的,每个过程对应文法的一个非终结符。这样的一个分析程序称为递归下降分析器。2、概要设计编程实现给定算术表达式的递归下降分析器。算术表达式文法如下: E->E+T|E-T|TT->T*F|T/F|FF->(E)| i首先改写文法为LL(1)文法;然后为每一个非终结符,构造相应的递归过程,过程的名字表示规则左部的非终结符;过程体按规则右部符号串的顺序编写。上述算法表达式文法属于比较典型的递归下降语法分析。需要先将原算术表达式方法改写为LL(1)文法为:E-&g

5、t;TEE->+TE|-TE| T->FTT->*FT|/FT| F->(E)| i然后再为每个非终结符设计一个对应的函数,通过各函数之间的递归调用从而实现递归下降语法分析的功能。具体方法为:(1)当遇到终结符a时,则编写语句If(当前读到的输入符号=a)读入下一个输入符号(2)当遇到非终结符A时,则编写语句调用A()。(3)当遇到A->规则时,则编写语句If(当前读到的输入符号不属于Follow(A) error()(4)当某个非终结符的规则有多个候选式时,按LL(1)文法的条件能唯一地选择一个候选式进行推导.递归下降子程序流程图:图1递归下降子程序流程图3、详

6、细设计#include<iostream.h>char inputstream50; /存储输入句子int temp=0; /数组下标int right; /判断输出信息void e();void e1();void t();void t1();void f();void main()right=1;cout<<"-"<<endl;cout<<"请输入您要分析的字符串以#结束(为空字符):"<<endl;cin>>inputstream;cout<<"-&quo

7、t;<<endl;cout<<endl;cout<<"开始进行语法分析"<<endl;e();if(inputstreamtemp='#')&&right)cout<<"分析成功"<<endl;elsecout<<"分析失败"<<endl;void e()cout<<"E->TE'"<<endl;t();e1();void e1()if(inputst

8、reamtemp='+')cout<<"E'->+TE'"<<endl;temp+;t();e1();else if(inputstreamtemp='-')cout<<"E'->-TE'"<<endl;temp+;t();e1();else if(inputstreamtemp!='#'|inputstreamtemp!=')')cout<<"T'->"

9、<<endl;return;elseright=0;void t()cout<<"T->FT'"<<endl;f();t1();void t1()if(inputstreamtemp='*')cout<<"T'->*FT'"<<endl;temp+;f();t1();else if(inputstreamtemp='/')cout<<"T'->/FT'"<<end

10、l;temp+;f();t1();else if(inputstreamtemp!='#'&&inputstreamtemp!=')'&&inputstreamtemp!='+'&&inputstreamtemp!='-')cout<<"T'->"<<endl;right=0;void f()if(inputstreamtemp='i')cout<<"F->i"<&l

11、t;endl;temp+;elseif(inputstreamtemp='(')cout<<"F->(E)"<<endl;temp+;e();if(inputstreamtemp=')')cout<<"F->(E)"<<endl;temp+;elseright=0;else right=0;4、测试分析图2 测试分析成功图3 测试分析失败5、用户手册开发工具:visual c+ 6.0开发环境:windows XP操作系统运行环境:windows 9x,windo

12、ws NT,Windows 2000,windows XP注意:输入时,程序最多只能接受50个字符,输入完算术表达式后要以“#”号结束。6、课程总结通过一个星期的努力,终于把编译原理课程设计给完成了。我觉得编译原理这门课是一门非常难学的课程,它涉及文法、词法分析、语法分析属性文法和语义分析等等一系列内容,课本里的内容和定义也非常的抽象且枯燥。如果上课没有好好的认真听课,自己独自学习就感到非常的吃力,而且效果也不好。本人因为上课无法做到打醒十二分专心听课,经常会分神,所以学习的效果也不怎么好。这也给做编译原理课程设计带来了困难。本次课程设计,我选的课程设计题目是LL(1)递归下降分析器,这个题目

13、涉及的内容有关课本第四章 语法分析自上而下分析里面的内容。在开始动手对题目进行设计和编程之前,我重复的仔细认真的阅读和理解课本第四章里面的内容,弄懂自上而下分析面临的问题、何谓左递归,搞清楚如何消除左递归、如何消除回溯、提左因子,理解构造LL(1)文件需要什么条件。虽然这花费了一定的时间和精力,但那点付出也是值得的,通过复习让我加深理解了有关自上而下语法分析的内容,而且也为用高级语言实现递归下降分析器带来便利。在用C+编程时,基本上没有遇到什么困难,只需把所有递归过程都写出就行了。但是要注意的是,在编写代码时,要根据LL(1)文法的工作原理去设计。通过本次课程设计清楚地了解到递归下降分析法的优缺点,其优点是简单、直观,易于构造分析程序。缺点是对文法要求高,必须是LL(1)文法,同时由于递归调用较多,影响分析器的效率。课程设计虽然只有短短的一周,但让我认识到学习好编译原理,是对程序设计和编译的一个很好的进化桥梁和奠基石。今后学习的日子还很长,希望通过这次编译原理的课程设计,不仅对编程语言的进一步复习,还是对更深层次的学习作一个简单的准备。编程的能力不是一朝一夕能锻炼出来,坚持学习,坚持编程的学习,多看,多编是最好的学习和提高方法。通过本次编译原理课

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论