编译原理课件 语法分析_自下而上__LALR
合集下载
编译原理课件 语法分析_自下而上__LR分析思想_可归前缀和活前缀

识别文法所有活前缀的
DFA
小结
识别文法所有活前缀的DFA LR分析表 LR分析
7.2.1 可归前缀和活前缀
归约 移进 归约 移进 移进 归约 移进 归约 接受
A→b
A→Ab
B→d S→aAcBe
A
B
#abbcde# 的规范归约过程
a b b c d e
定义
• 活前缀: 规范句型的一个前缀, 这种前缀不包含 句柄之后的任何符号. • 可归前缀: 包含句柄的活前缀.
LR 分析思想
规范归约过程中可能出现在栈中的符号串 活前缀
• LR 分析思想: 构造一个DFA, 识别 规范归约过程中出现在栈中的符号串
活前缀
G:S→aAcBe A→b A→Ab B→d [1] [2] [3] [4]
S 0 a
1
*
b
3
A 4 b 5 c e B 6 8 9 d 2 7
步 符号栈 骤 活前缀 1 # 2 #a
3
4 5
剩余 动作 输入串 abbcde# 移进 bbcde# 移进
G: S→ aAcBe A→ b | Ab B→ d 1.栈里的文法符号与剩 余符号串一起构成了 规范句型 2.栈里的文法符号串 • 规范句型的前缀 • 不包含句柄之后的任 何符号 S A源自67 89
10 11
#ab #aA #aAb #aA #aAc #aAcd #aAcB #aAcBe #S
bcde# bcde# cde# cde# de# e# e# # #
程序设计语言与编译原理 自上而下的语法分析课件

S → AB|bc
B → a|c
B → a|c
A → Ad|Sbc|d
A → bcbcPQ|dPQ Q → BbcPQ|ε
直接左递归 间接左递归 P → dP|ε S → AB|bc S → AB|bc
B → a|c
B → a|c
A → SbcP|dP A → ABbcP|bcbcP|dP
P→dP|ε
P γP’ P’αP’|βP’|
P βP’|γP’ P’αP’|
程序设计语言与编译
一般地: 改写为:
A→Aα1|Aα2|…|Aαm|β1|β2|…|βn ( α i ≠ ε , β j 不以A开头)
A→β1P’│ β2P’│. . . │ βnP’ P’→α1P’│α2P’│. .
.│αmP’│ε
xay的推导过程如右图
S
xAy aB ε
程序设计语言与编译
一般方法
产生式: A→αβ1|αβ2|…|αβn|δ
提取公共左因子α
A→αB|δ B→β1|β2|…|βn
程序设计语言与编译 四 . 消除左递归
1.消除直接左递归
P→Pα│β
改写为
P→P ’ P’→αP’│ε
PPα|Pβ|γ 改写为 PPα|β|γ 改写为
(4.3)
虽没有直接左递归,但S、Q、R都是左递归的
S⇒Qc⇒Rbc⇒Sabc
程序设计语言与编译
2.间接左递归的消除
例子:
A → Bc│a B → Ab
P ⇒+ Pα
⇒ A → Abc │a
改为:
A → aP’ P’→ bcP’│ ε
程序设计语言与编译
算法
1. 将文法G的所有非终结符按任一顺序排列,设为A1,…,An
编译原理04自上而下语法分析PPT课件

