编译原理课件.ppt_第1页
编译原理课件.ppt_第2页
编译原理课件.ppt_第3页
编译原理课件.ppt_第4页
编译原理课件.ppt_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章 LR分析法,教学目的:让学生了解LR分析方法的基本思想,掌握LR(0) 、SLR(1) 、LR(1)、LALR(1) 分析法。,教学重点: LR(0)分析、LR(l)分析、SLR(1)分析和LALR(1)分析;构造LR分析的分析表。,课时分配:8学时,本章知识点(内容),LR分析概述,LR(0)分析,SLR(1)分析,LR(1)分析,LALR(1)分析,二义文法在LR分析中的应用,7.1 LR(Left-Right)分析概述,算符优先分析法存在的问题 强调算符之间的优先关系的唯一性,这使得它的适应面比较窄;算法在发现最左素短语的尾时,需要返回来寻找对应的最左素短语头。,LR分析法: 1

2、 对文法限制少;2 适用范围广;3 分析速度快; 4报错准确。5 易于实现自动生成。由于构造分析器的工作量很大,不大可能手工构造;如用软件工具Yacc-Yet Another Compiler Compiler,Bell,这些软件工具叫LR生成器。,一、LR(k)分析法 L :从左到右扫描输入符号, R :最右推导对应的最左归约, k :超前读入k个符号,用以确定归约所用的规则。 LR分析法在自左至右扫描输入串时就能发现其中的任何错误并能准确地指出出错地点。 大多数用上下文无关文法描述的程序语言都可用LR分析器予以识别。 主要缺点是,用手工构造分析程序则工作量相当大。因此,必须求助于自动产生这

3、种分析程序的产生器。,二、LR分析法分类: LR(0)表构造法。这种方法的局限性极大、但它是建立其它较一般的LR分析法的基础。 SIR表构造法。虽然,有一些文法构造不出SLR分析表,但是,这是一种比较容易实现又极有使用价值的方法。 规范LR表构造法。这种分析表能力最强,能够适用一大类文法,但实现代价过高,或者说,分析表的体积非常大。 向前LR表构造法(简称LAIR)。这种分析表的能力介于SIR和规范LR之间,稍加努力,就可以高效地实现。,规范归约(最左归约一最右推导的逆过程)的关键问题是寻找句柄。 LR方法的基本思想是:在规范归约的过程中,一方面要记住已移进和归约出的整个字符串,也就是说要记住

4、历史;一方面能够根据所用的产生式的推测未来可能碰到的输入符号,也就是说能够对未来进行展望。这样,当一串貌似句柄的字符串出现在分析栈的顶部时,我们希望能够根据历史和展望以及现实的输入符号这三部分的材料,决定出现在栈顶的这一串符号是否就是我们要找的句柄。,三、LR分析器的逻辑结构 一个LR分析器包括两部分:一个总控(驱动)程序和一张分析表。注意:所有LR分析器的总控程序都是一样的,只是分析表各有不同。因此产生器的主要任务就是产生分析表。LR分析器的核心部分是一张分析表。,采用下推自动机这种数据模型。包括以下几个部分: 1.输入带。 2.分析栈:包括状态栈和文法符号栈两部分。 3.LR 分析表:包括

5、动作表和状态转移表两张表。,分析表包括两部分: 一部分是(ACTION)表,另一部分是状态转换(GOTO)表。它们都是二维数组。 ACTIONS,a中规定了当状态S面临输入符号a时应采取什么动作。 GOTOS,X规定了状态S面对文法符号X(终结符或非终结符)时下一状态是什么。 显然,GOTOS,X定义了一个以文法符号为字母表的DFA。,【例】演示,每一项ACTIONS,aJ所规定的动作是下述4种可能之-: (1)移进:把(S,a)的下一状态S =ACTIONS,a和输入符号a推进栈(对终结符,GOTOS,a的值已放入ACTIONS,a中),下一个输入符号变成现行输入符号。 (2)归约:指用某一

6、产生式A 进行归约。假若 的长度为 ,归约的动作是去掉栈顶的个项,然后把(Sm- ,A)的下一状态和文法符号A推进栈。归约动作不改变现行输入符号。执行归约的动作意味着呈现于栈顶的符号串是一个相对于A的句柄。 (3)接受:宣布分析成功,停止分析器的工作。 (4)报错:报告发现源程序含有错误,调用出错处理程序。,对于-个文法,如果能构造一张分析表,使得它的每个入口均是唯一确定的,则把这个文法称为LR文法。对于一个LR文法,当分析器对输入串进行自左至右扫描时,一旦句柄呈现于栈顶,就能及时对它实行归约。 一个LR分析器有时需要“展望”和实际检查未来的k个输入符号才能决定应采取什么样的“移进一归约”决策

