编译原理第七章课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《编译原理第七章课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 第七 课件
- 资源描述:
-
1、LR(k)分析方法分析方法是指从左向右扫描和自底向上是指从左向右扫描和自底向上的语法分析。每次根据当前符号或最多向前看的语法分析。每次根据当前符号或最多向前看k个符号唯一地确定是归约还是继续读个符号唯一地确定是归约还是继续读。一般来说,凡是上下文无关文法描述的程序一般来说,凡是上下文无关文法描述的程序设计语言都可以用设计语言都可以用LR方法进行有效的分析,方法进行有效的分析,而且还能在分析过程中及时准确地发现输入符而且还能在分析过程中及时准确地发现输入符号串的语法错误。号串的语法错误。通常的程序设计语言一般均能由通常的程序设计语言一般均能由LR(1)文法文法产生产生,而且能由而且能由LR(k)
2、产生的语言也可以由产生的语言也可以由LR(1)文法来产生。文法来产生。因此,我们通常只考虑因此,我们通常只考虑LR(0)和和LR(1)两种情况。两种情况。在本章中我们先后介绍在本章中我们先后介绍LR(0),SLR(1),LR(1)和和LALR(1)分析方法。分析方法。8.1 LR分析方法的逻辑结构及分析过程分析方法的逻辑结构及分析过程 LR方法也是通过求方法也是通过求句柄句柄逐步归约进行语法逐步归约进行语法分析。分析。句柄句柄在运算符优先数法中是通过运算符的在运算符优先数法中是通过运算符的优先关系而求得的;在优先关系而求得的;在LR方法中,则是通过方法中,则是通过求可归前缀求可归前缀而求得的。
3、而求得的。1.活前缀与可归前缀活前缀与可归前缀活前缀与可归前缀活前缀与可归前缀 符号串的符号串的前缀前缀是指符号串的任意首部,包括是指符号串的任意首部,包括空串空串。定义定义:对于文法:对于文法GS,若有若有 S ,Vt*则称则称为为规范前缀规范前缀,也称为,也称为活前缀活前缀。r*若若是含句柄的活前缀是含句柄的活前缀,并且每个句柄是并且每个句柄是的后缀或本身,则称的后缀或本身,则称是是可归规范前缀可归规范前缀或或可归可归前缀前缀(含有句柄的活前缀含有句柄的活前缀)。活前缀不含句柄之右的任何符号。活前缀不含句柄之右的任何符号。是规范是规范句型的左起部分,到当前句柄为止。句型的左起部分,到当前句
4、柄为止。如果在如果在其右边加上终结符号串其右边加上终结符号串后就可以成为一个规后就可以成为一个规范句型。范句型。S:=SS:=CbBA A:=AabA:=abB:=CB:=DbC:=aD:=a 对于句子对于句子ababab有规范推有规范推导,见下面的语法树:导,见下面的语法树:SaSCbABDbaba例如,设有文法例如,设有文法GS:规范句型规范句型ababab的活前缀为的活前缀为a,可归前缀为此可归前缀为此a,时句柄也是时句柄也是a;规范句型规范句型Cbabab的活前缀为的活前缀为C、Cb、Cba,可归前缀为可归前缀为Cba,此时句柄为此时句柄为a;规范句型规范句型CbDbab的活前缀为的活
5、前缀为CbD、CbDb,可可归前缀为归前缀为CbDb,此时句柄为此时句柄为Db;规范句型规范句型CbBab活前缀为活前缀为CbB、CbBa、CbBab,可归前缀为可归前缀为CbBab,此时的句柄为此时的句柄为ab;规范句型规范句型CbBA的活前缀为的活前缀为CbBA,可归前缀可归前缀为为CbBA,此时亦为此时亦为CbBA;规范句型规范句型S的活前缀为的活前缀为S,可归前缀为可归前缀为S,此时此时句柄亦为句柄亦为S。又例如,设有文法又例如,设有文法GA:A:=aBCb B:=BaC B:=b C:=c对于句子对于句子abaccb。可归前缀的求法:可归前缀的求法:设某文法有可归前缀设某文法有可归前
6、缀 A,AVn若有规则若有规则 A:=u u V*则则u也是文法的可归前缀。也是文法的可归前缀。例如,设有文法例如,设有文法GS:S:=aAcA:=AbbA:=b 文法的所有可归前缀构成的集合称为文法的文法的所有可归前缀构成的集合称为文法的可归前缀集可归前缀集根据上例文法对句子根据上例文法对句子abbbbbc的归约过程如下:的归约过程如下:abbbbbc aAbbbbc aAbbc aAc S其可归前缀集可用自动机来表示,称之为其可归前缀集可用自动机来表示,称之为可归前可归前缀图缀图。S4S0S1S2S5S3S6b ba aA Ac cb bc c从初始状态从初始状态S0到任一状态形成的符号串
7、构成了到任一状态形成的符号串构成了某规范句型的活前缀;某规范句型的活前缀;从初始状态从初始状态S0到任一终止状态形成的符号串到任一终止状态形成的符号串构成了某规范句型的可归前缀。构成了某规范句型的可归前缀。2.LR分析方法的逻辑结构分析方法的逻辑结构LR分析方法的逻辑结构:分析方法的逻辑结构:设有输入串设有输入串a1a2a3an,LR分析方法的逻辑分析方法的逻辑结构图如下:结构图如下:栈顶#anaia2a1#总控制器输入串S0#S1 x1.Sm xm分析表输出 分析栈中每项都包括状态栈分析栈中每项都包括状态栈Si和文法符号栈和文法符号栈xi两部分。两部分。LR分析器包括两个部分,一个总控程序和
8、分析器包括两个部分,一个总控程序和一张分析表。一张分析表。不同文法的不同文法的LR分析器的总控程序都是一样分析器的总控程序都是一样的,只是分析表不同,因此的,只是分析表不同,因此LR分析表是分析表是LR分分析方法的核心。总控程序根据具体的分析表析方法的核心。总控程序根据具体的分析表来决定起下一步的处理动作。来决定起下一步的处理动作。LR分析的基本原理分析的基本原理:把每个句柄:把每个句柄(某个产生式某个产生式的右部的右部)的识别过程划分为若干状态。每个状的识别过程划分为若干状态。每个状态下,从左向右地识别句柄中的一个符号,每态下,从左向右地识别句柄中的一个符号,每个状态识别句柄的一部分符号。个
9、状态识别句柄的一部分符号。也就是,在总控程序的控制下,从左到右扫也就是,在总控程序的控制下,从左到右扫描输入符号串,根据分析栈中的状态和文法符描输入符号串,根据分析栈中的状态和文法符号及当前输入符号,按分析表完成相应的分析号及当前输入符号,按分析表完成相应的分析工作。工作。由此可见,构造由此可见,构造LR分析器的主要工作是构造分析器的主要工作是构造分析表分析表LR分析表的组成:分析表的组成:LR分析表由分析动作分析表由分析动作(ACTION)表和状态转换表和状态转换(GOTO)表组成。表组成。1).分析动作表分析动作表 在分析动作表中,其元素由在分析动作表中,其元素由action(si,aj)
10、来表来表示。示。action(si,aj)表示当前分析栈的状态栈栈顶表示当前分析栈的状态栈栈顶元素为元素为si,文法符号栈栈顶元素为文法符号栈栈顶元素为aj(当前输入当前输入符号符号)时,所执行的动作。时,所执行的动作。这个动作可分为四种这个动作可分为四种:移进移进(S)、归约归约(r)、接接受受(acc)和出错和出错(error)。action(Sn,at)action(Sn,a2)action(Sn,a1)Snaction(S1,at)action(S1,a2)action(S1,a1)S1action(S0,at)action(S0,a2)action(S0,a1)S0ata2a1 状状
11、 态态输入输入符号符号2).状态转换表状态转换表gotoSn,xegotoSn,x2gotoSn,x1SngotoS1,xegotoS1,x2gotoS1,x1S1gotoS0,xegotoS0,x2gotoS0,x1S0 xex2x1 状状 态态文法文法符号符号 gotosi,xj指出栈顶状态为指出栈顶状态为si,文法符号为文法符号为aj时应转到的下一状态。时应转到的下一状态。3.LR分析过程分析过程LR分析步骤:分析步骤:在讲述在讲述LR的分析步骤之前,我们假设分析的分析步骤之前,我们假设分析表已经成功构造。表已经成功构造。下面我们给出下面我们给出LR分析的具体步骤:分析的具体步骤:将初始
12、状态将初始状态S0和句子的左界符和句子的左界符#分别进分析栈分别进分析栈中的状态栈和符号栈;中的状态栈和符号栈;根据栈顶状态和当前输入符号查动作表,然根据栈顶状态和当前输入符号查动作表,然后分别做如下动作:后分别做如下动作:移进移进;当前输入符号进符号栈,根据状态转;当前输入符号进符号栈,根据状态转换表,得到的新的状态进状态栈。继续扫描,换表,得到的新的状态进状态栈。继续扫描,从而下一个符号变成当前输入符号。从而下一个符号变成当前输入符号。归约归约;按某个产生式进行归约,若产生式的;按某个产生式进行归约,若产生式的右端长度为右端长度为n,则符号栈顶和状态栈顶则符号栈顶和状态栈顶n个元素个元素同
13、时相应退栈。归约后的文法符号进符号栈,同时相应退栈。归约后的文法符号进符号栈,查状态转换表,得到的新状态进状态栈。查状态转换表,得到的新状态进状态栈。接受接受;分析成功,终止分析。;分析成功,终止分析。出错出错;报告出错信息。;报告出错信息。重复第重复第2步的工作,直到接受或出错。步的工作,直到接受或出错。LR分析流程图分析流程图(P192图图8-4)。具体分析过程具体分析过程下面我们以具体的例子来说明下面我们以具体的例子来说明LR方法的分方法的分析过程:析过程:设有文法设有文法GL:1)L:=E,L 2)L:=E 3)E:=a 4)E:=b上述文法表述的是单个上述文法表述的是单个a和和b及由
14、逗号分隔的及由逗号分隔的任意个任意个a和和b所组成的所有符号串的集合。所组成的所有符号串的集合。这里我们直接给出该文法的分析表这里我们直接给出该文法的分析表(P192图图8-3)。ri表示按第表示按第i个产生式进行归约;个产生式进行归约;Si表示把当前输入符号移进符号栈,且第表示把当前输入符号移进符号栈,且第i个个状态进状态栈;状态进状态栈;i表示转第表示转第i个状态,即第个状态,即第i个状态进状态栈;个状态进状态栈;表中未填内容的空白则表示分析动作为出错。表中未填内容的空白则表示分析动作为出错。下面我们以输入串下面我们以输入串#a,b,a#为例,具体讲述为例,具体讲述LR分析过程。分析过程。
15、状态栈状态栈符号栈符号栈产生式产生式输入符号输入符号说说 明明S0#a,b,a#S0和和#分别进栈分别进栈S0S3#a,b,a#a和和S3分别进栈分别进栈S0S2#EE:=a,b,a#a和和S3分别退栈分别退栈E和和S2分别进栈分别进栈S0S2S5#E,b,a#,和和S5分别进栈分别进栈S0S2S5S4#E,b,a#b和和S4分别进栈分别进栈S0S2S5S2#E,EE:=b,a#b和和S4分别退栈分别退栈E和和S2分别进栈分别进栈S0S2S5S2S5#E,E,a#,和和S5分别进栈分别进栈S0S2S5S2S5S3#E,E,a#a和和S3分别进栈分别进栈S0S2S5S2S5S2#E,E,EE:=
16、a#a和和S3分别退栈分别退栈E和和S2分别进栈分别进栈状态栈状态栈符号栈符号栈产生式产生式输入符号输入符号说说 明明S0S2S5S2S5S6#E,E,LL:=E#E和和S2分别退栈分别退栈L和和S6分别进栈分别进栈S0S2S5S6#E,L L:=E,L#E,L和和S2S5 S6退栈退栈L和和S6分别进栈分别进栈S0S1#L L:=E,L#E,L和和S2S5 S6退栈退栈L和和S1分别进栈分别进栈acc 可见可见#a,b,a#符合所给的文法规则。符合所给的文法规则。8.2 LR(0)分析表的构造分析表的构造 LR(0)分析是当分析是当k=0时的时的LR(k)分析方法。在分析方法。在分析的每一步
17、只要根据当前栈顶状态就能确定分析的每一步只要根据当前栈顶状态就能确定完成何种分析动作。完成何种分析动作。基本概念:基本概念:项目项目:对于文法:对于文法G,其产生式右部带有特殊其产生式右部带有特殊符号符号“”,则称之为文法的一个,则称之为文法的一个LR(0)项目项目,简称简称项目项目。有时也称为。有时也称为配置式配置式。特殊符号也可以用特殊符号也可以用“.”,并且要加在产生,并且要加在产生式右部的任何地方,表示一个位置。式右部的任何地方,表示一个位置。项目集项目集:若干个项目组成的集合称为:若干个项目组成的集合称为项目集项目集,又称为又称为配置集合配置集合。后继符号后继符号:项目中紧跟在特殊符
18、号:项目中紧跟在特殊符号“”后后面的符号称为该项目的面的符号称为该项目的后继符号后继符号。后继符号后继符号表示下一时刻读到的符号。有如下两表示下一时刻读到的符号。有如下两种情况:种情况:后继符号为终结符号和非终结符号后继符号为终结符号和非终结符号例如,对应于产生式例如,对应于产生式:E:=E+T有四个项目:有四个项目:E:=E+T E:=E+T E:=E+T E:=E+T 这一类的后继符号为:这一类的后继符号为:E:=E+T的后继符号为的后继符号为E E:=E+T的后继符号为的后继符号为+E:=E+T的后继符号为的后继符号为T后继符号为空后继符号为空规定规定:该项目的后继符号为带有:该项目的后
19、继符号为带有“#”的相应的相应产生式,用来表示下一时刻将按指定的产生式产生式,用来表示下一时刻将按指定的产生式进行归约。进行归约。后继符号集后继符号集 定义定义:项目集中诸项目的后继符号所组成的集:项目集中诸项目的后继符号所组成的集合称为合称为后继符号集后继符号集。状态内容状态内容 分成是分成是基本基本(BASIC)部分部分和和闭包闭包(CLOSURE)部分部分。设设Si是是Sk关于符号关于符号 X的后继状态,则求的后继状态,则求BASIC(Si)和和CLOSURE(Si)的方法:的方法:1).BASIC(Si)的计算:的计算:BASIC(Si)=A:=X|A:=XSk2).CLOSURE(S
20、i)的计算:的计算:.BASIC(Si)CLOSURE(Si);.若若A:=YCLOSURE(Si),且且YVn则则Y:=rCLOSURE(Si),r为符号串;为符号串;.重复重复直到直到CLOSURE(Si)不再增加为止。不再增加为止。例如,对于文法例如,对于文法GS:S:=A A:=aAb A:=c 设其开始设其开始状态为状态为S0,则求则求S0的状态内容。的状态内容。项目类型项目类型 项目类型有三类项目类型有三类归约项目归约项目、移进项目移进项目和和待归待归项目项目。归约项目:归约项目:A:=此时已把分析结束,已在栈顶此时已把分析结束,已在栈顶,从从而可按相应的产生式进行归约。而可按相应
展开阅读全文