5
❖ 例4.1:假定有文法(4.1) S→xAy A→**|*
分析输入串x*y(记为α)。
S
S
S
x Ay
x Ay x A y
***来自(a)(b)(c)
6
❖ 由上例看到,自上而下分析法存在许多困难和缺点
文法的左递归性P+ Pα使分析陷入无限循环 回溯的不确定性,要求我们将已经完成工作推倒重来 虚假匹配问题 难于知道出错位置 效率低,代价高,实践价值不大
END
③ 化简上述文法
11
例4.3:考虑文法:SQc|c
Q Rb|b
R Sa|a
消除左递归。
解:将终结符排序为R、Q、S。对于R不存在直接左递归。把R带入 到Q中有关的候选式: Q Sab|ab|b
现在Q同样不含直接左递归,把它带入S的有关候选式:
S Sabc|abc|bc|c 经消除S的直接左递归后我们们得到整个文法
❖ 下图表明了语法分析器在编译程序中的地位
源程序
词法分析器
单词符号 取下一
语法分析器
语法 分析树
单词符号
后续部分
符号表
❖ 按照语法分析树的建立方法,我们可以粗略地把语法分析方 法分为两类:一类是自上而下分析法,另一类为自下而上分 析法
3
例:自顶向下构造最左推导(aabbaa) SaASa A SbA SS ba
执行任务。这个候选就是那个终结首符集含a 的
14
❖ 如何把一个文法改造成任何终结首符集的所有候选首符集两 两不相交呢?其办法是提取公共左因子
❖ 假定关于A 的规则是 A1| 2| … |n| 1| 2|… |m (其中每个不以开头)
那末,可以把这些规则改写成: A A’| 1| 2|… |m A’ 1 | 2 | …| n
❖ 例4.1:假定有文法(4.1) S→xAy A→**|*
分析输入串x*y(记为α)。
S
S
S
x Ay
x Ay x A y
***来自(a)(b)(c)
6
❖ 由上例看到,自上而下分析法存在许多困难和缺点
文法的左递归性P+ Pα使分析陷入无限循环 回溯的不确定性,要求我们将已经完成工作推倒重来 虚假匹配问题 难于知道出错位置 效率低,代价高,实践价值不大
END
③ 化简上述文法
11
例4.3:考虑文法:SQc|c
Q Rb|b
R Sa|a
消除左递归。
解:将终结符排序为R、Q、S。对于R不存在直接左递归。把R带入 到Q中有关的候选式: Q Sab|ab|b
现在Q同样不含直接左递归,把它带入S的有关候选式:
S Sabc|abc|bc|c 经消除S的直接左递归后我们们得到整个文法
❖ 下图表明了语法分析器在编译程序中的地位
源程序
词法分析器
单词符号 取下一
语法分析器
语法 分析树
单词符号
后续部分
符号表
❖ 按照语法分析树的建立方法,我们可以粗略地把语法分析方 法分为两类:一类是自上而下分析法,另一类为自下而上分 析法
3
例:自顶向下构造最左推导(aabbaa) SaASa A SbA SS ba
执行任务。这个候选就是那个终结首符集含a 的
14
❖ 如何把一个文法改造成任何终结首符集的所有候选首符集两 两不相交呢?其办法是提取公共左因子
❖ 假定关于A 的规则是 A1| 2| … |n| 1| 2|… |m (其中每个不以开头)
那末,可以把这些规则改写成: A A’| 1| 2|… |m A’ 1 | 2 | …| n
编译原理完整课件_第4章 语法分析-自上而下分析

