编译原理Chapter7 考试重点章节

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7
山东交通学院
《编译原理》
规范推导/规范句型/规范归约
最右推导:在推导的任何一步αβ,其中α和β是句型, 都是对α中的最右非终结符进行替换。 最右推导被称为规范推导。由规范推导所得的句型称为规范 句型 例:G[S]: S→E E→E+T | T T→(E) | i SE T (E) (E+T) (E+i) (T+i) (i+i) 规范归约: 假定α是G的一个句子,称序列αn、αn-1 …、α0是α的一个 规范归约,如果该序列满足: 1、 αn = α 2、 α0为文法的开始符号 3、对任何j,0<j<=n, αj-1是从αj经把句柄替换为相应产生 式的左部而得到的
杨海 yanghai_sdjtu@
23
山东交通学院
《编译原理》
构造识别活前缀的FA(续)
(2) LR(0) 项目集的闭包:即FA中的状态 若当前处于A –> X•YZ刻画的情况,期望移进First(Y) 中的某些符号,假如有产生式Y –> u 。那么Y –> .u, 这个项目也是刻划期望移进First(Y)中的某些符号的 情况。 A –> X•YZ Y –> •u 这两个项目对应移进归约分析的同一个状态,这两个 项目构成一个项目集, 对应每个项目集,分析表将有 一个状态。
4
山东交通学院
《编译原理》
3、规约的一个特殊情况:栈中的全部内容w归约 为开始符号S (即施用 S –> w),且没有余留输 入了,意味着已成功分析了整个输入串。
4、移进归约分析中还会出现一种情况,就是出 错,比如当前的token不能构成一个合法句子的 一部分,例如上面的文法,试分析i+)时就会发生 错误。
杨海 yanghai_sdjtu@
15
山东交通学院
《编译原理》
构造识别活前缀的FA(I) 基本思想:LR分析使用的信息之一是句 柄左部的内容(LC)。 定义(非终结符的左文) * LC(A)={ | S’A, V*, Vt*}, R 对拓广文法的开始符号S’:
LC(S’)={}
杨海
分析动作 移进 移进 归约: T –> i 归约: E –> T 移进 移进 归约: T –> i 归约: E –> E+T 移进 归约: T –> (E) 归约: E –> T 归约: S –> E
6
yanghai_sdjtu@
山东交通学院
《编译原理》
8 (E + T
9 (E
)# 归约:E –> E + T 为什么对E+T进行规约? )#
杨海 yanghai_sdjtu@
8
山东交通学院
《编译原理》
7.1 LR分析
LR分析方法是当前最被广泛应用 的无回溯的“移进- 归约”方法。
LR(k)分析技术:这里的“L”是 指从左至右扫描输入符号串,“R”是指 它的归约过程是最右推导的逆过程,即 规范归约,“k”是指为了作出分析决定 而向前看的输入符号的个数。
杨海
yanghai_sdjtu@
5
山东交通学院
《编译原理》
1 2 3 4 5 6 7 8 9 10 11 12 13
符号栈 # #( #(i #(T #(E #(E + #(E + i #(E + T #(E #(E) #T #E #S
剩余的符号串 (i + i)# i + i)# + i)# + i)# + i)# i)# )# )# )# # # # #
杨海 yanghai_sdjtu@
21
山东交通学院
《编译原理》
LR(0)项目分类:
根据圆点所在的位置和圆点后是终结符还是非终结符 或为空把项目分为以下几种: 移进项目,形如 A → • a, a是终结符, ,V* 以下同 待约项目,形如 A → • B, B是非终结符 归约项目,形如 A → • 接受项目,形如 S’ →S •, S’ →S 是拓广文法得到 新产生式 规定:A→ε的LR(0)项目只有A→ • 是归约项目
山东交通学院
《编译原理》
例:G[S]: (0) S’S (1) S a A c B e (2)A b (3) A Ab (4)B d
定义 (产生式的LR(0)左文) LR(0)LC(A)={| =且S’A , Vt*} R *
R
有推论:LR(0)LC(A )=LC(A).{} 则有: LR(0)LC(S’S)=S LR(0)(LC(SaAcBe)=aAcBe LR(0)LC(Ab)=ab LR(0)LC(AAb)=aAb LR(0)LC(Bd)=aAcd ( =VnVt)上的正规式
杨海
用代入法求解得: [S’]= [S]= [A]=a+[A] [B]=aAc 令 ={[S’],[S],[A], [B], a,A,c} 则方程两边都是上的正规式 而[A]=a+[A] 即为 [A]=a | [A] 由正规式所表示的正规 集 得: [A]=a
17
yanghai_sdjtu@
杨海 yanghai_sdjtu@
9
山东交通学院
《编译原理》
LR分析器模型
栈 S1 Xm 总控程序 output Input#
… … S1 X1
S0 #
状态 文法符号
ACTION GOTO
产生式表
LR分析表
杨海
yanghai_sdjtu@
10
山东交通学院
《编译原理》
LR分析程序
若使用了E–>T,在栈中形成的(E+E不是规范句型的 活前缀(viable prefixes),(E+E不能和任何产生式的 右端匹配 (E+E)不是规范句型活前缀是规范句型(右句型) 的前缀,但不超过句柄 注意:移进归约分析的栈中出现的内容加上余留输入 构成规范句型
杨海 yanghai_sdjtu@
2
山东交通学院
《编译原理》
最常用和最有效的模型——移进-归约方法
符号栈
Input#
总控程序 …
output
状态
文法符号
分析表
产 生 式 表
3
杨海
yanghai_sdjtu@
山东交通学院
《编译原理》
例: G[S] S –> E E –> T | E + T
T –> i | (E)
1、规约: 如能找到一产生式 A –> w 且栈中的内容是 qw (q 可能为空), 则可以将其归约为 qA。即倒过来 用这个产生式。如上例,若栈中内容是 (i ,我们使用 产生式 T–> i柄把栈中内容归约为(T
LR(0)分析法:能力最弱,理论上最重要 活前缀 识别活前缀的FA如何构造 (LR(0)项目集规范族的构造) LR(0)分析表的构造 LR(0)分析法的实现
杨海
yanghai_sdjtu@
12
山东交通学院
《编译原理》
文法G[S]: (1) S → aAcBe (2) A → b (3) A → Ab (4) B → d
特征
规范的归约过程 符号栈中的符号是规范句型的前缀,且不含 句柄以后的任何符号(活前缀) 分析决策依据―栈顶状态和现行输入符号 (识别活前缀的 DFA)
四种技术
LR(0) SLR(1) LR(1) LALR(1)
杨海
yanghai_sdjtu@
11
山东交通学院
《编译原理》
7.2 LR(0) 分析
其中S’是对原文法扩充新产生式S’S增加的 非终结符。为使S’不出现在任何产生式的右部 如:G =({S},{a},{SSa,Sa},S) 扩充文法有: G’=({S’},{a},{S’S, SSa,Sa},S’)
杨海 yanghai_sdjtu@
14
山东交通学院
《编译原理》
2、移进: 如不能执行一个归约且在未消化的输入中还 有字符,就把它从输入移到栈中。如上例,假定栈中 内容是 ( ,输入中还有 i+i)#。不能对( 执行一个归约, 因为它不和任何产生式的右端匹配。所以把输入的第 一个符号移到栈中,于是栈中内容是 (i ,而余留的输 入是 +i)# 。
杨海 yanghai_sdjtu@
活前缀与句柄的关系
* G=(Vn , Vt , P , S),若有S’ αAω αβω,
R
R
γ是αβ的前缀,则称是文法G的活前缀。 活前缀已含有句柄的全部符号,表明产生式A→β 的右部β已出现在栈顶 活前缀只含句柄的一部分符号表明A→β1β2的右部 子串β1已出现在栈顶,期待从输入串中看到β2推出 的符号串 活前缀不含有句柄的任何符号,此时期望A→β的 右部所
第7章
LR分析法
杨海
yanghai_sdjtu@
1
山东交通学院
《编译原理》
主要内容:
7.1 LR分析法概述 7.2 LR(0)分析
7.3 SLR(1)分析
7.4 LR(1)分析
7.5 LALR(1)分析
7.6 使用二义文法
杨海 yanghai_sdjtu@
杨海
yanghai_sdjtu@
24
山东交通学院
《编译原理》
设I是文法G的一个LR(0)项目集合 closure(I)是从I出发用下面三个规则构造的项目集: 1.I中每一个项目都属于closure(I)。 2.若项目A→α· closure(I)且B→γ P Bβ 则将B →· γ加进closure(I)中。 3.重复执行(2)直到closure(I)不再增大为止。 显然对任何有效项目集I,都有I= closure(I)。
步骤 符号栈
1) 2) 3) # #a #ab
输入符号串
abbcde# bbcde# bcde#
动作
移进 移进 归约(A→b)
4)
5) 6) 7) 8)
#aA
#aAb #aA #aAc #aAcd
bcde#
cde# cde# de# e# e# # #
移进
归约(A→Ab) 移进 移进 归约(B→d) 移进 归约(S→aAcBe) 接受
若BA 则:LC(A)LC(B).{}
杨海
yanghai_sdjtu@
16
山东交通学院
《编译原理》
例:G[S]: (0) S’S (1) S aAcBe (2) A b (3) A Ab (4) B d
对每个非终结符建立左文方程组 LC(S’)={} LC(S)=LC(S’).{} LC(A)=LC(S).{a} LC(A){} LC(B)=LC(S).{aAc} 化简为: [S’]= [S]=[S’] [A]=[S]a+[A] [B]=[S]aAc
杨海 yanghai_sdjtu@
18
山东交通学院
《编译原理》
0
S



