编译原理-实验3-LL分析文法构造_第1页
编译原理-实验3-LL分析文法构造_第2页
编译原理-实验3-LL分析文法构造_第3页
编译原理-实验3-LL分析文法构造_第4页
编译原理-实验3-LL分析文法构造_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

1、集美大学计算机工程学院实验报告课程名称:编译原理指导教师:付永钢实验成绩:实验编号: 实验三实验名称:LL(1)语法分析器的构造班级:计算14姓名:学号上机实践日期:2017.6上机实践时间: 6学时一、实验目的1、掌握LL(1)分析法的基本原理;2、掌握LL(1)分析表的构造方法;3、掌握LL(1)驱动程序的构造方法。二、实验环境Ubuntu三、实验原理1、对文法要求LL(1)分析法属于自顶向下分析方法,因此需要预测匹配的产生式。即在LL(1)分析法中,每当在符号栈的栈顶出现非终结符时,要预测用哪个产生式的右部去替换该非终结符。LL(1)分析方法要求文法满足如下条件:对于任一非终结符A,其任

2、意两个产生式Aàa,Aàb,都要满足下面条件:First(Aàa)First(Aàb)=Æ2、分析表构造LL(1)分析表的作用是对当前非终结符和输入符号确定应该选择用哪个产生式进行推导。它的行对应文法的非终结符,列对应终结符,表中的值有两种:一是产生式的编号,一是错误编号。若用T表示LL(1)分析表,则T可表示如下:T: VN×VTàPErrorT(A, t) = Aà,当tÎFirst(Aà)T(A, t) = Error,否则其中P表示所有产生式的集合。显然,一个文法G是LL(1)文法,当且

3、仅当T的元素包含唯一的一个产生式或Error。3、驱动程序构造LL(1)分析主要包括以下四个动作,其中X为符号栈栈顶元素,a为输入流当前字符。l 替换:当XÎVN时选相应产生式的右部b去替换X。l 匹配:当XÎVT时它与a进行匹配,其结果可能成功,也可能失败,如果成功则符号栈中将X退栈并将输入流指针向前移动一位,否则报错。l 成功:当格局为(空,空)时报告分析成功。l 报错:出错后,停止分析。四、实验内容已知文法GE: EE+T|T TT*F|F F(E)|i 说明:终结符号i为用户定义的简单变量, 即标识符的定义。1、消除文法的左递归,构造对应文法的预测分析表;2、根据构

4、造的预测分析表,实现LL(1)分析中控制程序(表驱动程序),并完成整个的LL(1)分析程序的界面设计、运行;3、P104中,3.36写一个Yacc程序,把输入的算术表达式翻译成对应的后缀表达式输出。要求转换正确,同时对于简单错误能够识别。4、P104中,3.37,写一个Yacc“台式计算器”程序,它计算布尔表达式,其中的词法分析器用Lex写。要求转换正确,同时对于简单错误能够识别。五、实验要求1、输入串应是词法分析的输出二元式序列,即某算术表达式“实验项目一”的输出结果。输出为输入串是否为该文法定义的算术表达式的判断结果。2、LL(1)分析过程应能发现输入串中的错误。3、设计至少两个测试用例(

5、尽可能完备,正确和出错),并给出测试结果。六、实验步骤、1、分析文法(1)E=>E+T=>E+T*F=>E+T*(E)即有E=>E+T*(E)存在左递归。用直接改写法消除左递归,得到如下文法:GE:ETEE+TE|TFTT*FT|F(E)|i(2)对于以上改进的文法,可以得到:FIRST(E)=FIRST(+TE)FIRST(-TE)=+,FIRST(T)=FIRST(*FT)FIRST(/FT)=*,FIRST(E)= FIRST( T ) = FIRST( F )=FIRST(E)FIRST(i)=(,i 由此得到各非终结符的FOLLOW集合:FOLLOW(E)=

6、),$FOLLOW(E)=FOLLOW(E)=),$FOLLOW(T)=FIRST(E)FOLLOW(E)= +,),$FOLLOW(T)=FOLLOW(T)= +,),$FOLLOW(F)=FIRST1、构造LL(1)分析表采用手工操作构造LL(1)分析表。LL(1)分析表用一个二维矩阵表示,其中每个非终结符对应一行,每个终结符对应一列,一个非终结符和一个终结符可以确定矩阵中的一个元素,元素的值表示该非终结符和该终结符对应的产生式。每个矩阵元素都是一个符号串,所有元素初始化为”;构造LL(1)表时,根据文法和各个产生式的First集,填写LL(1)分析表的内容。各产生式只要降右端填入到对应的

7、表项中即可,用空串表示Error。在根据LL(1)分析表选择产生式进行推导时,若查到的产生式为空串表示无相应的产生式可选,不匹配错误;否则根据符号串得到相应的产生式进行推导,即进行压栈操作。步骤分析栈(栈顶符号,当前输入符)剩余串所用产生式1$E(E,i)查表i+i*i$E->TE2$ET(T,i)查表i+i*i$T->FT3$ETF(F,i)查表i+i*i$F->i4$ETi(i,i) i匹配i+i*i$ 5$ET(T,+)查表+i*i$T->6$E(E,+)查表+i*i$E->+T E7$ET+(+,+)+匹配+i*i$ 8$ET(T,i)

