《编译原理实践及应用》第4章(3)LR分析方法.ppt
- 文档编号:2639059
- 上传时间:2022-11-04
- 格式:PPT
- 页数:66
- 大小:829.50KB
《编译原理实践及应用》第4章(3)LR分析方法.ppt
《《编译原理实践及应用》第4章(3)LR分析方法.ppt》由会员分享,可在线阅读,更多相关《《编译原理实践及应用》第4章(3)LR分析方法.ppt(66页珍藏版)》请在冰豆网上搜索。
LR分析方法分析方法第四章(第四章(3)本章要求本章要求主要内容主要内容:
LR分析方法及其相关概念,分析方法及其相关概念,语法分析器的自动生成,各种语法分析中语法分析器的自动生成,各种语法分析中的错误处理的错误处理重点掌握:
重点掌握:
LR分析方法与分析过程分析方法与分析过程,活,活前缀、前缀、LR(0)项目、项目、Closure和和go函数的函数的定义,项目集规范族及识别活前缀的有穷定义,项目集规范族及识别活前缀的有穷自动机的构造,自动机的构造,LR(0)分析表的构造分析表的构造,SLR文法及其分析表的构造。
文法及其分析表的构造。
LRLR分析概述分析概述LR分析法分析法:
L从左向右扫描输入串,R构造最右推导的逆过程大多数用上下文无关文法描述的高级语言的语法成分可以用LR分析器来识别。
LR分析:
采用移进-归约分析,严格的规范归约。
LR分析分析根据当前分析栈中的符号串和向右顺序查看输入串的K(K0)个符号就可以唯一确定分析的动作是移进还是归约。
向前查看0个符号,就是LR(0)分析方法,向前查看1个符号,就是LR
(1)方法。
LRLR分析的优缺点分析的优缺点优点:
比其他“移进-归约”方法使用广泛,识别率高能用LL
(1)分析法分析的所有文法都能使用LR方法来进行分析。
LR分析法在扫描输入串时就能发现其中的任何错误,并能准确地指出出错位置。
缺点:
手工构造分析表工作量太大。
必须使用自动生成器。
自底向上分析法的关键问题是如何确定句柄。
LR分析法与算符优先方法一样,LR方法也是通过求句柄逐步归约句柄逐步归约来进行语法分析。
在算符优先分析中,通过算符的优先关系得到句柄“最左素短语”,LR方法中句柄是通过识别活前缀活前缀而求得。
LR分析方法的基基本本思思想想是:
在规范归约过程中,一方面记住已移进和归约出的整个符号串(历史),另一方面又根据所用产生式推测未来可能碰到的输入符号(对未来的展望)。
当某一符号串类似于句柄出现在栈顶时,需要根据已记载的“历史”、“展望”和“现实”的输入符号三方面的内容来决定栈顶的符号串是否构成了真正的句柄,是否需要归约。
一个LR分析器的组成见下图。
11、LRLR分析方法的逻辑结构分析方法的逻辑结构一个一个LR分析器由分析器由3个部分组成:
个部分组成:
LR分析程序,又分析程序,又称称总控程序总控程序。
所有的。
所有的LR分析器都是相同的。
分析器都是相同的。
分分析析表表(分分析析函函数数),不不同同的的文文法法分分析析表表不不同同,同同一一个个文文法法采采用用的的LR分分析析器器不不同同时时,分分析析表表也也不不同同,分分析析表表又又可可分分为为动动作作表表(ACTION)和和状状态态转换转换(GOTO)表表两个部分,它们都可用二维数组表示。
两个部分,它们都可用二维数组表示。
分析栈分析栈,包括文法符号栈和相应的状态栈,它们均是先进后出栈。
,包括文法符号栈和相应的状态栈,它们均是先进后出栈。
状态栈:
(S0,#)为预先放到栈中的初始状态和符号。
文法符号:
X1X2Xm是目前已移进并归约出的句型部分。
其实它是多余的,已经概括到状态里。
分析器分析器实际上是一个带有先进后出栈的确定的有穷自动机。
将“历史”和“展望”综合成“状态”,分析栈用来存放状态,状态概括了从分析开始直到某一归约阶段的全部历史和展望资料,不必象算符优先分析法中要翻阅栈中的内容才能决定是否要进行归约。
只需根据栈顶状态和输入符号就可以唯一决定下一个动作。
总控程序根据分析表的内容来决定其下一步的总控程序根据分析表的内容来决定其下一步的处理动作,分析表是根据具体的文法按某种规处理动作,分析表是根据具体的文法按某种规则构造出来的。
则构造出来的。
LR方法:
方法:
根据具体文法的分析表对输入串进根据具体文法的分析表对输入串进行分析处理。
行分析处理。
LR分析过程:
分析过程:
在总控程序的控制下,从左到在总控程序的控制下,从左到右扫描输入符号串,根据分析栈中的状态和当右扫描输入符号串,根据分析栈中的状态和当前输入符号,按分析表中的内容完成相应的分前输入符号,按分析表中的内容完成相应的分析工作。
析工作。
2.2.分析表的组成:
分析表的组成:
符号符号状态状态a1a2atS0actionS0,a1actionS0,a2actionS0,atS1actionS1,a1actionS1,a2actionS1,atSnactionSn,a1actionSn,a2actionSn,at表中actionSi,aj,指出如果当前栈顶为状态Si,输入符号为aj时应执行的动作。
其动作有四种可能,分别为:
移进(S)、归约(r)、接受(acc)、出错(error)。
(1)
(1)分析动作表分析动作表ActionAction是一个二维数组是一个二维数组符号符号状态状态x1x2xtS0gotoS0,x1gotoS0,x2gotoS0,xtS1gotoS1,x1gotoS1,x2gotoS1,xtSngotoSn,x1gotoSn,x2gotoSn,xt表中gotoSi,xj指出状态为Si,遇到Xj时应转到的下一状态。
显然:
分析表定义了一个以文法符号为字母表的显然:
分析表定义了一个以文法符号为字母表的DFA
(2)状态转换表状态转换表goto也是一个二维数组也是一个二维数组状状态态ActionGoToi+*()#ETF00S5S412311S6acc22r2S7r2r233r4r4r4r444S5S482355r6r6r6r666S5S4r19377S5S41088S6S1199r1S7r1r11010r3r3r3r31111r5r5r5r5ri表示按第i个产生式进行归约Si表示把当前输入符号移进栈,第i个状态进状态栈。
i表示转第i个状态,即第i个状态进状态栈。
空白表示分析动作出错例:
例:
LR的的Action和和GoTo表表
(1)EE+T
(2)ET(3)TT*F(4)TF(5)F(F)(6)Fi产生式产生式的序号的序号设文法为设文法为GL:
用三元式用三元式:
(状态栈,符号栈,输入符号串状态栈,符号栈,输入符号串)表示分析过程中状态栈,符号栈,输入符号串的变化表示分析过程中状态栈,符号栈,输入符号串的变化初始时,将状态初始时,将状态S0和和#进分析栈。
三元式为:
进分析栈。
三元式为:
(S0,#,a1a2an#)任一时刻的三元式为:
任一时刻的三元式为:
(S0S1Sm,#X1X2Xm,aiai+1an#)分析器的下一步动作是由栈顶状态分析器的下一步动作是由栈顶状态Sm和和当前面临的当前面临的输入符号输入符号ai唯一确定的。
唯一确定的。
33、LRLR分析过程:
分析过程:
移进:
当前输入符号ai移进符号栈,将action表中指出的状态S进状态栈。
(S0S1SmS,#X1X2Xmai,ai+1an#)根据Sm和ai查action表,actionSm,ai有4种情况:
出错:
报告出错信息。
三元式的变化过程终止。
接受:
分析成功,终止分析。
三元式不再变化。
归约:
若产生式A的右端长度为r,则两个栈顶的r个元素同时出栈,A进符号栈;再根据Sm-r和A查goto表,S=gotoSm-r,A进状态栈。
三元式变为:
(S0S1Sm-rS,#X1X2Xm-rA,aiai+1an#)为了介绍为了介绍LR分析过程,直分析过程,直接给出该文法的分析表,接给出该文法的分析表,以后再介绍如何生成以后再介绍如何生成状状态态ACTIONGoToi+*()#ETF00S5S412311S6acc22r2S7r2r233r4r4r4r444S5S482355r6r6r6r666S5S4r19377S5S41088S6S1199r1S7r1r11010r3r3r3r31111r5r5r5r5例:
例:
LR的具体分析的具体分析过程:
过程:
(1)EE+T
(2)ET(3)TT*F(4)TF(5)F(F)(6)Fi设文法为设文法为GL:
根据上述分析表,对输入串根据上述分析表,对输入串i*i+i的分析过程如下:
的分析过程如下:
序号序号状态栈状态栈符号栈符号栈产生式产生式输入串输入串说明说明10#i*i+i#0和和#进栈进栈205#i*i+i#i和和S5进栈进栈303#FFi*i+i#i和和S5退栈退栈,F和和S3进栈进栈402#TTF*i+i#F和和S3退栈退栈,T和和S2进栈进栈5027#T*i+i#*和和S7进栈进栈60275#T*i+i#i和和S5进栈进栈702710#T*FFi+i#i和和S5退栈退栈,F和和S10进栈进栈802#TTT*F+i#F*T和和S10,7,2退栈退栈,T和和S2进栈进栈901#EET+i#T和和S2退栈退栈,E和和S1进栈进栈10016#E+i#+和和S6进栈进栈110165#E+i#i和和S5进栈进栈120163#E+FFi#i和和S5退栈退栈,F和和S3进栈进栈130169#E+TTF#F和和S3退栈退栈,T和和S9进栈进栈1401#EEE+T#T+E和和S9,6,1退栈退栈,E和和S1进栈进栈LR文法:
对一个文法,如果能够构造一个分析表,且它的每个入口均是唯一的如何构造LR分析表?
1)基本概念)基本概念字的字的前缀:
前缀:
指该字的任意首部。
活活前前缀缀:
规范句型的一个前缀,不含句柄之后的任何符号。
在它之后增添一些终结符号后,就成为规范句型。
即:
对于文法G,若S,Vt*,称为活前缀。
在LR分析的过程中,假定输入串是一个句子,任何时候符号栈里的文法符号都构成活前缀,配上输入串的剩余部分,就成为规范句型。
构造一个有穷自动机来识别文法G的所有活前缀,这样就可以自动生成LR分析表。
44、LR(0)LR(0)项目集族项目集族*LR(0)项目:
项目:
在文法G中每个产生式的右部适当位置添加一个圆点构成项目。
例如:
产生式SXYZ对应有4个项目:
0SXYZ1SXYZ2SXYZ3SXYZ产生式产生式A只对应一个项目:
只对应一个项目:
A项项目目指明了在分析过程的某时刻,已看到的产生式部分项项目目集集:
若干个项目组成的集合。
例如:
对于上述产生式的4个项目即构成一个项目集。
练练习习求文法:
SaS|bS|a的LR(0)项目集SaSSbSSaSaSSaSSaSSbSSbSSbSSaSa后继符号有多种,后继符号有多种,据此将项目分为多种:
据此将项目分为多种:
(1)移进项目:
移进项目:
后继符号为终结符:
Aa
(2)待约项目:
待约项目:
后继符号为非终结符:
AB(3)归约项目:
归约项目:
后继符号为空:
即圆点在最右边A(4)接受项目:
接受项目:
归约项目的左边是文法开始符号S后继符号后继符号:
在项目中紧跟在符号“”后面的符号称为该项目的后继符号。
表示下一时刻遇到的符号。
后继符号集:
后继符号集:
项目集中各项目的后继符号所组成的集合称为后继符号集。
项目集EET,Fi的后继符号集为,i写出文法的所有项目,每个项目是一个状态规定项目1为NFA的唯一初态若状态i和状态j出自同一产生式,而且状态j的圆点只落后于状态i一个位置:
若i的圆点后是a,从i到j画一条弧,标记为a若i的圆点后是A,则连两种弧:
(1)从状态i画弧到所有的A的状态。
(2)从状态i到j画弧,标记为A归约项目表示结束状态,用双圈表示2)构造)构造NFA的方法:
的方法:
例:
求文法对应的NFASEEaA|bBAcA|dBcB|d1.SE2.SE3.EaA4.EaA5.EaA6.AcA7.AcA8.AcA9.Ad10.Ad11.EbB12.EbB13.EbB14.BcB15.BcB16.BcB17.Bd18.Bd1)该文法的项目有:
该文法的项目有:
识别活前缀的识别活前缀的NFA2)画出NFALR(0)项目集规范族项目集规范族的定义:
构成识别一个文法活前缀的DFA的项目集的全体构造方法有两种:
1)先构造NFA,使用第三章的子集法将NFA确定化2)直接使用闭包和状态转换函数进
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实践及应用 编译 原理 实践 应用 LR 分析 方法