三、语法分析(2)自底向上优先分析& LR分析

自底向上优先分析& LR分析

  • 自底向上分析法基本思想及概述

1、自底向上分析法(移进-归约分析法)的基本思想。

(1)实现时,对输入符号串自左向右进行扫描,并将输入符号逐个移入一个栈中,边移入边分析,

(2)一旦栈顶符号串形成某个句型的句柄时(对应某产生式的右部),就把句柄 (即产生式的右部串)替换成相应产生式的左部非终结符,这称为一步直接归约

(3)重复上述12过程,一直归约到栈中只剩下文法的开始符号时,则为分析成功,即可确认输入串是文法的句子。

2、移入-归约分析技术

使用一个栈来保存归约/扫描移入的文法符号

开始时刻:栈中只包含$,而输入为w$

结束时刻:栈中为S$,而输入为$

在分析过程中,不断移入符号,并在识别到句柄时进行归约

3、“移进-归约”分析过程的操作有四类:

移入 :将下一个输入符号移入到栈顶

归约 :将句柄归约为相应的非终结符号

(注意:句柄总是在栈顶 ;具体操作时弹出句柄,压入被归约到的非终结符号 )

接受 :宣布分析过程成功完成

(注意:栈里是开始符号,外界是结束符)

报错 :发现语法错误,调用错误恢复子程序(涉及到移入-归约的分析表)

4、移入-归约分析中的冲突

(1)无法知道是否该进行归约 (移入-归约冲突):

栈中移入的东西已经足够多,发现了一个看起来像句柄的东西,似乎可以进行归约,但同时,如果移入更多的符号,也能形成一个归约的句柄,出现归约时间点选择上的冲突

(2)不知道按照什么产生式进行归约(归约-归约冲突):

现在栈顶的几个符号,发现可以选择某个产生式进行归约,但是根据栈顶符号选择的不同,有的多一点有的少一点,不止一个产生式可以拿来进行归约

5、每次归约时一定要按当前句型的句柄归约,也即任何时候栈中的符号串和剩余的输入串组成一句型

  • LRK)分析
  1. 概念:

“L”:是指从左至右扫描输入符号串;

“R”:是指构造一个最右推导的逆过程

“k”:是指为了作出分析决定而向右看的输入符号的个数

  1. 基本方法:

LR分析方法根据当前栈中的符号串(通常以状态表示)和向右顺序查看输入串的k(k³0)个符号,就能唯一确定分析器的动作是移进还是归约,以及归约时用哪个产生式进行归约,即能唯一地确定句柄。

  1. 思想:

在规范规约过程中:

1记住已移进和归约出的整个符号串(记住历史)

2根据所用的产生式推测未来可能碰到的符号(展望未来)

4、LR分析器

(1)逻辑结构(一个LR分析器由3个部分组成):

①总控程序或称驱动程序:所有语言的任何LR分析器,总控程序都相同;

②分析栈:包括文法符号栈和相应的状态栈,所有语言的任何LR分析器,分析栈也都相同;

③分析表或分析函数:分动作表(ACTION)和状态转换表(GOTO) ,文法不同分析表不同,文法相同采用不同LR分析器分析表也不同。

  1. 分析器的动作由状态栈的栈顶状态和当前输入符号共同决定。
  2. LR分析器格局

  1. LR分析器行为

5、LR语法分析算法

6、LR语法分析表

(1)结构

两个部分:动作ACTION、转换GOTO

ACTION表项有两个参数:状态i,终结符号a

移入j:j是新状态,把j压入栈 (同时移入a)

归约A → β:把栈顶的β归约为A (并根据GOTO表项压入新状态)

接受:接受输入,完成分析

报错:在输入中发现语法错误

GOTO表项

如果GOTO[Ii, A] = Ij(GOTO函数),那么GOTO[i, A] = j( GOTO表项)

  1. 构造

  1. 例子

三、LR(0)分析

1、LR(0)文法:

即含移入项,有汉归约项目。含有多个规约项目

2、改造生成的项:

(1)含义:在文法产生式右边的任意位置添加一个点

 例如:A → ·XYZ,A → X·YZ,A → XY·Z,A → XYZ· •

(特例:A → ε只对应一个项A → ·)

(2)直观含义 :

项A → α·β表示已经扫描/归约到了α,并期望在接下来的输入中经过扫描/归约得到β,然后把αβ归约到A

(Α和β不仅仅是外界输入串的,也可能是经过移入归约等若干步操作得到的符号)

如果β为空,表示我们可以把α归约为A

(3)项目类型(四种)

1)移进项目:圆点后为终结符项目,

  1. 归约项目:圆点在产生式右部最后的项目,

3)待约项目:

4)接受项目:当归约项目为S`->S.时,表明分析成功,即输入串为该文法的句子,相应状态为接受状态。

2、LR(0)项集规范族的构造

利用LR(0)项来做语法分析当中的自动机模型

对外部输入串识别并进行转态的转移

3、增广文法

G的增广文法成为G’,是在G中增加新开始符号S',并加入产生式S' →S而得到的.

构造自动机模型里面的初始状态

S‘ →S表示刚开始准备进行语法分析

G'和G接受相同的语言,且按照S' →S进行归约实际上就表示已经将输入符号串归约成为开始符号

4、项集闭包

(1)项集闭包 (CLOSURE):

如果I是文法G的一个项集,CLOSURE(I)就是根据下列两条规则从I构造得到的项集 :

①将I中的任何项目加入CLOSURE(I)中

②如果A →α·Bβ在CLOSURE(I)中,而B →γ是一个产生式,且项B →·γ不在CLOSURE(I)中就将该项加入。

(注意:如果点之后的γ也紧跟着一个非终结符,需要继续去找新的产生式)

③不断应用①②规则直到没有新项可加入

(2)物理含义:

 A →α·Bβ,表示希望看到由Bβ推导出的串,那先看到由B推导出的串,因此加上B的各个产生式对应的项

(3)项级闭包构造算法

(4)例题:

5、GOTO函数 

I是一个项集,X是一个文法符号,

则GOTO(I, X)定义为I中所有形如[A →α·Xβ]的项所对应的项[A →αX·β]的集合的闭包。

GOTO函数拿一个项集I作为状态,拿一个文法符号X作为状态的输入,然后看它的目标是

哪个新的项集

6、求LR(0)项集规范族的算法

从初始项集开始,不断计算各种可能的后继,直到生成所有的项集

初始项集是增广文法中新增的产生式S ’→ S

为在构造自动机的时候找到所有可能的状态

四、SLR(1)分析

五、LR(1)分析

六、LALR(1)分析

七、二义性文法在LR分析中的应用

语法分析程序的自动构造工具Y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值