第五章语法自底向上方法介绍
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
优先关系矩阵 一个文法的全部优先关系可以用矩阵 来表示,称作优先关系矩阵。
例: Z bMb Z Ma Z M (L L Ma) M
L b ( a ) #
Z FIRST b LAST b
M a( aL)
L M( a )
M L
b
(
a
)
#
⊳
⊳ ⊲ ⊲ ⊲ ⊲ ⊳ ⊳ ⊳ ⊳ ⊲ ⊳
活前缀的描述性定义:形成可归前缀之 前,包括可归前缀在内所有规范句型的 前缀都称为活前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 串的已被分析过的部分是该文法某规范 句型的一个正确部分。
IS = {abd[1],abc[2],bc[3],de[4],
dec[5]},
则有 : IS(a) = { abd[1], abc[2] } IS(b) = { bc[3] } IS(c) = { dec[4] }
线性正则式到LRSM的构造
给定正则式集{1,2,…n}: ■构造初始项目集 IS0={1[1],...,n[n]},并给 IS0 标上NO(表示未处理)。 ■从已构造的 LRSM 部分图选择被标为 NO 的任一项目集 ISi,并做下面动作:
id
E→E+ T T→ id T→ (E)
E
7
S→E $ E→E +T
+
T→(E ) E→E +T
$
2 4
T
8
)
T→(E)
S→E $
E→E+T
GE的LRSM
LRSM给出了所有的可归活前缀
LRSM中的每个状态将对应一个饱和项目集: (1)其中一部分是由先驱状态分出来 (称为基本项目); (2)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
第五章 自底向上分析方法
主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法
5.1 自底向上语法分析方法介绍
•基本思想 从待分析的符号串开始,自左向右进行 扫描,自下而上进行分析,通过反复查找当前句型 的句柄,并使用产生式规则将找到的句柄归约为相 应产生式的左部非终极符,直到将输入串归约为文 法的开始符。(移入-归约分析)
•两种分析方法 简单优先和LR类分析方法
例:S aAcBe [1] Ab [2] A Ab [3] Bd [4] 输入流:abbcde。 规范推导过程为:
逆过程:(符号栈,输入流)
( -, abbcde)
(a,bbcde) (ab,bcde) (aA,bcde) (aAb,cde)
(aA,cde)
(aAc,de) (aAcd,e) (aAcB,e) (aAcBe,-)
S aAcBe[1]
aAcd[4]e[1]
aAb[3]cd[4]e[1]
ab[2]b[3]cd[4]e[1]
(S,-)
5.2 简单优先分析
一种shift-reduce分析方法 根据文法符号的优先关系确定句柄 文法符号的优先关系的确定
[1] 对每个符号XSymbSet:
若ISiX非空,给ISiX标上NO,并在ISi和ISiX之间 画有向X边:ISi → ISiX。 [2] 给ISi标上OK。 ■ 重复上述步骤二,直至在LRSM中没有被标记为NO的
状态(项目集)节点为止。
S0 •abc[1] •abd[2] a •ad[3] •bec[4] •bed[5] b S2 b•ec[4] b•ed[5]
展望符:Lookup(S) 有效前缀集 Prefix(S) 状态Si中的项目•[P]表示部分已被输 入,而且是Si的前缀的后缀,表示待输 入部分。 可构造接受给定正则式集合的DA 严格前缀:某状态中既含有定位点在尾处 的项目又含有定位点不在尾处的项目,则 一个正则式是另一个正则式的严格前缀。
线性正则式状态机-LRSM
线性正则式:不含*符号的正则表达式
LRSM:(Linear Regular States Machine) (1)从LRSM可构造出恰好接受给定所有正 则式的确定自动机DA; (2)从LRSM的终止状态可判定接受的是哪 个正则式; (3)从LRSM的状态可判定一个正则式是不 是另一正则式的前缀。
找第一个使Sj⊳Sj+1的Sj。 从Sj开始往前(左)找第一个使Si-1⊲Si的Si。
用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄SiSi+1…Sj (归约) 。
重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。
简单优先分析实例
符号栈 # 关系 输入流 b(aa)b#
上NO。 从已构造的 LRSM 部分图选择被标为 NO 的任一状态 IS, 并做 [1] 对每个符号XVTVN,做下面动作: 1) 令ISj = CLOSURE( IS(X)),若非空。 2) 若在LRSM部分图中已有ISk与ISj有相同项目 集,则令m=k;否则构造ISj的状态点ISj, 并给ISj标上NO,同时令m=j。 x 3) 在IS和ISm之间画有向X边:IS ISm 。 [2] 给IS标上OK。 重复上一步骤,直至没有被标记为 NO 的状态节点为止。
简单优先分析中的三种关系
Y :当且仅当存在一个产生式A→…XY… X ⊲ Y :当且仅当存在一个产生式A→…XB… 并有B+Y…。 X ⊳ Y :当且仅当存在一个产生式A→…BC… 并有B+…X,C*Y…。
X 文法G为简单优先文法如果满足:
对于任意两个语法符号X和Y,至多成立一种 优先关系; 任意两个产生式都具有不同的右部。
形如A→•[P]的项目称为归约型项目 形如A→•[P]的项目称为移入型项目 移入-归约冲突 归约-归约冲突
LRSM不能直接用于LR分析 LRSM提供的信息:
(1)合法性检查信息 [A→a] (2)移入/归约信息 [A→a]; [A→] (3)移入/归约后的转向状态信息
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
识别规约活前缀的LRSM的构造
派生定理
开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
⊳
⊲
⊲
定理: 设X1…XiXi+1…Xj…Xn是一个句型,若有 Xi ⊲Xi+1 Xi+2 … Xj-1 Xj ⊳Xj+1 则Xi+1Xi+2…Xj-1Xj一定是该句型的简单短语。 结论: ⊲用来确定句柄的头; 用来确定句柄 的内部; ⊳用来确定句柄的结束。
简单优先分析算法要点
Stack
Leabharlann Baidu
LR分析模型
LR分析表
Action矩阵:行代表状态,列代表输入 符,而矩阵元素则表示相应的分析动作: Shift / Reduce / Accept / Error 。 GoTo矩阵:行代表状态,而列则代表语 法符号(非终极符,终极符),而矩阵 元素则表示移入或归约后的转向状态。 定义 若IS是一个LR(0)项目集,X是一个 文法符号,函数GO(IS, X)定义为 GO(IS, X)=CLOSURE(IS(X)),其中 IS(X)为LR(0)项目集IS的投影。
例:构造LR(0)状态机 SE$ EE+T ET T id T ( E )
0
T (
9
T
6
S→ E $ E→ E+T E→ T T→ id T→ ( E )
E→T
5
id
+
T→id
id
(
T→( E) E→ E+T E→ T T→ id T→ ( E )
(
E
1 3
两个重要的性质
归约活前缀的性质:若A是归约活前 缀,A→是产生式,则也是归约活 前缀。 活前缀状态机性质:若有 Prefix(ISi ),且A→ISi ,则 是归约活前缀。
若有 Prefix(ISi ),Y→AISi ,则 根据性质2—(活前缀状态机的性质), A是归约活前缀。再根据派生原理,若 A→是A的产生式,则也是归约活前缀。
#b
#b( #b(a #b(M #b(Ma #b(Ma) #b(L #bM #bMb #Z
⊲ ⊲ ⊲ ⊳
(aa)b#
aa)b# a)b# a)b# )b# b# b# b# # #
⊳ ⊳
⊳ ⊳
5.3 LR类分析方法
•规范句型:用最右推导导出的句型(也称右句
型)。 •规范前缀:若存在规范句型,且是终极符 串或空串,则称为规范前缀。 •规范活前缀:若规范前缀不含句柄或含一个 句柄并且具有形式=(是句柄),则称规范前 缀为规范活前缀(简称活前缀)。 •归约规范活前缀:若活前缀是含句柄的活前 缀,即有=,且是句柄,则称活前缀为归 约规范活前缀(简称归约活前缀)。
6 S1=S0a S3 S c abc•[1] a•bc[1] b ab•c[1] ab•d[2] 7 a•bd[2] S d abd•[2] a•d[3] S4 d ad•[3] S5 c S8 bec•[4] e be•c[4] be•d[5] S9 d bed•[5]
正则式到LRSM的转换例
LRSM的性质
设当前格局是:
# X1 X2 … Xk … Xt Si0 Si1 Si2 … Sik … Sit
# X1 X2 … Xk … Xt ai Si0 Si1 Si2 … Sik … Sit S*
aiai+1…an #
移入动作:设Sit的ai输入边所指向的状态为S*
归约动作:设按A→Xk+1Xk+2…Xt进行归约,则首先归约为A
例有文法G[S]: S → aAc[1] A → Abb[2] A → b[3]
可归前缀集: aAc aAbb ab
LR(0)项目:若A→是产生式, 则称A→为LR(0)项目(简称项目),也 写作[p]形式。 项目集的投影:假设IS是LR(0)项目集,则 称下面IS(X) 为IS关于X的投影集: IS(X) = {A→X |A→XIS, X(VTVN)}. 项目集的闭包:假设IS是LR(0)项目集,则 称下面CLOSURE(IS)为IS的闭包集: CLOSURE(IS)= IS {A→ | Y→ACLOSURE(IS) A→是产生式 }
项目:假设[P]是一个正则式,则我们称形 如[P]的表示为项目,其中P是正则式编号。 其中黑点可出现于任何位置上。 项目集:用IS表示 IS(X) : SubItems(IS,X)= {X[P]|X[P]IS,XSymbSet} 简记为IS(X)
假设有线性正则项集:
文法优先关系的确定
FIRST(W) ={S | W + S…,S(VNVT)} LAST(W) ={S | W + …S,S(VN VT)}
若有U…SiSj…: 则有Si Sj ; 若有U…SiW…:任SjFIRST(W),有Si ⊲ Sj 若有U…VW…:任SiLAST(V), Sj(FIRST(W) {W})则有Si ⊳ Sj 输入流的开始和结束标志 ‘#’,文法的开始符为Z, SFIRST(Z),有# ⊲ S,; 且# ⊲ Z SLAST(Z),有S ⊳ #,; 且Z ⊳ #
# X1 X2 … Xk A Si0 Si1 Si2 … Sik
Sik的A输出边所指向的状态设为S*,则格局变为:
# X1 X2 … Xk A Si0 Si1 Si2 … Sik S*
LR(0)分析
Input a1 … ai … an #
St Xt … …
LR分析驱动器
Output
action
goto