当前位置:文档之家› 第五章语法自底向上方法介绍

第五章语法自底向上方法介绍



形如A→•[P]的项目称为归约型项目 形如A→•[P]的项目称为移入型项目 移入-归约冲突 归约-归约冲突
LRSM不能直接用于LR分析 LRSM提供的信息:
(1)合法性检查信息 [A→a] (2)移入/归约信息 [A→a]; [A→] (3)移入/归约后的转向状态信息

例:构造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
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)一部分则是由基本项目扩展出来的 (称为扩展项目或派生项目)。派生部 分项目的特点是其中的“”出现在 产 生式右部的最左侧。
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的性质
简单优先分析中的三种关系
Y :当且仅当存在一个产生式A→…XY… X ⊲ Y :当且仅当存在一个产生式A→…XB… 并有B+Y…。 X ⊳ Y :当且仅当存在一个产生式A→…BC… 并有B+…X,C*Y…。
X 文法G为简单优先文法如果满足:
对于任意两个语法符号X和Y,至多成立一种 优先关系; 任意两个产生式都具有不同的右部。
[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]
Stack
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类分析方法
例:S aAcBe [1] Ab [2] A Ab [3] Bd [4] 输入流:abbcde。 规范推导过程为:

逆过程:(符号栈,输入流)
( -, abbcde)
(a,bbcde) (ab,bcde) (aA,bcde) (aAb,cde)

优先关系矩阵 一个文法的全部优先关系可以用矩阵 来表示,称作优先关系矩阵。



例: 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

)
#

⊳ ⊲ ⊲ ⊲ ⊲ ⊳ ⊳ ⊳ ⊳ ⊲ ⊳

线性正则式状态机-LRSM


线性正则式:不含*符号的正则表达式
LRSM:(Linear Regular States Machine) (1)从LRSM可构造出恰好接受给定所有正 则式的确定自动机DA; (2)从LRSM的终止状态可判定接受的是哪 个正则式; (3)从LRSM的状态可判定一个正则式是不 是另一正则式的前缀。
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,并做下面动作:






定理: 设X1…XiXi+1…Xj…Xn是一个句型,若有 Xi ⊲Xi+1 Xi+2 … Xj-1 Xj ⊳Xj+1 则Xi+1Xi+2…Xj-1Xj一定是该句型的简单短语。 结论: ⊲用来确定句柄的头; 用来确定句柄 的内部; ⊳用来确定句柄的结束。

简单优先分析算法要点
活前缀的描述性定义:形成可归前缀之 前,包括可归前缀在内所有规范句型的 前缀都称为活前缀。 活前缀 为一个或若干规范句型的前缀。 在规范归约过程中的任何时刻已分析过 的部分,即在分析栈(符号栈)中的符 号串均为规范句型的活前缀,表明输入 串的已被分析过的部分是该文法某规范 句型的一个正确部分。
构造LRSM的思想: 如果在状态项目集ISi 中有项目A→B, 且B→是B的产生式,则在ISi 中增加项目 B→;对于ISi 这个过程继续到不可再扩 充为止。
构造LR(0)活前缀状态机LRSM的算法要点
构造初始状态 IS0:IS0=CLOSURE({Z→S}),并给 IS0标
第五章 自底向上分析方法
主要内容 自底向上分析的基本思想 简单优先分析方法 LR类分析方法
5.1 自底向上语法分析方法介绍
•基本思想 从待分析的符号串开始,自左向右进行 扫描,自下而上进行分析,通过反复查找当前句型 的句柄,并使用产生式规则将找到的句柄归约为相 应产生式的左部非终极符,直到将输入串归约为文 法的开始符。(移入-归约分析)
设当前格局是:
# 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
文法优先关系的确定
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
展望符:Lookup(S) 有效前缀集 Prefix(S) 状态Si中的项目•[P]表示部分已被输 入,而且是Si的前缀的后缀,表示待输 入部分。 可构造接受给定正则式集合的DA 严格前缀:某状态中既含有定位点在尾处 的项目又含有定位点不在尾处的项目,则 一个正则式是另一个正则式的严格前缀。

找第一个使Sj⊳Sj+1的Sj。 从Sj开始往前(左)找第一个使Si-1⊲Si的Si。

用SiSi+1…Sj去查产生式的右部,并用相应 的左部符号代替句柄SiSi+1…Sj (归约) 。
重复上述过程,直至输入符结束。如果归 约出文法的开始符号则成功。否则失败。

简单优先分析实例
符号栈 # 关系 输入流 b(aa)b#

识别规约活前缀的LRSM的构造
派生定理


开始符产生式的右部是归约活前缀。 如果A是归约活前缀,且A→是产生式, 则也是归约活前缀。 任何归约活前缀,都可按上述方式被派生。 设文法开始符的产生式是: S →1|2|…|n RPSG={1,…,n}{|ARPSG,A→P}
上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 的状态节点为止。
相关主题