编译原理报告二 LR分析器.doc_第1页
编译原理报告二 LR分析器.doc_第2页
编译原理报告二 LR分析器.doc_第3页
编译原理报告二 LR分析器.doc_第4页
编译原理报告二 LR分析器.doc_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

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

文档简介

LR分析器一、 目的和要求通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,并至少完成两个题目。2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。 实验前的准备按实验的目的和要求,编写语法分析程序,同时考虑相应的数据结构。 调试调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。 输出对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。 扩充有余力的同学,可适当扩大分析对象。譬如: 算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。 除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式。加强语法检查,尽量多和确切地指出各种错误。 编写上机实习报告。二、背景知识 自下而上分析技术LR(K)方法LR(K)方法是一种自下而上的语法分析方法,是当前最广义的无回溯的“移进- 归约”方法。它根据栈中的符号串和向前查看的k(k0)个输入符号,就能唯一确定分析器的动作是移进还是归约,以及用哪个产生式进行归约。优点:文法适用范围广;识别效率高;查错能力强;可自动构造。逻辑组成:总控程序LR分析表LR分析器的结构:一个LR分析器实际是一个带先进后出存储器(栈)的确定下推自动机,它由一个输入串、一个下推栈和一个带有分析表的总控程序组成。栈中存放着由“历史”和“展望”材料抽象而来的各种“状态”。任何时候,栈顶的状态都代表了整个的历史和已推测出的展望。为了有助于明确归约手续,我们把已归约出的文法符号串也同时放进栈里。LR分析器的每一动作都由栈顶状态和当前输入符号所唯一确定。 LR分析器模型图分析器的任何一次移动都是根据栈顶状态Sm和当前输入符号ai,去查看ACTION表并执行ACTION( Sm,ai)规定的动作,直至分析成功或失败。LR分析表有两个部分:动作部分ACTION和状态转换部分GOTO。ACTIONS,a表明当前状态S面临输入符号a时应该采取的动作:1、移入:将S,y的下一个状态S以及当前符号入栈。2、归约:对栈顶的符号串按照某个规则进行归约。3、接受:宣布输入符号串为一个句子。4、报错:宣布输入符号串不是句子。GOTOS,U表示当前状态S和非终结符号匹配的时候所转换到的下一个状态。LR总控程序:LR总控程序示意图LR分析器的工作过程是由总控程序根据分析表,使得分析器构型从一种构型向另一种构型变化的过程。初始构型:(S0,a1a2an $), S0为分析器的初态,$为输入串的括号。分析过程的每步结果可表示为:(S0X1S1XmSm,aiai+1an$)。分析器的下一次动作是由栈顶状态Sm和当前输入符号ai所唯一确定的,即:执行ACTIONSm,ai规定的动作。经执行各种可能的动作后,分析器的构型可如下变化:1、若ACTION(Sm,ai)=“移进S”,则分析器构型变为(S0X1S1XmSmaiS,ai+1an$)。 2、若ACTION(Sm,ai)=“归约A ”,则分析器构型变为(S0X1S1Xm-rSm-rAS,aiai+1an$),其中SGOTO(Sm-r,A),|=r 。 3、若ACTION(Sm,ai)=“接受”,则分析成功,正常停止。4、若ACTION(Sm,ai)=“ERROR”,语法出错,进行出错处理。LR分析表的构造:LR(0)项目的定义:文法的每一个产生式的右部添加一个圆点(),则构成文法的一个LR(0)项目。设I是文法G的任一项目集,则定义和构造CLOSURE(I)的规则如下:1、属于I的任何项目也属于CLOSURE(I);2、若A B 属于CLOSURE(I),那么,对于任何关于B的产生式B ,项目B 也属于CLOSURE(I);3、重复执行以上两步,直到CLOSURE(I)不再增大为止。构成识别一个文法活前缀的DFA的项目集(状态)的全体称为这个文法的LR(0) 项目集规范族。构成过程如下:1、文法拓广;2、构造拓广文法的LR(0)项目集规范族3、由初始项目出发,利用CLOSURE和goto函数;4、将LR(0)项目集规范族中的每个项目集作为FA的状态,将goto函数作为状态转换函数,构造出的FA即为所求。项目集I的闭包CLOSURE(I):设I是文法G的任一项目集,则定义和构造CLOSURE(I)的规则如下:1、属于I的任何项目也属于CLOSURE(I);2、若A .B 属于CLOSURE(I),那么,对于任何关于B的产生式B ,项目B . 也属于CLOSURE(I);3、重复执行以上两步,直到CLOSURE(I)不再增大为止。LR(0) 文法的判定:如果文法G的项目集规范族的每个项目集中不存在下述冲突项目:1、移进项目和归约项目并存,2、多个归约项目并存,则称文法G为LR(0)文法。只有对于LR(0)文法,才能构造它的LR(0)分析表。构造LR(0)分析表的步骤如下:1、若项目A.a Ii且goto(Ii,a)=Ij,其中a为终结符,置ACTIONi,a=“把状态j和符号a移进栈”,简记为“sj”;2、若项目A. Ii ,则对于任何输入符a或结束符$,置ACTIONi,a=“用产生式 A进行归约”,简记为“rj”(假定A是文法G的第j条产生式);3、若项目SS. Ii ,则置ACTIONi,$=“接收”,简记为acc;4、若goto(I,A)=Ij,A 为非终结符,则置GOTO(i,A)=j5、分析表中凡不能用规则1 4添入信息的元素均置上ERROR。三、实验内容要求:给定分析对象的LR分析表和一个分析对象的句子,输出该句子分析的结果。否否是是否是0,#分别入状态栈和符号栈置ip指向w#的第一个符号令s是状态栈栈顶,a是ip所指向的符号actions,a=Ssactions,a=reduce A-把a和s分别推入符号栈和状态栈;使ip前进到下一个字符分别从栈顶弹出|个符号,令s是当前栈顶状态,把a和gotos,A先后推入栈中,输出产生式A-ActionA,a=accept结束出错处理程序输入/输出示例:对下列文法,用LR(1)分析法对任意输入的符号串进行分析:(1)E-E+T (2)E-ET (3)T-T*F(4)T-T/F(5)F-(E)(6)F-i输出的格式如下:(1)输入一以#结束的符号串(包括+*/()i#):在此位置输入符号串(2)输出过程如下:步骤 状态栈 符号栈 剩余输入串动作10#i+i*i#移进(3)输入符号串为非法符号串(或者为合法符号串)备注:(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。(2) 在此位置输入符号串为用户自行输入的符号串。注意:1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;四、设计思路模块结构:(1)定义部分:定义常量、变量、数据结构。(2)初始化:设立LR(1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等);(3)控制部分:从键盘输入一个表达式符号串;(4)利用LR(1)分析算法进行表达式处理:根据LR(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。五、相关代码#include#includechar*action103=S3#,S4#,NULL,NULL,NULL,acc,S6#,S7#,NULL,S3#,S4#,NULL,r3#,r3#,NULL,NULL,NULL,r1#,S6#,S7#,NULL,NULL,NULL,r3#,r2#,r2#,NULL,NULL,NULL,r2#;intgoto1102=1,2,0,0,0,5,0,8,0,0,0,0,0,9,0,0,0,0,0,0;charvt3=a,b,#;/*存放非终结符*/charvn2=S,B;char*LR4=E-S#,S-BB#,B-aB#,B-b#;/*存放产生式*/inta10;charb10,c10,c1;inttop1,top2,top3,top,m,n;voidmain()intg,h,i,j,k,l,p,y,z,count;charx,copy10,copy110;top1=0;top2=0;top3=0;top=0;a0=0;y=a0;b0=#;count=0;z=0;printf(请输入表达式n);doscanf(%c,&c1);ctop3=c1;top3=top3+1;while(c1!=#);printf(步骤t状态栈tt符号栈tt输入串ttACTIONtGOTOn);doy=z;m=0;n=0;/*y,z指向状态栈栈顶*/g=top;j=0;k=0;x=ctop;count+;printf(%dt,count);while(m=top1)/*输出状态栈*/printf(%d,am);m=m+1;printf(tt);while(n=top2)/*输出符号栈*/printf(%c,bn);n=n+1;printf(tt);while(g=top3)/*输出输入串*/printf(%c,cg);g=g+1;printf(tt);while(x!=vtj&j=2)j+;if(j=2&x!=vtj)printf(errorn);return;if(actionyj=NULL)printf(errorn);return;elsestrcpy(copy,actionyj);if(copy0=S)/*处理移进*/z=copy1-0;top1=top1+1;top2=top2+1;atop1=z;btop2=x;top=top+1;i=0;while(copyi!=#)printf(%c,copyi);i+;printf(n);if(copy0=r)/*处理归约*/i=0;while(copyi!=#)printf(%c,copyi);i+;h=copy1-0;strcpy(copy1,LRh);while(copy10!=vnk)k+;l=strlen(LRh)-4;top1=top1-l+1;top2=

温馨提示

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

评论

0/150

提交评论