7、。一般而言, 一个文法如果能用一个每步顶多向前检查K个输入符号的LR分析器进行分析,则这个文法就称为LR(k)文法。 对于一个文法,如果它的任何移进一归约分析器都存在尽管栈的内容和符号都已了解,但无法确定是“移进”还是“归约”;或者,无法从几种可能的规约中确定其一的情形,那么这个文法就是非LR(1)的。,7.2 LR(0)分析法,【例】已知文法GS,分析符号串abbcde是否是GS的句子 。(1) S aAcBe1(2) A b2(3) A Ab3(4) B d4【解】这里每个产生式的右部字符串末尾的编号是为了方便查看在最右推导中是选择哪个产生式推导的,并不是产生式的一部分。句子的最右推导过程

8、为:S =aAcBe1 =aAcd4e1=aAb3cd4e1=ab2b3cd4e1,由于最右推导就是规范推导,因此句型 aAcBe、aAcde、aAbcde、abbcde为规范句型。 规范句型的这种前部分符号串称为可归前缀。 【例如】 符号串aAcBe是规范句型aAcBe的可归前缀, aAcd是规范句型aAcd4e1的可归前缀, aAb是规范句型aAb3cd4e1的可归前缀, ab是规范句型ab2b3cd4e1的可归前缀。我们把形成可归前缀之前包括可归前缀在内的所有规范句型的前缀都称为活前缀。所谓前缀就是符号串的任意首部。活前缀就是可归前缀的任意首部。,【例如】可归前缀ab的活前缀为,a,ab

9、可归前缀aAb的活前缀为,a,aA,aAb可归前缀aAcd的活前缀为,a,aA,aAc,aAcd可归前缀aAcBe的活前缀为,a,aA,aAc,aAcB,aAcBe,因为规范归约实际上就是规范推导的逆过程。可归前缀就是存放在文法符号栈中的内容,它和输入缓冲器的剩余内容合在一起如果刚好就是规范句型,就能够保证我们的归约是一个规范归约的过程。即栈内符号串总是规范句型的前缀,且不含句柄右侧的符号。原因:句柄一旦在栈顶形成,就不再移进新符号,而是要进行归约了。 我们把具有上述性质的符号串称为规范句型的活前缀。,为什么要引进活前缀的概念?,规范句型活前缀,一、活前缀和可归前缀的形式定义,若S A ,则称

10、为可归前缀; 若有串W是的前缀,则称W是G的一个活前缀(S为文法拓广后的开始符,它只出现在规则左部)。可归前缀是包含句柄的活前缀。,二、说明:,规范句型的活前缀有两个要点: (1)它是规范句型的前缀; (2)它不含句柄右侧符号,由于活前缀实际上就是满足一定要求的符号串,因此识别活前缀的工作和识别单词的工作非常类似,所以我们可以采用有穷自动机这种数据模型来实现活前缀的识别。,如何识别文法符号栈中的内容就是活前缀,基本思想是我们可以把文法的终结符和非终结符都看成有穷自动机的输入符号,每次把一个符号进栈看成已识别过了该符号,同时状态进行转换,当识别到可归前缀时,相当于在栈中形成句柄,达到了识别句柄的

11、终态。,识别活前缀的有穷自动机的构造,实现识别活前缀的有穷自动机的构造有两种方法: 方法1: 由文法的产生式直接构造识别活前缀和可归前缀的有穷自动机 方法2: 通过构造文法G的LR(0)的项目集规范族来直接构造识别活前缀的DFA 【说明】由于NFA确定化为DFA的工作量较大,我们考虑直接构造出项目集规范族作为DFA的状态,来构造DFA。,LR(0)项目集规范族的构造,定义:构成识别一个文法活前缀的DFA项目集(状态)的全体,称为这个文法的LR(0)项目集规范族。,(一) LR(0)项目 在每个产生式的右部适当位置添加一个圆点构成项目(item)。每个项目的含义和圆点的位置有关。项目圆点的左部表