2022/3/20
中南大学软件学院 陈志刚
6
第四章 语法分析-自上而下分析
4.2 自上而下分析面临的问题
➢ 顾名思义,自上而下就是从文法的开始符号出 发,向下推导,推出句子。 • 带回溯的分析方法 • 不带回溯的递归子程序(递归下降)分析方 法
➢ 自上而下分析的主旨: 对任意输入串,试图用一切可能的办法,从文 法开始符号(根结)出发,自上而下地为输入 串建立一棵语法树。或者说,为输入串寻找一 个最左推导。
设 ,有P→Pα|β,若α≠>ε,β不以P开头 (否则不可能消除左递归)。
则改写为:
可消除左递归。
2022/3/20
中南大学软件学院 陈志刚
12
第四章 语法分析-自上而下分析
一般地,若 αi≠ε,βj不以P开头, 则可改写为:
从而消除直接左递归。 ■ 例:S→Sabc|Sab|ab ■ 消除直接左递归得:
2022/3/20
中南大学软件学院 陈志刚
13
2、完全消除左递归 分析
第四章 语法分析-自上而下分析
虽不含直接左递归,但
所以含有左递归。
■ 如果文法G不含回路( ),也不含ε产生式,
则下列算法可消除左递归(完全)
①把G的非终结符按任意顺序排列成P1,…,Pn
②for i:=1 to n do
begin for j:=1 to i-1 do
➢ 关键:对一个文法,当给你一串(终结)符号 时,怎样知道它是不是该文法的一个句子呢? 这就要判断,看是否能从文法的开始符号出发 推导出这个字符串。或者,从概念上讲,就是 要建立一棵与输入串相匹配的语法分析树。
2022/3/20
中南大学软件学院 陈志刚
编译原理课件-语法分析-自下而上--LR(0)项目集规范族的构造

