当前位置:
文档之家› byyl-ch5.自底向上优先分析
byyl-ch5.自底向上优先分析
*
()i
<
<
>
<
>
<
>
<
<
<
=
<
>
>
>
>
<
<
<
FIRSTVT
# > >
> > =
30
最左素短语
• 短语——回忆
– 若文法的开始符号为S,S=>*αAβ,A=>+ γ – 则称γ为句型αAβ的一个短语
• 素短语
– 至少含有一个终结符,并且不再含有更小的 素短语
• 最左素短语
– 处于句型最左面的素短语
31
素短语举例
句型T+T*F+i的短语有哪些? 直接短语有哪些?素短语是什么?
– 短语为:T+T*F+i、T+T*F、 T*F,以及最左边的T和最右边 的i
– 直接短语是:T、T*F、i – 素短语为:T*F和 i。
✓ T+T*F+i,T+T*F不是素短语, E
因为其中包含了素短语T*F。 ✓ T不是素短语,因为其中没有终
(⋖(,(⋖a,(⋖A. • 3) SbAb且A+ …),A+a,A+…B可
得: )⋗b,a⋗b,B⋗b.由BAa)且 A+ …),A+ a,A+ …B 可得:)⋗a,a⋗a,B⋗a
13
SbA ( Ba ) #
S
⋗
b
≐⋖
⋖
⋗
A
≐
≐
(
⋖⋖ ≐⋖
B
⋗
⋗
a
⋗
⋗≐Leabharlann )⋗⋗# ⋖⋖
≐
14
简单优先文法
• 若一个文法是简单优先文法,必须满足以下 条件:
28
计算优先关系2
• F -> (E) | i
(=) ( < any of FIRSTVT(E) any of LASTVT(E) > )
• #E#
#=# # < any of FIRSTVT(E) any of LASTVT(E) > #
29
LASTVT
+
+
>
*
>
(
<
)
>
i
>
#
<
算符优先关系表
• 检查是否为句柄—归约条件 • 选用哪一条规则进行归约—归约原则
8
5.2 优先分析法
1、简单优先分析法概述
• 基本思想 简单优先分析法的基本思想是对一个文法 按一定原则求出该文法的所有符号之间的 优先关系,按照这种关系确定归约过程中 的句柄以进行归约。
9
优先关系的定义
• X≐Y • X⋖Y • X⋗Y
第五章 自底向上分析
5.1 移进-归约分析 (自底向上分析的一般过程)
5.2 优先分析法 5.3 LR分析法 5.4 SLR(1)分析技术 5.5 LR(1)和LA1 LR(1)分析
自顶向下分析算法的基本思想为:
+
若Z S 则 S L(G[Z]) 否则 S L(G[Z])
G[Z]
存在主要问题: ➢ 左递归问题 ➢ 回溯问题
36
3 优先函数
用优先关系矩阵存储算符之间的优先关系, 需要耗费大量的内存空间(n+1)2。
算符之间的优先关系也可用优先函数来表示, 只需占用2(n+1)存储单元。
定义两个优先函数f、g,满足如下条件:
– 当a=b,则令f(a)=g(b) – 当a<b,则令f(a)<g(b) – 当a>b,则令f(a)>g(b)
T
结符号。
Z E
E+ T
+T F i
T *F
32
算符优先算法
• “归约”素短语 • 最左子串法 • 由于算符优先文法不含两个连续的非终结符,故可以
把括在两个#之间的句型的一般性是写成:
#N1a1N2a2NnanNn+1an+1# 其归约中的,是ai都满是足终下结列符条,件N的j是最非左终子结串符:(可有可无)。此时
• E->E+T|T
– FIRSTVT(E) = { + } U FIRSTVT(T) – = { +, *, (, i }
26
构造LASTVT()
• F->(E)|i
– LASTVT(F) = { ), i }
• T->T*F|F
– LASTVT(T) = { * } U LASTVT(F) – = { *, ), i }
15
步栈 骤
1#
优先 关系
⋖
当前 符号
b
剩余输 入串
(aa)b#
动作 移进
2 #b
⋖
(
aa)b# 移进
3 #b( ⋖
a
a)b# 移进
4 #b(a ⋗
a
)b#
归约
5 #b(A ≐
a
)b#
移进
6 #b(Aa ≐
)
b#
移进
7 #b(Aa) ⋗
b
#
归约
8 #b(B ⋗
b
#
归约
9 #bA ≐
b
#
移进
10 #bAb ⋗
• 由于仅对终结符定义优先关系,未对非终结符 号定义算符优先关系,不能使用这些关系查找 右单个非终结符号组成的句柄。
25
构造FIRSTVT()
• F->(E)|i
– FIRSTVT(F) = { (, i }
• T->T*F|F
– FIRSTVT(T) = { * } U FIRSTVT(F) – = { *, (, i }
▪ 主要方法: • 递归子程序法 • LL分析法
自底向上分析算法的基本思想为:
若Z + S 则 S L(G[Z]) 否则 S L(G[Z])
G[Z]
存在主要问题: • 句柄的识别问题
主要方法: • 算符优先分析法 • LR分析法
2
自底向上分析
基本算法:
若采用自左向右的描述和分析输入串,那么自 底向上的基本算法是:
i
3 #F+(F+i)*i# #⋖+⋖(⋖+⋖i⋗) i
4 #F+(F+F)*i# #⋖+⋖(⋖+⋗)
F+F
5 #F+(E)*i# #⋖+⋖(≐)
(E)
6 #F+F*i# #⋖+⋖*⋖i⋗#
i
7 #F+F*F# #⋖+⋖*⋗#
F*F
8 #F+T#
#⋖+⋗#
F+T
9 #E#
F F F E F F T E 接受
FIRSTVT(P)
22
LASTVT()
• LASTVT(P)
= { a | P =>+ …a 或 P =>+ …aQ }
• LASTVT(P)的构造算法
– 若P->…a或P->…aQ,则a属于LASTVT(P) – 若a属于LASTVT(Q),且P->…Q,则a属于
LASTVT(P)
23
算符优先关系表构造算法
37
用关系图法构造优先函数
步骤:1.对所有终结符(包括#),用有下脚标fa、ga 的为结点名,画出2n个结点。
2.若ai>aj, 或ai=aj,则. 从fai到gaj画一条弧。 若ai<aj, 或ai=aj,则从gaj到fai画一条弧。 3.给每个结点赋一个数,此数等于从该结点出
输入串
#
符号栈 #
L.R.P
4
例:G[S]: S→AcBe A→b A→Ab B→d
输入串为bbcde,检查是否是该文法的合法句子。
若采用自底向上分析,即能否一步步归约当前句型的句柄, 最终规约到开始符号S。先设立一个符号栈,我们统一符号 “#”作为待分析的符号串的左右分界符。 作为初始状态,先将符号串的分界符推进符号栈,作为栈底 符号。
34
识别句型i+(i+i)*i得到的语法Z 树
Z F+
(a) 算符优先 分析技术得到
T 得到的语法树
i
F *F
( E) i
E
E
+T
T
T *F
F
F
i
i
( E)
F+F
i
i
(b) 一般分析 技术得到得到 的语法树
E+ T
T
F
F
i
i 35
关于算符优先文法
•算符优先分析比简单优先分析快得多; (跳过了单产生式归约) •算符优先关系表比简单优先关系表小很多, 占用存储空间相对较少 •算符优先分析文法使用的范围比简单优先 方法大得多; •适用于表达式文法
1) 在文法符号集V中,任意两个符号之间最多 只有一种优先关系成立;
2) 在文法中任意两个产生式没有相同的右部。
简单优先分析法的算法思想是:在不断将输 入符号移进分析栈的过程中通过比较优先级,首 先发现句柄的尾,然后再反向找到句柄的头,从 而找到句柄。之后寻找句柄以句柄为右部的规则, 如找到则进行规约,否则出错
• 说明 为了方便,假设文法中不含形如P的规则17
算符文法
• 如果某文法G中没有形如ABC的产生 式,这里A, B, CVN,则成文法G为算符文 法,也称OG文法。