12、示分析过程的某个时刻用该产生式归约时句柄已识别的部分,圆点右部表示待识别的部分。,根据圆点所在的位置和圆点后是终结符还是非终结符把项目分为以下几种: 1、移进项目,形如 A a . ab 2、待约项目,形如 A a . Bb 3、归约项目,形如 A a . 4、接受项目,形如 SS .,【例】产生式SaAcBe对应的6个项目是: 0S.aAcBe 1Sa.AcBe 2SaA.cBe 3SaAc.Be 4SaAcB.e 5SaAcBe.,一个产生式可对应的项目为它的右部符号长度加1,对空产生式 A- 仅有一个项目 A-.,【例】产生式A-X YZ 对应4个项目 A-.XY Z A-XY Z A-

13、X YZ A-X YZ,(二)LR(0)项目集规范族的构造 对于构成识别一个文法活前缀的DFA项目集的全体称为这个文法的LR(0)项目集规范族 (1)首先,为了使接受状态易于识别,总是将文法G进行拓广。假定文法G是一个以S为开始符号的文法,我们构造一个G,它包含了整个G并引进了一个不出现在G中的非终结符S;同时加进了一个新产生式S一S,而这个S是G的开始符号,称G是G的拓广文法。会有一个仅含项目S-S的状态,这就是唯一的接受态。,如果I是文法G的一个项目集,定义和构造I的闭包CLOSURE(I)如下: a)I的项目都在CLOSURE(I)中 b)若Aa . Bb属于CLOSURE(I),则每一

14、形如B. g的项目也属于CLOSURE(I) c)重复b)直到CLOSURE(I)不再扩大。 【说明】求闭包函数的过程实际上就是求所有等价状态的过程。,(2)闭包函数CLOSURE(I),(3)转换函数GOTO(I,X) 定义转换函数如下: GOTO(I,X)= CLOSURE(J) 其中:I为包含某一项目集的状态,X为一文法符号 J=任何形如AaX . b的项目| Aa . X b属于I 定义两个函数后,就可以通过闭包函数CLOSURE求DFA一个状态的项目集,通过转换函数求DFA一个状态的项目集,【例】,A-a.Xb,A-aX.b,构造文法G的LR(0) 项目集规范族的方法 : 把文法的所

15、有产生式的项目都引出,每个项目都为NFA的一个状态。其中文法的第一个产生式的第一个项目S . S为文法的初态集的核心项。 a)置项目S . S为初态集的核心项后,对核心项求闭包CLOSURE(S . S)得到初态的项目集 b)对初态集或其它所构造的项目集应用转换函数GOTO(I,X)= CLOSURE(J)求出新状态J的项目集 c)重复b)直到不出现新的项目集为止,【例】文法GS: 0SE 1EaA 2EbB 3AcA 4Ad 5BcB 6Bd 其规范项目集族构造如下:,假定C=I。,I1,In)。由于我们已经习惯用数字表示状态,因此令每个项目集Ik的下标k作为分析器的状态。特别是令包含项目S

16、S(表示整个句子还未输入)的集合Ik的下标k为分析器的初态。,LR(0)分析表的构造,分析表的ACTION子表和GOTO子表可按如下方法构造: (1)若项目A- a 属于Ik 且GO(Ik,a)= Ij ,a为终结符,置ACTIONk,a 为将(j,a)移进栈”,简记为“Sj (2)若项目A-. 属于Ik,则对任何终结符a(或结束符#),置ACTIONk,a 为用产生式A-a进行归约,简记为“rj”(注意:j是产生式的编号而不是项目集的状态号,即A-a是文法G的第j个产生式)。,(3)若项目S-S 属于Ik (S 表示整个句子已输入并归约结束),则置ACTIONK,#为可“接受”,简记为“ac

17、c”。 (4)若GO(Ik ,A)=Ij , A为非终结符,则置GOTOk,A=j。 (5)分析表中凡不能用规则(1)一(4)填入的空白格均置上“报错标志”。,LR(0)分析算法,1、置输入指针 ip 指向输入串的第一个符号;令 s 是栈顶状态, a 是 ip 所指向的符号;将#压入符号栈,将开始状态0压入状态栈; 2、重复执行如下过程: if(actions,a=sj) 把符号a入符号栈,把状态j入状态栈; 使 ip 指向下一个输入符号。 else if (actions,a=rj), 从栈顶弹出第j条规则右部串长|个符号; 把归约得到的非终结符A压入符号栈; 将gotos,A的值j压入状态

18、栈; 并输出规则 A。 else if (actions,a=acc) return; else error(); ,【例】文法GS: 0SE 1EaA 2EbB 3AcA 4Ad 5BcB 6Bd,对输入串bccd#分析如下:,LR(0)文法,1、如果 I 中至少含两个归约项目,则称 I 有 归约归约冲突(Reduce/Reduce Conflict),2、如果 I 中既含归约项目,又含移进项目,则称 I 有移进归约冲突(Shift/Reduce Conflict),3、如果 I 既没有归约归约冲突,又没有移进归约冲突,则称 I 是相容的(Consistent),否则称 I 是不相容的。,4

19、、对文法G,如果 IC,都是相容的,则称G为LR(0)文法。,【例】有产生式如下 SBB BaB|b 构造该文法的LR(0)分析表 将文法G拓广为文法G 0)S一S 1)SBB 2)BaB 3)Bb 列出LR(0)的所有项目 1、SS 5、SBB 9、B-.b 2、S一S. 6、 BaB 10、B-b. 3、S一.BB 7、BaB 4、SBB 8、BaB.,用e_CLOSURE办法构造文法G的LR(0)项目集规范族 I0: S-.S S-.BB B-.aB B-.b I1: S-S. I2:SBB B一.aB B.b I3: B-a.B B-.aB B-.b I4: B-b. I5: S-BB