(2) E→bB
(3) A→cA
c
a
A •d
I2:Ea•A A •cA
I0: S'•E E •aA
E •bB
A •d E
I1: S' E•
(4) A→d (5) B→cB (6) B→d
b I3: Eb•B B •cB
c
B •d
I8: Bc•B c B •cB
B •d
A I10:Ac A•
d d I6:A d•
b) 对初态集或其它所构造的项目集应用转换函数 GO(I,X) = CLOSURE(J)求出新状态J的项目集
c) 重复b)直到不出现新的项目为止
算法
Procedure itemsets(G')
Begin
初态的项目集
C:= { CLOSURE({S' •S }) }
应用状态转换
Repeat
函数得到新的 项目集
A I4:EaA•
例:构造LR(0) 分析表
B I7:EbB•
d
d I9:B d• B I11:BcB•
(0) S'→E (1) E→aA (2) E→bB (3) A→cA (4) A→d (5) B→cB (6) B→d
LR0 分析表
状
ACTION
GOTO
态 a b c d $ EA B
0 S2 S3
*
G': S'→S
[0]
1
3
S
b
S→aAcBe [1]
a
A
b
A→b
[2]
0
2
4
5
c
A→Ab
[3]
最新编译原理第4章 语法分析 自下而上 LR分析法说课讲解

识别文法句型活前缀的非确定有限自动机(NFA M) 包括:状态、状态转换、初态、终态 ①NFA的状态:是一个LR(0)项目,一个项目指明了在 分析过程的某时刻看到产生式多大一部分 ②构造方法:
a.文法开始符号的形如S’→•S的项目为NFA的唯一 初态;文法的所有LR(0)项目构成的状态都是识别文
法的规范句型的活前缀的终态。活前缀识别态
编译原理第4章 语下而上(自动生成)
法
分
算符优先-最左素短语
析
规范归约-句柄
概
述
自上而下(手动,自动生成)
递归下降-消除左递归 LL(1)分析法- LL(1)分析表
图1
LR分析法是一种自下而上进行规范归 约的语法分析方法, L指自左向右扫描输入串, R指最右推导(规范归约)。
LR分析程序生成器:自动生成LR分 析程序的程序。
LR分析器(分析表)的分类:
1. LR(0)表构造法。这种方法的局限性较大、但它 是建立其它较一般的LR分析法的基础。
2.简单LR(简称SLR)表构造法。虽然一些文法不 能构造SLR分析表,但是,它是一种比较容易实 现又很有使用价值的方法。
3.规范LR表构造法。这种分析表能力最强,能够适 用一大类文法,但实现代价高,或者说,分析表 的体积非常大。
① 文法G
(1)EE+T
(2) ET
(3) TT *F
(4) TF
(5) F(E)
② 分析表(图 )
(6) Fi
③ 分析表中记号的含义
➢sj: ➢rj: ➢acc:
把下一状态 j 和现行输入符号 a 移进栈; 按第 j 个产生式进行归约; 接受;
➢空白格:出错标志,报错
状态
i
0
a.文法开始符号的形如S’→•S的项目为NFA的唯一 初态;文法的所有LR(0)项目构成的状态都是识别文
法的规范句型的活前缀的终态。活前缀识别态
编译原理第4章 语下而上(自动生成)
法
分
算符优先-最左素短语
析
规范归约-句柄
概
述
自上而下(手动,自动生成)
递归下降-消除左递归 LL(1)分析法- LL(1)分析表
图1
LR分析法是一种自下而上进行规范归 约的语法分析方法, L指自左向右扫描输入串, R指最右推导(规范归约)。
LR分析程序生成器:自动生成LR分 析程序的程序。
LR分析器(分析表)的分类:
1. LR(0)表构造法。这种方法的局限性较大、但它 是建立其它较一般的LR分析法的基础。
2.简单LR(简称SLR)表构造法。虽然一些文法不 能构造SLR分析表,但是,它是一种比较容易实 现又很有使用价值的方法。
3.规范LR表构造法。这种分析表能力最强,能够适 用一大类文法,但实现代价高,或者说,分析表 的体积非常大。
① 文法G
(1)EE+T
(2) ET
(3) TT *F
(4) TF
(5) F(E)
② 分析表(图 )
(6) Fi
③ 分析表中记号的含义
➢sj: ➢rj: ➢acc:
把下一状态 j 和现行输入符号 a 移进栈; 按第 j 个产生式进行归约; 接受;
➢空白格:出错标志,报错
状态
i
0
编译原理:第五章-语法分析——自下而上分析
• 约定:
• a、b代表任意终结符; • P、Q、R代表任意非终结符; • ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
• 假定G是一个不含-产生式的算符文法。对于任 何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…
或P→…aQb…的产生式
2. a b 当且仅当G中含有形如P→…aR…的产
栈 输入 #S #
考虑文法G(E): E T | E+T T F | T*F F (E) | I
输入串为i1*i2+i3 ,分析步骤为:
步骤 符号栈
0
#
1
#i1
2
#F
3
#T
4
#T*
输入串 i1*i2+i3# *i2+i3# *i2+i3# *i2+i3# i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
• 由第(4)条规则,有 ‘(’ ‘)’; • 由规则E→E+T和TT*F, 有 + *; • 由(2) T→T*F 和(3) F→P F ,可得* ↑; • 由(1)E→E+T和E E+T,可得+ +; • 由(3)F→PF和F PF,可得↑ ↑。 • 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
编译原理
第五章 语法分析—自下而上分析
• 自下而上分析法(Bottom-up)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
• a、b代表任意终结符; • P、Q、R代表任意非终结符; • ‘…’代表由终结符和非终结符组成的任意序列,包括空字。
• 假定G是一个不含-产生式的算符文法。对于任 何一对终结符a、b,我们说: 1. a b 当且仅当文法G中含有形如P→…ab…
或P→…aQb…的产生式
2. a b 当且仅当G中含有形如P→…aR…的产
栈 输入 #S #
考虑文法G(E): E T | E+T T F | T*F F (E) | I
输入串为i1*i2+i3 ,分析步骤为:
步骤 符号栈
0
#
1
#i1
2
#F
3
#T
4
#T*
输入串 i1*i2+i3# *i2+i3# *i2+i3# *i2+i3# i2+i3#
动作 预备 进 归,用F→i 归,用T→F 进
(1) E→E+T | T (2) T→T*F | F (3) F→P F | P (4) P→(E) | i
• 由第(4)条规则,有 ‘(’ ‘)’; • 由规则E→E+T和TT*F, 有 + *; • 由(2) T→T*F 和(3) F→P F ,可得* ↑; • 由(1)E→E+T和E E+T,可得+ +; • 由(3)F→PF和F PF,可得↑ ↑。 • 由(4)P→(E)和 EE+TT+TT*F+TF*F+T
编译原理
第五章 语法分析—自下而上分析
• 自下而上分析法(Bottom-up)
• 基本思想:
• 从输入串开始,逐步进行“归约”,直到文法的开始符 号。所谓归约,是指根据文法的产生式规则,把产 生式的右部替换成左部符号。
编译原理第三版 第五章 自下而上语法分析
3. 归 (2) 4. 进 b 5. 归 (3) 6. 进 c 7. 进 d 8. 归 (4) 9. 进 e 10. 归 (1)
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
a
b a
A a
b A A a a
c A a
d c A a
e B B c c A A a a
S
(2) 分析树: 用树表示“移进 - 归约 ”过程
A A B S
b
A
b
b
d
a
A
直接短语
T i F
句柄
T
T * F F ( E ) i
E + T T F
规范归约
设α是文法G的一个句子, 若序列αn, αn-1, …, α0,满足: (1)αn = α; (2) α0 = S; (3)对任 意i , 0< i ≤n , αi-1 是从αi 将句柄替换成 相应产生左部符号而得到的;则称该序列是一个 规范归约。
1、归约与分析树
(1)移进-归约法: 使用符号栈, 把输入符号逐一移 进栈, 栈顶出现某个产生式右部时归约为左部。
例 :给定文法 G: (1) S→aAcBe (2) A→b (3) A→Ab (4) B→d 输入串 abbcde是否为句子? 归约过程如下: 步骤: 1. 2. 进 进 动作: a b
例:文法G: G[E]: E→E+E|E*E |(E) |i (1) E→E+T│T (2) T→T*F│F (3) F→P↑F│P (4) P→(E)│i 算符优先关系为: 由(4): P→(E) ∴( =) 由(1) (2): E→E+T, T => T*F ∴+<* 由(2) (3): T→T*F, F => P↑F ∴ *<↑ 由(1): E→E+T, E => E+T ∴ +>+ 由(3): F→P↑F, F=> P↑F ∴ ↑ <↑ 由(4): P→(E), E => E+T ∴ ( < +, +>) ... ∴ G为算符优先文法(优先关系表如表5.1所示,P90) #看作终结符号
编译原理 第五章 语法分析-自下而上分析
5.2.2 算符优先分析算法
• 素短语:
–是一个短语,它至少含有一个终结符,并且,除 它自身之外不再含任何更小的素短语。
• 最左素短语:
–最左边的素短语是最左素短语。
• 例子:
– 对文法(5.3)p*p和i是句型p*p+i的素短语,而p*p+i 本身也是素短语。
பைடு நூலகம்
• 算符优先文法:
算符优先文法,我们把句型(括在两个#之间) 的一般形式写成: #N1a1N2a2…NnanNn+1# 其中,每个ai都是终结符,Ni是可有可无的非终结 符。 文法G的任何短语是满足如下条件的最左子串 Njaj…NiaiNi+1 aj-1⋖ aj aj ≖ aj+1 , …,aj-1 ≖ ai ai ⋗ ai+1
– 对于每个终结符a(包括#)令其对应两个符号fa 和ga ,画一张以fa 和ga 所有符号为结点的方向图, 如 果 a⋗≖b, 那 么 , 就 从 fa 画 一 箭 弧 至 gb ; 如 果 a ⋖≖b,就画一条从gb到fa的箭弧。 – 对每个结点都赋予一个数,此数等于从该结点能 到达结点(包括出发结点自身在内)的个数。赋 给fa的数作为f(a),赋给gb的数作为g(b)。 –检查所构造出来的函数f和g,看它们 同原来的关 系表是否有矛盾。如果没有矛盾,则f和g就是所 要的优先函数。如果有矛盾,那么,就不存在优 先函数。
• 例子:假定文法G
S→aAcBe A→b A→Ab B→d 输入串abbcde归约到S过程。
图5.1 规约中符号栈的变迁
步骤 动作
1 进 a
2 进 b
3 归 (2)
4 进 b
5 归 (3)
6 进 c
7 进 d d
编译原理第七章_自下而上的LR(K)分析方法
一、根据形式定义求出活前缀的正规表达式,然 后由此正规表达式构造NFA再确定化为DFA(不 实用,略)
二、求出文法的所有项目,按一定规则构造识别 活前缀的NFA再确定化为DFA(了解)
三、使用闭包函数(CLOSURE)和转向函数 (GOTO(I,X))构造文法G’的LR(0)的项目集规范 族,再由转换函数建立状态之间的连接关系得 到识别活前缀的DFA(掌握)
编译原理 Compilers Principles 第7章9
移进-归约中的问题分析
3) #ab 4) #aA 5) #aAb 6) #aA
bcde# bcde# cde# cde#
归约(A→b) 移进
归约(A→Ab) 移进
分析:已分析过的部分在栈中的前缀不同,而且移 进和归约后栈中的状态会发生变化
S aA cBe
Ab d b
0 S 1*
1 * 句子识别态
2a 3b 4
i
5a 6 A 7 b 8
9 a 10 A 11 c 12 d 13
14 a 15 A 16 c 17 B 18 e 10
构造识别活前缀的有限自动机 例子
句柄识别态
X
0S 2a 5a 9a
14 a
*
1
3b 4 6 A7b 10 A 11 c 15 A 16 c
1) # 2) #a 3) #ab
abbcde# bbcde# bcde#
动作
移进 移进 归约(A→b)
状态栈
0 02 024
ACTION
S2 S4 r2
GOTO
3
对输入串abbcde#的LR分析过程
S
1*
b
4
0 a 2 A 3 b 6
二、求出文法的所有项目,按一定规则构造识别 活前缀的NFA再确定化为DFA(了解)
三、使用闭包函数(CLOSURE)和转向函数 (GOTO(I,X))构造文法G’的LR(0)的项目集规范 族,再由转换函数建立状态之间的连接关系得 到识别活前缀的DFA(掌握)
编译原理 Compilers Principles 第7章9
移进-归约中的问题分析
3) #ab 4) #aA 5) #aAb 6) #aA
bcde# bcde# cde# cde#
归约(A→b) 移进
归约(A→Ab) 移进
分析:已分析过的部分在栈中的前缀不同,而且移 进和归约后栈中的状态会发生变化
S aA cBe
Ab d b
0 S 1*
1 * 句子识别态
2a 3b 4
i
5a 6 A 7 b 8
9 a 10 A 11 c 12 d 13
14 a 15 A 16 c 17 B 18 e 10
构造识别活前缀的有限自动机 例子
句柄识别态
X
0S 2a 5a 9a
14 a
*
1
3b 4 6 A7b 10 A 11 c 15 A 16 c
1) # 2) #a 3) #ab
abbcde# bbcde# bcde#
动作
移进 移进 归约(A→b)
状态栈
0 02 024
ACTION
S2 S4 r2
GOTO
3
对输入串abbcde#的LR分析过程
S
1*
b
4
0 a 2 A 3 b 6
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
动作
移进 S5 归约 r4 Li
移进 S6 移进 S4 移进 S5 归约 r4 归约 r5 归约 r3 归约 r5 归约 r1 接受
Li RL L*R RL S L=R
i = * i # 的LR分析过程
步骤 1 0 状态 符号栈 # 剩余输入串 动作 i=*i# 移进 S5 =*i# 归约 r4 Li =*i# 移进 S6 *i# 移进 S11 i# 移进 S12 # 归约 r4 Li # 归约 r5 RL # 归约 r3 L*R # 归约 r5 RL # 归约 r1 S L=R # 接受
结论
• 对于错误的输入串,LALR会比LR执行一些多余 归约,但不会比LR移进更多的符号. • 对于正确的输入串,LR和LALR分析器始终如影 相随
例
G[S']: (0) S' S (1) S L=R (2) S R (3) L *R (4) L i (5) R L • 写出此文法的LALR分析表 • 并根据文法的LALR分析表分析输入串 “ i=*i= # ”
i = * i # 的LALR分析过程
步骤 1 2 3 4 5 6 7 8 9 10 11 状态
0 05
02 026 0264 02645 02648 02647 0268 0269 01
符号栈 # #i #L #L= #L=* #L=*i #L=*L #L=*R #L= L #L= R #S
剩余输入串 i=*i# =*i# =*i# *i# i# # # # # # #
1 2
LALR分析表
ACTION GOTO
2 3 4 5 6 7 8 9
r1
s7 r3
r2
r2
r2
是 5 否 2 会 36 8 产 47 生 5 冲 89 9 突 ?
0 1
a b s36 s3 s47 s4
s36 s6 s36 s47 s7 s47
#
acc
S 1
B 2 5 89
r3
r3
r3 r1
r2
LALR分析表
ACTION a b # s3 s47 s4 s36 acc s36 s6 s47 s7 s36 s47 r3 r3 r2 r2 r3 r1 r2 5 89 GOTO S B 1 2
36 47 5
89
9
r2
(0)S' S (1)S BB (2)B aB (3)B b
#aab#的分 析过程见黑板
I6:B →a· B, # B →· aB, # B →· b, #
I36: B→a· B , a/b/# B→· aB , a/b/# B→· b , a/b/#
LR分析表
状 态 0 1 ACTION
a s3 s6 s3 r3
s6
b s4 s7 s4 r3
#
acc
合 并 GOTO 同 状 心 态 S B 集
I0初态 S' •S, # S•L=R, # S•R, # L•*R, =/# L •i, =/# R•L, #
I3: Go(I0 , R) SR •, # I4: Go(I0 , *) L* • R, =/# R • L, =/# L • *R, =/# L • i•, =/# I5: Go(I0 , i) L i •, =/#
2 3 4 5 6 7 8 9 10 11
05 02 026 026 11 026 11 12 026 11 10 026 11 13 026 10 0269 01
#i #L #L= #L=* #L=*i #L=*L #L=*R #L= L #L= R #S
LR分析小结
• • • • • • • • 规范 归约过程 LR分析过程是______ 活前缀 符号栈中的符号串被定义为__________ 分析过程中依据________________________ 栈顶状态和现行输入符号 查分析表 识别活前缀的 为构造LR分析表,可先构造________________DFA 分析表的构造 LR分析器的关键是_______________ 逐个增强 LR(0) 、SLR 、 LALR 、 LR 功能_________ 真包含 关系 四种LR类型的文法是________ LR类型文法一定是非二义的吗? 是
i = * i = # 的LR分析过程
步骤 1 0 2 3 4 5 6 05 02 026 026 11 026 11 12 状态 符号栈 # #i #L #L= #L=* #L=*i 剩余输入串 动作 i=*i=# 移进 S5 =*i=# 归约 r4 Li =*i=# 移进 S6 *i=# 移进 S11 i=# 移进 S12 =# 报错
定义
• LALR文法 - LALR分析表不含多重定义 • LALR分析表和LR(0)以及SLR分析表永远具有相 同数目的状态。
例: 写出输入串#aab#的LR分析过程和LALR分析过程
(0)S' S (1)S BB (2)B aB (3)B b
分析表
LR分析表
状 态 0 1 2 3 4 5 6 7 8 ACTION a b # s3 s4 acc s6 s3 r3 s6 r2 s7 s4 r3 r1 s7 r3 r2 9 5 8 GOTO S B 1 2 状 态 0 1 2
5
6 7 8 9 10 11 12
r4
S12 S11 r3 r5
r4
10 r3 r5 r1 r5 S12 S11 r4 10 13
5
6 7
r4
S5 S4 r3
r4
8 r3
8
9
r5
r5
r1
LALR分析表
13
r3
i = * i = # 的LALR分析过程
步骤 1 2 3 4 5 6 7 8 9 10 0 05 02 026 0264 02645 02648 02647 0268 0269 状态 符号栈 # #i #L #L= #L=* #L=*i #L=*L #L=*R #L= L #L= R 剩余输入串 动作 i=*i=# 移进 S5 =*i=# 归约 r4 Li =*i=# 移进 S6 *i=# 移进 S4 i=# 移进 S5 =# 归约 r4 Li =# 归约 r5 R L =# 归约 r3 L *R =# 归约 r5 R L =# 报错
B
I :B →b·, a/b 4 b
I :B →a·B, a/b 3 B →·aB, a/b B →·b, a/b B
b
I :B →aB·, a/b 8
I :B →aB·, # 9
LALR方法 : 在LR(1)项目集规范族基础上, 合并同心集
合并同心集
I4:B →b· , a/b I7:B →b· , # I8:B →aB· , a/b I9:B →aB· , # I3:B →a· B, a/b B →· aB, a/b B →· b, a/b I47: B→b·, a/b/# I89: B→aB·, a/b/#
LALR(1)分析
• 对 LR(1) 来说, 存在着某些状态, 这些状态除向前搜 索符不同外, 其核心部分都是相同的. • 同心集: 两个LR(1)项目集具有相同的心, 即除去搜索符 之后, 这两个集合是相同的。
该文法产生的是语言 a*ba*b
a
I :S′ →·S, 0 S →·BB, B →·aB, B →·b,
ACTION GOTO 状 态 = i * # S L R
0 S5 S6 S5 S4 S4 1 2 3
GOTO 状 ACTION 态 = i * # S L R
0 S5 S4 1 2 3
1
acc
r5 r2 8 7 9
1
2 3 4 S5 S4 S6
ቤተ መጻሕፍቲ ባይዱ
acc
r5 r2 8 7 9
原 LR 分 析 表
2 3 4
Go(I11 , i) 同 I12
LR(1)项目集规范族
合并同心集
合并 I4与I11 I4,11: L* • R, =/# R • L, =/# L • *R, =/# L • i, =/# 合并 I5与I12 I5,12: L i •, =/# 合并 I7与I13 I7,13: L* R •, =/# 合并 I8与I10 I8,10: R L •, =/#
r2
r2
LALR的能力弱于LR 合并同心项目集可能会引起冲突 同心集的合并不会引起新的 移进归约冲突 (课下自行证明) 同心集的合并有可能产生新的 归约归约冲突 G : (0) S S (1) S aAd (2) S bBd (3) S aBe (4) S bAe (5) A c (6) B c 构造LR(1)项目集规范族 (见黑板) 对ac有效的项目集 合并同心集 A c ·, d 产生归约-归约冲突 B c ·, e 对bc有效的项目集 A c ·, e B c ·, d A c ·, d/e B c ·, d/e 该文法是LR(1)文法 但不是LALR(1)文法
I1: Go(I0 , S) S S • , #
I6: Go(I2 , =) SL= • R, # I2: Go(I0 , L) R • L, # SL • =R, # L • *R, # RL •, # L • i•, #
I7: Go(I4 , R) I11: Go(I6 , *) L* R •, =/# L* • R, # R • L, # I8: Go(I4 , L) L • *R, # R L •, =/# L • i•, # Go(I4 , *) I12: Go(I6 , i) 同 I4 L i •, # Go(I4 , i) 同 I5 I13: Go(I11 , R) L* R •, # I9: Go(I6 , R) Go(I11 , L) SL=R•, # 同 I10 I10: Go(I6 , L) Go(I11 , *) R L •, # 同 I11