LR分析

263 阅读5分钟

5.4.4 LR(1)分析技术

1.SLR(1)的缺点:对每一个项目,仅依靠FOLLOW集,没有精确指明面临哪些符号时才能归约。

2.LR(1)项目

1)定义:形如[A→α·β,x]称为LR(1)项目。A→α·β是LR(0)项目,x是终结符。终结符x称为该LR(1)项目的搜索符。

2)含义:表示当A→α·β到达归约项目A→αβ·时,只有面临的下一个符号是x时才能进行归约。

3)若一个项目集中有LR(1)项目:[A→α·β,a],[A→α·β,b],[A→α·β,c],则可合并写成[A→α·β,a/b/c]。

4)LR(1)的开始项目:[S’→·S,#]

3.LR(1)项目对活前缀有效:若存在推导S ⇒* δAη ⇒ δαβη,其中ω=δα,x是η的第一个符号,或者η为ε时,x为#,则称LR(1)项目[A→α·β,x]对活前缀ω有效。

4.LR(1)项目闭包集

设有LR(1)项目集I,计算CLOSURE(I)的步骤:

1)将I中的任何项目全加入到CLOSURE(I)中。

2)若项目[A→α·Bβ,x]∈CLOSURE(I),则对任何规则B→ξ,将项目[B→·ξ,First(βx)]加入到CLOSURE(I)中。

3)反复做2),直到CLOSURE(I)中不再加入新的项目为止。

5.LR(1)的GO函数:状态集I与符号X的状态变迁函数GO(I,X)=CLOSURE(J)。其中J是I经过X的后继项目集,即J={[A→αX·β,a]|[A→α·Xβ,a]∈I}。

6.LR(1)分析表的构造步骤

1)若移进项目[A→α·aβ,x]∈Ik且GO(Ik,a)=Ij,其中a是终结符,则令ACTION[k][a]=sj。表示将a移进栈,当前状态变迁到状态j。

2)若归约项目[A→β·,a]∈Ik,并设A→β的规则编号为p,则将ACTION[k][a]rp。

3)若接收项目[S‘→S·,#]∈Ik,则令ACTION[k][#]=accj。表示成功接收。

4)若GO(Ik,A)=Ip,其中A是非终结符,则令GOTO[k][A]=p。表示状态k下若识别出非终结符A,则将状态变为p。

5)分析表中不能用以上规则进行填写的交叉处,全部填写报错标记。

7.LR(1)文法:若LR(1)分析表中没有多重定义项,则该文法是LR(1)的文法。

5.4.5 LALR(1)分析技术

1.概述

1)LALR(1)分析表的结构和大小与SLR(1)相同,比LR(1)的分析表小。

2)LALR(1)的分析能力比SLR(1)强,比LR(1)稍弱。

2.基本思想

将LR(1)项目集规范族中的所有同心项状态集合并。合并时,对应项目的搜索符也合并。原先各自接收有向边,都改为由合并后的项目集接收。原先各自发出的有向边都改为由合并后的项目集发出。

1)合并后的项目集可能出现归-约归冲突。

3.LALR(1)分析表的构造步骤

1)构造文法G的LR(1)项目集规范族。设项目集族为{I0,I1,…,In}。

2)合并所有同心项集。设新的项目集族为{ I0’,I1’,…,Ij’ }。

3)若移进项目[A→α·aβ,x]∈Ik’且GO(Ik’,a)=Ij’,其中a是终结符,则令ACTION[k][a]=sj。表示将a移进栈,且状态变迁到状态j。

4)若归约项目[A→β·,a]∈Ik’,并设A→β的规则编号是p,则令ACTION[k][a]=rp。

5)若接收项目[S‘→S·,#]∈Ik’,则令ACTION[k][#]=acc,表示成功接收。

6)构造合并后的GOTO表。

设Ik’是由It1,It2,…,Itp合并得到的,由于It1,It2,…,Itp是同心项目集,所以GO(It1,X),GO(It2,X) ,…,GO(Itn,X)也是同心项目集且它们合并后的项目集为Im’。

若GO(Ik’,X)=Im’,其中X是非终结符,则令GOTO[k][X]=m,表示状态k下若识别处非终结符X,状态将变为m。

7)分析表中不能用以上规则填写的交叉处,全部填写上报错标记。

4.LALR(1)文法:若LALR(1)分析表中没有多重定义项,则该文法是LALR(1)文法

知识点

一:LR(0),SLR(1),规范LR(1),LALR(1)的关系


****首先LL(1)分析法是自上而下的分析法。LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法。            自上而下:从开始符号出发,根据产生式规则推导给定的句子。用的是推导            自下而上:从给定的句子规约到文法的开始符号。用的是归约

1: SLR(1)与LR(0)的关系:

****SLR(1)与LR(0):简单的LR语法分析技术(即SLR(1)分析技术)的中心思想是根据文法构造出LR(0)自动机。

LR(0):见到First集就移进,见到终态就归约

SLR(1)见到First集就移进,见到终态先看Follow集,与Follow集对应的项目归约,其它报错。

2: LR(1)与LR(0)的关系:

****规范LR(1)语法分析技术的中心思想是根据文法构造出LR(1)自动机 ,而规范LR(1)自动机构造方法和LR(0)自动机的构造方法相同,只是多增加了向前搜索符号。

3:规范LR(1)与LALR(1)的关系:

****LALR(1)是对LR(1)项集族I中具有同心项的项集进行合并得到I',然后根据I’进行分析的方法。

!images2015.cnblogs.com/blog/100947…


二:LL(1),SLR(1),规范LR(1),LALR(1)的判别


1:LL(1)判断规则

判定规则: 龙书上有很明确的规则,龙书上这样说, 对形如 A->a|β 这样的文法,满 足

①FIRST(α)∩ FIRST (β ) =Φ        ②若ε∈ FIRST( α), 要满足 FIRST(β) ∩FOLLOW(A)=Φ        这两个条件的才是 LL(1) 文法。        这里要注意一下条件②, α和 β 是可以互换的,意思就是只要其中有一个 FIRST 集包含ε,那么就要看另一个了。

2:SLR(1)判断规则

****方法一:画出文法的LR(0)自动机,如果没有移进--规约冲突,即shift--reduce 冲突,则该文法是SLR(1)文法

3:LALR(1)和LR(1)的判断规则

****画出文法的LR(1)自动机,如果没有同心项且没有状态冲突,则该文法是LALR(1)文法;如果有同心项且合并同心项有状态冲突,则是LR(1)文法