20、. I6: B-aB.,LR(0)分析表,【练习】设有文法GS: S-E E-Aa |bB A-cA |d B-cB |d 构造LR(0)分析表,并利用此分析表判断符号串acccd是否是文法GS的句子。,LR(0)文法是一类非常简单的文法,没有查看下一符号(Token),决定分析动作仅仅根据到目前已经看到的东西,分析能力弱。即使是定义算术表达式这样的简单文法也不是LR(0)。 改进办法: 向前查看下一符号-SLR(1),LR(1),LALR(1),7.3 SLR(1)分析,7.3 SLR(1)分析法,一、LR(0)分析存在的问题,【例】已知文法G,开始符号为S,判断该文法是否为LR(0) 文法

21、。(0) S S(1) S rD (2) DD,i(3) D i,单击演示,这里仅仅凭LR(0) 项目本身的信息已经无法解决项目之间的冲突,需要向前查看一个符号,再来决定到底是采取移进动作还是归约动作。,二、解决方法 对含有移进-归约和归约-归约冲突的项目集 I=Xa.bb , Ag. ,Bd.若有:FOLLOW(A) FOLLOW(B) = FOLLOW(A) b = FOLLOW(B) b = 状态I面临某输入符号a1) 若a=b,则移进2) 若aFOLLOW(A), 则用产生式 A g 进行归约3) 若aFOLLOW(B), 则用产生式 B d 进行归约4) 此外,报错,若一个文法的LR

22、(0)分析表中所含有的动作冲突都能用上述方法解决,则称这个文法是SLR(1)文法。SLR(1)文法是无二义的。,对任给的一个文法G,我们可用如下的办法构造它的SLR(1)分析表: 首先把G拓广为G,对G构造LR(0)项目集规范族和活前缀识别自动机的状态转换函数GO,使用闭包函数和函数,然后再按下面的算法构造G的SLR分析表。,SLR(1)分析表构造方法,(1)若项目A- a 属于Ik 且GO(Ik,a)= Ij ,a为终结符,置ACTIONk,a 为将(j,a)移进栈”,简记为“Sj。 (2)若项目A-. 属于Ik,则对任何终结符a(或结束符#),且aFOLLOW(A),置ACTIONk,a

23、为用产生式A-a进行归约,简记为“rj”。 (3)若项目S-S 属于Ik (S 表示整个句子已输入并归约结束),则置ACTIONK,#为可“接受”,简记为“acc”。 (4)若GO(Ik ,A)=Ij , A为非终结符,则置GOTOk,A=j;。 (5)分析表中凡不能用规则(1)一(4)填入的空白格均置上“报错标志”。,分析表的ACTION子表和GOTO子表构造方法:,【练习】判断下列文法是否是LR(0),如不是说明理由,判断是否是SLR(1)文法。,文法GS S-iSeS S-iS S-a,【练习】文法个GE为: EE+T|T T-T*F|F F-(E)|i 分析它是LR(0)文法还是SLR

24、(1)文法。,SLR(1)的局限性: 在SLR方法中,若项目集Ik含有 A- .,那么在状态k时,只要所面临的输入符号a FOLLOW(A),就确定采取“用A- 归约”的动作。但是在某种情况下,当状态k呈现于栈顶时,栈里的符号串所构成的活前缀未必允许把归约为A,因为可能没有一个规范句型含有前缀 Aa。因此,在这种情况下,用A- 进行归约未必有效。 即在SLR方法中存在无效归约。,7.4 LR(1)分析,【例】下列文法G为 0)S-S 1)S一aAd 2)S-bAc 3)Saec 4)S一bed 5)A-e,lo:S-S S一aAd S-.bAc Saec S一bed,LR(0)识别G的活前缀的

