编译原理 4.2自底向上的语法分析(3)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2020/6/18
第17页/共44页
若ACTION[Sm, ai ] =“移进”,则表明句柄尚未在 栈顶部形成,正期待继续移进输入符号以形成句柄,
故将当前的输入符号ai推入栈中,即:
S0S1S2 …Sm # X1X2 …Xmai
ai+1 ai+2 …an#
然后,以符号对(Sm, ai)查状态转移表,设相应的表元 素GOTO [Sm, ai ] = Sm+1 ,再将此新的状态Sm+1(即 要转移到的下一状态)推入栈中,则有如下格局:
编译原理
北京交通大学海滨学院
4.2 自底向上的语法分析
概述 简单优先分析法 算符优先分析法 优先函数 LR分析法
2020/6/18
第2页/共44页
4.2.5 LR分析法
解决所有无二义性的上下文无关文法 严格的最左归约:句柄
LR(K)
2020/6/18
向前看k个符号就能确定用哪个产生式归约 产生一个最右推导 自左向右扫描输入符号
ai ai+1 ai+2 …an#
第19页/共44页
若ACTION[Sm, ai ] =“接受”,则表明当前的输 入串已被成功地分析完毕,应中止分析器的工作;
若ACTION[Sm, ai ] =ERROR,则表明当前的输 入串中有语法错误,此时应调用出错处理程序进行 处理;
3、重复步骤2的工作,直到在分析的某一步,栈顶出 现“接受状态”为止。此时,分析栈的最终格局应为:
C 称为文法的LR(0)有效项目集规范族
2020/6/18
第28页/共44页
(1)三种操作: ▪ 开始操作:S为开始符号, S→δ
则 S→·δ∈C0
▪ 闭包操作:closure(Ci) Ci的闭包
① Ci 的任何项目均属于closure(Ci) ②若A → α·X β且X∈Vn属于closure(Ci)
2020/6/18
第31页/共44页
例:
G[S]: 1.S→A 2.S→B 3.A→aAb 4.A→c 5.B→aBb 6.B→d
2020/6/18
①拓广文法,保证唯一初态
1. S′→·S 2. S′→S· 3. S→·A 4. S→A· 5. A→·aAb 6. A→a·Ab 7. A→aA·b 8. A→aAb· 9. A→·c
2020/6/18
G[S]:S →E#[1] E→E+T[2]∣E-T[3]∣T[4]
符号栈T →i[5]∣(E)输[6] 入串
产生式
#E-(E+ #E-(E+i #E-(E+T #E-(E #E-(E) #E-T #E #E# #S
i)#
)# T→i
)#
E→E+T
)#
# T →(E)
# E→E-T
1)项目:给定文法的一个项目是一个在右部符 号串中标有一圆点的产生式 形式:A→α 1 ·α2
A→α 1 α2 为一个产生式
表示:已从输入串中看到了能由α 1推导
出的符号串,希望进一步看到由α2 推导出的符号串
2020/6/18
第24页/共44页
例:E →E+T 项目:E → ·E+T E → E ·+T
4
83
4
93
4
67
11
第16页/共44页
(3)分析过程:
1、开始:符号栈:# 状态栈:S0
2、假设分析的某一步,分析栈和余留输入串处于如 下格局:
S0S1S2 …Sm # X1X2…Xm
aiai+1 …an#
则用当前栈顶的状态Sm及正扫视的输入符号ai组成符 号对(Sm, ai)去查分析动作表,并根据分析表元素 ACTION[Sm, ai ]的指示采取相应的分析动作,每 一分析表元素所指示的仅能是下列四种动作之一:
S0Sz
#
#Z
2020/6/18
第20页/共44页
状态栈
⑴0 ⑵03 ⑶02 ⑷01 ⑸017 ⑹0174 ⑺01743 ⑻01742 ⑼017410
2020/6/18
G[S]:S →E#[1] E→E+T[2]∣E-T[3]∣T[4]
符号栈 T →i[5]∣(E输)[6]入串
产生式
# #i #T #E #E#E-( #E-(i #E-(T #E-(E
第3页/共44页
基本概念 LR(0)分析器(重点介绍):分析能力最低,是构
造其他LR分析器的基础; SLR(1)分析器:比LR(0)分析器的能力稍强一些; LR(1)分析器:分析能力最强,但是工作量以及要
求的存储空间庞大;
LALR(1)分析器:分析能力介于SLR(1)和LR(1)之 间,但是分析表的规模要小得多(不作介绍);
x
Ci
Cj
2020/6/18
第30页/共44页
(2) 算法(求文法的LR(0)有效项目集规范族C)
①拓广文法,保证唯一初态; ②生成C0={S→ ·δ} ∪{S→ ·δ的闭包操作} ③重复以下过程,直至C不再增大为止:
Ci读操作,生成Cj1,Cj2,…….Cjn Cj1,Cj2,…….Cjn闭包操作 (若其中某项目集已经存在就略去)
2020/6/18
S0S1S2 …Sm Sm+1 # X1X2 …Xmai
ai+1 ai+2 …an#
第18页/共44页
若ACTION[Sm, ai ] =rj,这表明栈顶部的符号串 Xm-r+1Xm-r+2 …Xm已是当前句型的句柄。按文法的第j 个产生式A→ Xm-r+1Xm-r+2 …Xm进行归约,也就是将 分析栈从顶向下的r个符号退出,然后再将文法符号 A推入栈中,此时分析栈的格局为:
9 r3 r3 r3 r3 r3
10
S6 S7
S11
11 r6 r6 r6 r6 r6
2020/6/18
#S
S5 r4 r5 acc
r2 r3 r6
G[S]:S →E#[1] E→E+T[2]∣E-T[3]∣T[4]
GOTO T →i[5]∣(E)[6]
E T i + -( ) #
123
4
67
5
10 2 3
S0S1S2 …Sm-r # X1X2 …Xm-rA
ai ai+1 ai+2 …an#
然后,以符号对(Sm-r, A)查状态转移表,设相应的表 元素GOTO [Sm-r, A] = Sk ,再将此新的状态Sk推入 栈中,则有如下格局:
2020/6/18
S0S1S2 …Sm-r Sk # X1X2 …Xm-rA
E → E + ·T
2020/6/18
第26页/共44页
2)有效项目:
A→α 1·α2是项目,对于某一个活前缀 φ α 1
存在S=*> φAt=> φ α 1 α2t
t ∈Vt*
则称A→α 1·α2是活前缀φ α 1的有效项目。
若归约项目A →β1·对活前缀αβ 1是有效的, 应把β1归约为A;
第8页/共44页
例:G[E]:E→E+T∣E-T∣T
T →i∣(E) 拓广文法:G’:S →E#
E→E+T∣E-T∣T T →i∣(E)
句型:E-(i+i)# 有E-(T+i)#=>E-(i+i)#
可归前缀:E-(i [p]
活前缀:E-(i E-(
E- E
2020/6/18
第9页/共44页
文法存在递归 →句型是无穷的
若移入或待约项目A →β1·β2对活前缀αβ 1是 有效的,则句柄尚未形成,下一步动作是移
进或待约;
2020/6/18
第27页/共44页
3)LR(0)分析器的构造
DFA M的一个状态 i ---该状态识别出的所有活前缀的有效项目集 Ci
DFA M 的状态集Q Q={ C0 , C1 , C2, …… , Cn }=C
2020/6/18
第4页/共44页
1、可归前缀和活前缀
例:G[S]:S→aBEb B→BaE∣c
E→e 将它们编上号,并将序号 人为带入句型分析中:
S→aBEb[1] B→BaE[2] B→c[3] E→e[4]
2020/6/18
给出句子 acaeeb 的规范推导过程
第5页/共44页
规范推导 逆过程为规范归约
则X → ·λ 属于closure(Ci) 重复,直至 closure(Ci)不再增大. ③ Ci=closure(Ci)
2020/6/18
第29页/共44页
▪ 读操作: Go(Ci , x ) x∈V
Go(Ci , x ) = Cj 称A → αx·β为 A →
其中:
α ·x β的后继项目
Cj={A → αx·β∣ A → α ·x β∈ Ci}
若αi= φBt,且B→ β, t∈Vt*
问题?
则存在最右推导φBt => φβt (β为句柄)
令φβ=u1u2…….ur ,则u1u2…….ui (1<=i<=r)
为句型φβt 的活前缀 最长的活前缀就是可归前缀
u1 , u1 u2 , u1 u2 u3 ,…
u1u2…….ur= φβ
2020/6/18
i-(i+i)# -(i+i)# -(i+i)# -(i+i)# (i+i)#
i+i)# +i)# +i)# +i)#
T→i E→T
T→i E→T
第21页/共44页
状态栈
⑽0174106 ⑾01741063 ⑿01741068 ⒀017410 ⒁01741011 ⒂0179 ⒃01 ⒄015 ⒅0
活前缀(可归前缀)是句型的一部分 →活前缀(可归前缀)是无穷的
如何寻找一个无穷的东西?
与一个文法相联系的所有最右推导(规范归 约)的可归前缀能够为有限自动机所识别。
2020/6/18
第10页/共44页
2、LR(0)分析法
G[S]:S →E#[1] E→E+T[2]∣E-T[3]∣T[4] T →i[5]∣(E)[6]
E →E+ ·T E →E+T ·
特别的:A →ε对应的LR(0)项目为A → ·
2020/6/18
第25页/共44页
归约项目:圆点在最后的项目
E →E+T · 接受项目:开始符号的归约项目
S→E# · 移进项目:形如A → α·a β项目 a∈Vt
E → E ·+T 待约项目:形如A → α·B β项目 B∈Vn
#
S→E#
第22页/共44页
优先分析法与LR分析法比较:
相同点:通过分析栈的栈顶项和当前输入符号 找当前句型句柄的尾;
不同点:优先分析法为找句柄的头必须对栈进 行搜索,而LR分析法只根据栈顶状态和当前 输入符号就可判断;
2020/6/18
第23页/共44页
(4) LR(0)分析器的构造——DFA构造
识别活前缀和可归前缀的DFA
第12页/共44页
(1)LR分析器: 总控程序
DFA M (状态转换矩阵 , LR(0)分析表 )
0状态 开始状态 读状态 非终态,识别到活前缀 归约状态 终态,识别到可归前缀
对偶栈
符号栈 放字汇表中的字符
2020/6/18
状态栈 扫描V上的字符后进入的状态(DFA)
第13页/共44页
10. A→c· 11. S→·B 12. S→B· 13. B→·aBb 14. B→a·Bb 15. B→aB·b 16. B→aBb· 17. B→·d 18. B→d·
LR分析器
输入串 a1 a2 … … ..
状态栈
符号栈
总控程序
an #
LR 分析表
0# 对偶栈
2020/6/18
第14页/共44页
(2) LR(0)分析表:将DFA的信息放入两张表中
ACTION[S,a]函数(分析动作表):
状态S面临输入符号a时应采取的动作
S :移进 acc:接受
Rj:归约 空白:出错
其识别可归前缀的有限自动机如图 DFA M 终态:识别到可归前缀 非终态:识别到活前缀
2020/6/18
第11页/共44页
G[S]:S →E#[1]
5
#
+
T
6
1
-i
E
i
3
7
i
0
T
i(
2
(
(

E→E+T[2]∣E-T[3]∣T[4] T →i[5]∣(E)[6]
8
T +
9
T
(4
E
)
10
11
2020/6/18
GOTO[S,X]函数(状态转换表):
状态S面临文法符号X(x∈V)时下一状态
2020/6/18
第15页/共44页
状 ACTION 态i + - ( )
0 S3
S4
1
S6 S7
2 r4 r4 r4 r4 r4
3 r5 r5 r5 r5 r5
4 S3
S4
5
6 S3
S4
7 S3
S4
8 r2 r2 r2 r2 r2
2020/6/18
可归前缀:总包含当前句型的句柄
第6页/共44页
(1)可归前缀:
①形式为βω [p] 其中:β=V*, p为规则序号, ω为第p条规则右部
2020/6/18
②可归前缀中应包含的信息 当前的句柄 用哪条产生式进行归约பைடு நூலகம்
第7页/共44页
(2)活前缀:
对于最右推导 S=> α1=> α 2=>……=> α m=x
S=>aBEb[1] =>aBe[4]b[1] =>aBaE[2]e[4]b[1] =>aBae[4][2]e[4]b[1] =>ac[3]ae[4][2] e[4]b[1]
S→aBEb[1] B→BaE[2] B→c[3] E→e[4]
句柄:aBEb 句柄:e 句柄:BaE 句柄:e 句柄:c
aBEb[1]、 aBe[4]、aBaE[2]、aBae[4]、ac[3]
相关文档
最新文档