2
a
3
b
④ b
x


5
a
6
A
7
c c

d B
9 14
a a
10 15
A A
11 16
12 17
⒀ 18 e ⒆
杨海
yanghai_sdjtu@
19
山东交通学院
《编译原理》
DFA a x S 1 4 2 b 5 A b 3 c B 7 e 9 6
S A B
9) #aAcB 10) #aAcBe 11) #S
A
a b b c d e
对输入串abbcde的移进-规约分析过程
杨海
yanghai_sdjtu@
13
山东交通学院
《编译原理》
活前缀
* R G=(Vn , Vt , P , S),若有S’ αAω αβω, R γ是αβ的前缀,则称是文法G的活前缀。包 含了句柄的活前缀称为可归前缀。
杨海 yanghai_sdjtu@
22
山东交通学院
《编译原理》
LR(0)项目与活前缀、句柄的关系
为刻划这种分析过程中的文法G的每一个产生式 的右部符号已有多大一部分被识别(出现在栈顶)的 情况,分别用标有圆点的产生式来指示位置。 A→β. 刻划产生式A→β的 右部β已出现在栈顶 A→β1.β2 刻划A→β1β2的右部子串β1已出现在栈顶, 期待从输入串中看到β2推出的符号 A→.β 刻划没有句柄的任何符号在栈顶,此时期望 A→β的右部所推出的符号串 对于A→ε 的LR(0)项目只有A→.
d
8
杨海
yanghai_sdjtu@
20
山东交通学院
《编译原理》
构造识别活前缀的FA(II)
基本思想:构造LR(0)项目集规范族(构成识别 一文法的活前缀的FA的状态的全体) (1) LR(0)项目 在文法中每个产生式的右部的某一个适当位置 添加一个圆点构成项目 例: A aBc A.aBc Aa.Bc AaB.c AaBc. 项目的含义:圆点的左部表示规约过程中已经处 理的部分;圆点的右部表示待处理的部分。
相关文档
最新文档