25、DFA,项目I5 、I7 中的移进-归约冲突,不能用SLR(1) 解决。,I5:S-aec A-e 因S=S=aAd=aed,R,对活前缀ae,面临输入符号c时应移进,面临d时 应用A-e 归约FOLLOW(A)=c,d,其中面临c 时 存在无效归约。,LR(1)项目的一般形式,重新定义项目,使得每个项目都附带有K个终结符。每个项目的一般形式是: A- ,ala2 ak A- 是一个LR(0)项目,每一个a都是终结符。这样的一个项目称为一个LRIk项目。项目中的ala2ak称为它的向前搜索符串(或展望串)。向前搜索符串仅对归约项目A- ,ala2 ak有意义。对于任何移进或待约项目A- ,al

26、a2 ak, ,搜索符串ala2 ak不起作用。归约项目 A- ,ala2 ak ,意味着当它所属的状态呈现在栈顶且后续的k个输入符号为ala2 ak,才可以把栈顶的 归约为A。这里只对k1的情形感兴趣,因为对多数程序语言的语法来说,向前搜索(展望一个符号就基本可以确定“移进”或“归约”。,构造有效的LR(1)项目集族的办法本质上和构造LR(0)项目集规范族的办法是样的。即也需要两个函数CLOSURE和GO。 假定I是一个项目集,它的闭包CLOSURE()可按如下方式构造: (1)I的任何项目都属于CLOSURE()。 (2)若项目A- ,a属于CLOSURE(), B是一个产生式,对于FIR

27、ST( a)中的每个终结符b(即 a 所有可能推导出的开头终结符b,仅当 时b=a)如果B. ,b原来不在CLOSURE(I)中,则把它加进去。 (3)重复执行步骤(2),直到CLOSURE(I)不再增大为止,lo:S-S ,# S一aAd,# S-.bAc ,# Saec ,# S一bed,#,LR(1)项目集和转换函数,【例】下列文法G为 0)S-S 1)S一aAd 2)S-bAc 3)Saec 4)S一bed 5)A-e,假定C=I。,Il,In。,令每个Ik的下标k为分析表的状态,令那个含有S- S,#的Ik的k为分析器的初态。动作ACTION和状态转换GOTO可按如下方法构造: (1

28、)若项目A一a,b属于Ik且GO(Ik,a)=Ij,a为终结符,则置ACTIONk,a为将状态i和符号a移进栈,简记为Si。 (2)若项目A一 ,a属于Ik,则置ACTIONk,a为“用产生式A-归约”,简记为rj,其中,j是产生式的编号,即A-是文法G的第j个产生式。,文法的LR(1)项目集族构造分析表的算法是:,(3)若项目S-S ,#属于Ik,则置ACTIONk,#为接受,简记为acc。 (4)若GO(Ik,A)=Ij,A为非终结符,则置GOTO(Ik,A)=j。 (5)分析表中凡不能用规则(1)(4)填入信息的空白栏均填上出错标志。,文法的LR(1)项目集族构造分析表的算法是:,按上述

29、算法构造的分析表,若不存在多重定义入口(即动作冲突)的情形,则称它是文法G的一张规范的LR(1)分析表。使用这种分析表的分析器叫做一个规范的LR分析器。具有规范的LR(1)分析表的文法称为一个LR(1)文法。,【例】 (0) SS (1)SL=R (2)SR (3)L *R (4)Li (5)RL,LR(1)比SLR(1)能力强,I0:S S,# S L=R,# S R,# L *R,=/# L i,=/# R L,#,i,LR(1)项目集及转换函数,例:给定文法GA: A-(A)|a 1)画出LR(1)项目识别所有活前缀的DFA 2)构造LR(1)分析表,I0:A-.A,# A-.(A),#

