ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:39.14KB ,
资源ID:13851095      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/13851095.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(LR0分析表构造剖析Word文件下载.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

LR0分析表构造剖析Word文件下载.docx

1、在LR分析工作过程中的任何时候,栈里的文法符号(自栈底而上) X1X2Xm应该构成活前缀,把输入串的剩余部分配上之后即应成为规范句型(如果整 个输入串确实构成一个句子)。因此,只要输入串的已扫描部分保持可归约成一 个活前缀,那就意味着所扫描过的部分没有错误。对于一个文法G,我们可以构造一个 有限自动机,它能识别 G的所有活前 缀,然后把这个自动机转变成LR分析表,按照该LR分析表进行LR分析,就 能保证在分析的过程中,如果分析的句子是正确的,栈里的文法符号(自栈底而 上)始终构成活前缀。假若一个文法G的拓广文法G 的活前缀识别自动机中的每个状态(项目集) 不存在下述情况:(1)既含移进项目又含

2、归约项目;(2)含有多个归约项目,则 称G是一个LR (0)文法。该自动机的状态集合即为该文法的 LR (0)项目集 规范族。构造识别文法活前缀DFA有3种方法:(1)根据形式定义求出活前缀的正则表达式, 然后由此正则表达式构造NFA 再确定为DFA;(2) 求出文法的所有项目,按一定规则构造识别活前缀的 NFA再确定化为 DFA;(3)使用闭包函数(CLOSURE)和转向函数(GO(I,X)构造文法G的LR(0) 的项目集规范族,再由转换函数建立状态之间的连接关系来得到识别活前缀的DFA。符号串的前缀是指该符号串的任意首部,包括空串。例如,对于符号串abc, 其前缀有c,a,ab, abc。

3、如果输入串没有错误的话,一个规范句型的活前缀是 该句型的一个前缀,但它不含句柄之后的任何符号。之所以称为活前缀,是因为 在该前缀后联接尚未输入的符号串可以构成一个规范句型。活前缀与句柄的关系如下:(1)活前缀已含有句柄的全部符号,表明产生式 A - B的右部B已出现在 栈顶。(2) 活前缀只含句柄的一部分符号,表明 A1 B 2的右部子串B 1已出现 在栈顶,期待从输入串中看到B 2推出的符号。(3)活前缀不含有句柄的任何符号,此时期望 A- B的右部所推出的符号 串。在文法G的每个产生式的右部(候选式)的任何位置上添加一个圆点,所构 成的每个产生式称为LR (0)项目。如产生式A- xyz有

4、如下项目:A.xyz, A x.yz,A xy.z,A xyz.。为刻划分析过程中的文法的每一个产生式的右部 符号已有多大一部分被识别(出现在栈顶),可以用这种标有圆点的产生式来确 定。(1)Af B 刻划产生式Af B的右部B已出现在栈顶。(2)Af B 1. B 2刻划Af B i B 2的右部子串B i已出现在栈顶,期待从输入串 中看到B 2推出的符号。(3)Af.B刻划没有句柄的任何符号在栈顶,此时期望 AfB的右部所推出 的符号串。(4)对于Af &的LR(O)项目只有Af.o设文法G= ( Vt, Vn , S, P)是一个上下文无关文法,若存在一个规范推导*s=. aAw= ab

5、1b2W (其中A?b lb2?P),则称项目A?b l?b 2对活前缀g=abi是有效的, rm rm即LR(0)有效项目。从直观意义上讲,一个LR(0)项目指明了在分析过程中的某一步我们看到产 生式的多大部分被识别,LR(0)项目中的圆点可看成是分析栈栈顶与输入串的分 界线,圆点左边为已进入分析栈的部分,右边是当前输入或继续扫描的符号串。不同的LR(0)项目,反映了分析栈顶的不同情况。我们根据 LR(0)项目的作用不同,将其分为四类:(1)归约项目:表现形式:Af a.这类LR(0)项目表示句柄a恰好包含在栈中,即当前栈顶的部分内容构成了 所期望的句柄,应按Af a进行归约。(2)接受项目

6、:S f a.其中S是文法惟一的开始符号。这类 LR(0)项目实际是特殊的归约项目,表 示分析栈中内容恰好为a,用Sf a进行归约,则整个分析成功。(3)移进项目:Af a.b ( b Vt)这类LR(0)项目表示分析栈中是不完全包含句柄的活前缀,为构成恰好有句 柄的活前级,需将b移进分析栈。(4)待约项目:Af a .BB (B Vn)这类LR(0)项目表示分析栈中是不完全包含句柄的活前缀,为构成恰好有句 柄的活前缀,应把当前输入字符串中的相应内容先归约到 B。在给出LR(0)项目的定义和分类之后,我们从这些 LR(0)项目出发,来构造 能识别文法所有前缀的有限自动机。 其步骤是:首先构造能

7、识别文法所有活前缀 的非确定的有限自动机,再将其确定化和最小化,最终得到所需的确定的有限自 动机。由文法G的LR(0)项目构造识别文法G的所有活前缀的非确定有限自动机 的方法:(1)规定含有文法开始符号的产生式 (设S f A)的第一个LR(0)项目(即 S f .A)为NFA的惟一初态。(2)令所有LR(0)项目分别对应NFA的一个状态且LR(0)项目为归约项目 的对应状态为终态。(3)若状态i和状态j出自同一文法G的产生式且两个状态LR(O)项目的圆 点只相差一个位置,即:若 i 为 X X1X2 Xi-1 XiXn, j 为 X XlX2Xi Xi+1 Xn,则从状态 i引一条标记为Xi

8、的弧到状态j。(4)若状态i为待约项目(设X a A B),则从状态i引弧到所有A r的状态。为了使“接受”状态易于识别,我们通常将文法 G进行拓广。假定文法G是一个以S为开始符号的文法,我们构造一个 G,它包含了整 个G,但它引进了一个不出现在 G中的非终结符S,并加进一个新产生式S S, 以S SG为开始符号。那么,我们称 G是G的拓广文法。这样,便会有一个仅含项目S S的状态,这就是惟一的“接受”态。如果I是文法G,的一个项目集,定义和构造I的闭包CLOSURE(I)如下:(1)I的项目都在CLOSURE(I)中。(2)若A .B 属于CLOSURE(I),则每一形如B.的项目也属于 C

9、LOSURE(I)。(3)重复(2)直到CLOSURE(I)不再扩大。定义转换函数如下:GO (I,X) = CLOSURE (J)其中:I为包含某一项目集的状态,X为一文法符号,J= A X . - | A .X- I圆点不在产生式右部最左边的项目称为核,惟一的例外是 S .S,因此用GOTO (I, X)状态转换函数得到的J为转向后状态闭包项目集的核。使用闭包函数(CLOSURE)和转换函数(GO(I,X)构造文法G的LR(0)的项 目集规范族,步骤如下:(1)置项目S .S为初态集的核,然后对核求闭包CLOSURE( S .S) 得到初态的闭包项目集。(2)对初态集或其他所构造的项目集应

10、用转换函数 GO(I ,X)= CLOSURE(J) 求出新状态J的闭包项目集。(3)重复(2)直到不出现新的项目集为止。计算LR (0)项目集规范族C=I0, I1 , . In 的算法伪代码如下:Procedure itemsets(G );Begin C := CLOSURE (S 、.S)RepeatUn til C不再增大En d;一个项目集可能包含多种项目,若移进和归约项目同时存在,则称移进-归约 冲突,若归约和归约项目同时存在,则称归约-归约冲突。下面看一个具体的例子:我们希望能根据识别文法的活前缀的 DFA建立LR分析器,因此,需要研 究这个我们说项目A 1. B 2对活前缀a

11、 B 1是有效的,其条件是存在规范推导 S匚.A 二2。一般而言,同一项目可能对几个活前缀都是有效的(当一个项目出现在几个不同的集合中时便是这种情形)。若归约项目A-Bi对活前缀 :11是有效的,贝尼告诉我们应把符号串11归约为A,即把活前缀门i变成a A。 若移进项目Ai. B 2对活前缀Ji是有效的,则它告诉我们,句柄尚未形成, 因此,下一步动作应是移进。但是,可能存在这样的情形,对同一活前缀,存在 若干项目对它都是有效的。而且它们告诉我们应做的事情各不相同,互相冲突。 这种冲突通过向前多看几个输入符号,或许能够获得解决。对于每个活前缀,我们可以构造它的有效项目集。实际上,一个活前缀丫的

12、有效项目集正是从上述的DFA的初态出发,经读出丫后而到达的那个项目集(状 态)。换言之,在任何时候,分析栈中的活前缀 XlX2Xm的有效项目集正是栈顶状态Sm所代表的那个集合。这是LR分析理论的一条基本定理。实际上,栈 顶的项目集(状态)体现了栈里的一切有用信息一一历史。前面我们已经对LR (0)文法进行了定义,下面我们来看一下LR (0)分析 表是如何构造的。对于LR (0)文法,我们可以直接从它的项目集规范族 C和活前缀识别自动机的状态转换函数GO构造出LR分析表。下面是构造LR (0)分析表的算法。假定C=l0, li, ,In,令每个项目集Ik的下标k为分析器的一个状态,因此, G的L

13、R(0)分析表含有状态0,1,n。令那个含有项目S S的Ik的下标k为初态。ACTION子表和GOT0子表可按如下方法构造:(1)若项目A a .aB属于Ik且GO (Ik, a)= Ij, a为终结符,则置ACTIONk, a为“把状态j和符号a移进栈”,简记为“ s”;(2)若项目A a 属于Ik,那么,对任何终结符a,置ACTIONk,a为“用 产生式A a进行规约”,简记为“ rj”;其中,假定A a为文法G的第j个产 生式;(3)若项目S S.属于Ik,贝U置ACTIONk, #为“接受”,简记为“acc”;(4)若GO (Ik, A)= Ij, A为非终结符,则置 GOTOk, A

14、=j ;(5)分析表中凡不能用上述1至4填入信息的空白格均置上“出错标志”。按上述算法构造的含有ACTION和GOTO两部分的分析表,如果每个入口不 含多重定义,则称它为文法G的一张LR(0)分析表。具有LR(0)表的文法G称为一 个LR (0)文法,LR(0)文法是无二义的。DFA的每个项目集(状态)中的项目的不同作用。三、实验内容(1)建立一个项目集 class ProjectSet/(2) 建立 string actionTableMAX_PRO_SET_NUM+1MAX_VT_NUM;/ACTION 表 string gotoTableMAX_PRO_SET_NUM+1MAX_VT_NUM;/GOTO 表( 3)输出分析表 void input()四、实验代码与结果#include stringfstreamusing namespace std;#define MAX_PRO_NUM 50#define MAX_PRO_SET_NUM 20#define MAX_P_NUM 20#define M

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1