8、查表i*i$T->FT9$ETF(F,i)查表i*i$F->i10$ETi(i,i)i匹配i*i$ 11$ET(T,*)查表*i$T->*F T12$ETF*(*,*)*匹配*i$ 13$ETF(F,i)查表i$F->i14$ETi(i,i)i匹配i$ 15$ET(T,$)查表$T->16$E(E,$)查表$E->17$2数据结构LL(1)语法分析程序共用到个栈,分别称为:符号栈,语法树栈,操作符栈和操作数栈。其中,符号栈用于进行LL(1)语法分析;其它的栈是为了在语法分析的过程中同时生成与源程序结构对应的语法树而设。语法树栈用

9、于生成声明部分和语句部分的语法树;操作符栈和操作数栈用于生成表达式部分的语法树。3. 构造驱动程序构造LL(1)驱动程序的算法:(1). 分析开始时,首先将标志符号#和文法开始符号S依次压入符号栈;输入流指针指向第一个输入符号,即由符号栈和输入流构成的初始格局为:(#S,a1a2.an#)然后,反复执行第2步所列的工作。(2). 设在分析的某一步,符号栈及剩余的输入流处于如下的格局(#X1X2.Xm-1Xm,aiai+1.an#)其中,X1X2.Xm-1Xm为分析过程中所得的文法符号,此时,可视栈顶符号Xm的不同情况,分别作如下动作:l 若XmÎVN,则以Xm及ai组成的符号对(Xm

10、,ai)查分析表T。设T(Xm,ai)为一产生式,假设是XmàUVW,此时将Xm从分析栈中退出,并将UVW压入栈中,从而得到新的格局(#X1X2.Xm-1WVU,aiai+1.an#)但若T(Xm,ai)=Error,则调用出错处理程序进行处理;l 若Xm=ai¹#,则表明栈顶符号已经与当前扫描的输入符号得到匹配,此时应将Xm(即ai)从栈中退出,并将输入流指针向前移动一个位置。l 若Xm=ai=#,则表明输入串已经完全得到匹配,此时即可宣告分析成功而结束分析。其它情形,转错误处理程序。程序见附录7、 实验结果正确的语法:错误的语法:六、实验小结1、在本次实验中,通过设计、

11、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握LL(1)分析法的基本原理、掌握LL(1)分析表的构造方法、掌握LL(1)驱动程序的构造方法;2、通过本次实验,对LL(1)递归下降分析程序的构造和设计有了更为全面的认识,对LL(1)文法分析程序的实现有了进一步了解;3、实验输入串以$结束,才用栈的形式,依次弹出进行处理;附录:程序代码:#coding:utf-8from prettytable import PrettyTabledef LL1():global c,flagif(c='E'):if(ak='i'

12、 or ak='('):table.add_row(ak:, "E -> TE'")stack.append('X')stack.append('T')print stackc=stack.pop()else:error()flag=1elif(c='X'):if(ak='+'):table.add_row(ak:, "E' -> +TE'")stack.append('X')stack.append('T'

13、)stack.append('+')print stackc=stack.pop()elif(ak=')' or ak='$'):table.add_row(ak:, "E' -> ")print stackc=stack.pop()else:error()flag=1elif(c='T'):if(ak='i' or ak='('):table.add_row(ak:, "T -> FT'")stack.append('Y&

14、#39;)stack.append('F')print stackc=stack.pop()else:error()flag=1elif(c='Y'):if(ak='*'):table.add_row(ak:, "T' -> *FT'")stack.append('Y')stack.append('F')stack.append('*')print stackc=stack.pop()elif(ak='+' or ak=')'

15、 or ak='$'):table.add_row(ak:, "T' -> ")print stackc=stack.pop()else:error()flag=1elif(c='F'):if(ak='i'):table.add_row(ak:, "F -> i")stack.append('i')print stackc=stack.pop()elif(ak='('):table.add_row(ak:, "F -> (E)")

16、stack.append(')')stack.append('E')stack.append('(')print stackc=stack.pop()else:error()flag=1def error():global k table.add_row(ak, "Error")print stackk+=1if _name_ = '_main_':a=raw_input("Input Etablepression:")a=a+'$'for temp in a:if(temp

17、!='i' and temp!='+' and temp!='*' and temp!='(' and temp!=')' and temp!='$'):print "You input is wrong!"exit(0)table = PrettyTable("Input", "Action")table.padding_width = 1table.align"Input" = "r"table.align"Action" = "l"stack=k=0flag=0stack.append('$')stack.append('E')table.add_row(ak:," ")print stackc=stack.pop()while(c!='$'):if(c=ak):table.add_row(ak+1:,'

温馨提示

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

评论

0/150

提交评论