30、 A-.a,#,LR(1)项目集和转换函数,每个SLR(1)文法都是LR(1)的,一个SLR(1)文法的规范LR分析器比其SLR(1)分析器的状态要多。 【例】GS: (1)S BB (2)BaB (3)B b,I0:S S,# S BB,# B aB,a/b B b,a/b,LR(1)项目集和转换函数,0 S3 S4 1 2 1 acc 2 S6 S7 5 3 S3 S4 8 4 r3 r3 5 r1 6 S6 S7 9 7 r3 8 r2 r2 9 r2,LR(1)分析表,对输入串ab#用LR(1)分析的过程,1 0 # ab# S3 2 03 #a b# S4 3 034 #ab # 出

31、错,步骤,状态栈,符号栈,输入串,ACTION,GOTO,对输入串abb#用LR(1)分析的过程,步骤,状态栈,符号栈,输入串,ACTION,GOTO,0 # abb# S3 03 #a bb# S4 034 #ab b# r3归约 8 038 #aB b# r2归约 2 02 #B b# S7 027 #Bb # r3 5 025 #BB # r1 1 01 #S # acc,abb#是该文法的一个句子,7.5 LALR(1)分析,如果除去搜索符之后,这两个集合是相同的,我们称两个LR(1)项目集具有相同的心。把所有同心的LR(1)项日集合并为一,将看到一个心就是一个LR(0)项目集,这种L

32、R分析法称为LALR(lookahead LR)方法。 LALR方法的特点: 1)LALR分析表比规范LR分析表要小,能力也差一点,但它却能解决一些SLR所不能解决的情形。 2)对于同一个文法,LALR分析表和LR(0)以及SLR分析表永远具相同数目的状态。,LALR分析表的算法基本思想是: 首先构造LR(1)项目集族,如不存在冲突,就把同心集合并在一起。若合并后的集族不存在归约归约冲突(即不存在同个项目集中像 A一 和B一 这样的产生式具有相同的搜索符),就按这个项目集规范族构造分析表。,LALR分析表的主要步骤如下: (1)构造文法G的LR(1)项目集族C=I0,I1,.In (2)把所有

33、的同心集合并在一起,记C=J0,J1,Jn 含有项目S,一S,#的Jk为分析表的初态。 (3)从C构造ACTION表: A)若项目A一a,b属于Jk且GO(Jk,a)=Jj,a为终结符,则置ACTIONk,a为将状态i和符号a移进栈,简记为Sj。 B)若项目A一 ,a属于Jk,则置ACTIONk,a为“用产生式A-归约”,简记为rj,其中,j是产生式的编号,即A-是文法G的第j个产生式。 C)若项目S-S ,#属于Jk,则置ACTIONk,#为接受,简记为acc。,【例】GS: (1)S BB (2)BaB (3)B b 给出文法的LALR(1)分析表。,I0:S S,# S BB,# B a

34、B,a/b B b,a/b,LR(1)项目集和转换函数,I3:B aB,a/b B aB,a/b B b,a/b,I6:S aB,# B aB,# B b,#,I4:B b,a/b,I7:B b,#,I8:B aB,a/b,I9:B aB,#,LALR在SLR(1)和LR(1)间寻找折衷办法 (状态数目,分析能力) 合并同心集I36 I47 I89,得到如下LALR(1)分析表。,0 S3,6 S4,7 1 2 1 acc 2 S3,6 S4,7 5 3,6 S3,6 S4,7 8,9 4,7 r3 r3 r3 5 r1 8,9 r2 r2 r2,LALR(1)分析表,思考:LR(1)项目集不

35、存在动作冲突,合并同心集后会不会产生新的冲突(移进-归约,归约-归约)?,练习 S S S aBc | bCc | aCd | bBd B e C e,I0: S S, # S aBc, # S bCc, # S aCd, # S bBd, #,结论LR(1)项目集不存在动作冲突,合并同心集后不会产生新的移进-归约冲突,可能产生新的归约-归约冲突。,LALR与LR(1)的不同之处是当输入串有误时,LR(1)能够及时地发现错误,而LALR可能继续执行一些多余的归约动作,但决不会执行新的移进,即LALR能够像LR(1)一样准确地指出出错的地点。就文法的描述能力来说,几种文法的关系: LR(0) SLR(1) LR(1

温馨提示

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

评论

0/150

提交评论