句型: Z = > x , 且 x ∈ V ? Z => x , 且 x∈V^* Z=>x,且x∈V?
给定文法 G [ Z ] , w = x u y ∈ V + ,为该文法的句型 给定文法G[Z], w = xuy∈V+,为该文法的句型 给定文法G[Z],w=xuy∈V+,为该文法的句型
若 Z = = > ? x U y , 且 U = = > + u , 则 u 是句型 w 相对于 U 的 若 Z ==>^* xUy, 且U ==>^+u, 则u是句型w相对于U的 若Z==>?xUy,且U==>+u,则u是句型w相对于U的短语;
若 Z = = > ? x U y , 且 U = = > u , 则 u 是句型 w 相对于 U 的 若 Z ==>^* xUy, 且U ==>u, 则u是句型w相对于U的 若Z==>?xUy,且U==>u,则u是句型w相对于U的简单短语。
其中 U ∈ V n , u ∈ V + , x , y ∈ V ? 其中U ∈V_n,u ∈V^+,x , y ∈V^* 其中U∈Vn?,u∈V+,x,y∈V?
任一句型的最左简单短语称为该句型的 任一句型的最左简单短语称为该句型的 任一句型的最左简单短语称为该句型的句柄。
采用自左向右分析输入串,那么自底向上分析:
建立符号栈,用来记录分析的历史和现状,并根据所面临的状态,确定下一步动作是移进还是归约。
这是一种经典的自底向上分析法,简单直观,并被广泛使用,开始主要是对表达式的分析,现在已不限于此。可以用于一大类上下无关的文法。
称为算符优先分析是因为这种方法是仿效算术式的四则运算而建立起来的,作算术式的四则运算时,为了保证计算结果 和过程的唯一性,规定了一个统一的四则运算法则,规定运 算符之间的优先关系。
运算规则:
算符优先分析的特点:仿效四则运算过程,预先规定相邻终结符之间的优先关系,然后利用这种优先关系来确定句型的“句柄”,并进行归约
分析器结构:
定义:设 a, b 为可能相邻的终结符
相邻的意思很宽泛,越过非终结符看也可以
若文法中无形如
U
∷
=
?
?
?
V
W
?
?
?
U∷= ···VW···
U::=???VW???的规则,这里
V
,
W
∈
V
n
V,W∈Vn
V,W∈Vn则称
G
G
G为
O
G
OG
OG文法,也就是算符文法。
中间一定要有终结符间隔
需定义两个集合:
F
I
R
S
T
V
T
(
U
)
=
FIRSTVT( U ) =
FIRSTVT(U)={
b
∣
U
=
>
+
b
…
或
U
=
>
+
V
b
…
,
b
∈
V
t
,
V
∈
V
n
b|U=>^+b…或U=>^+Vb…,b∈V_t, V∈V_n
b∣U=>+b…或U=>+Vb…,b∈Vt?,V∈Vn?}
L A S T V T ( U ) = LASTVT( U ) = LASTVT(U)= { a ∣ U = > + … a 或 U = > + … a V , a ∈ V t , V ∈ V n a|U=>^+…a或U=>^+…aV,a∈V_t, V∈V_n a∣U=>+…a或U=>+…aV,a∈Vt?,V∈Vn?}
则:
W
∷
=
.
.
.
a
U
.
.
.
,对任何
b
,
b
∈
F
I
R
S
T
V
T
(
U
)
,
a
<
b
W∷=...aU... ,对任何b, b∈FIRSTVT(U),a<b
W::=...aU...,对任何b,b∈FIRSTVT(U),a<b
W
∷
=
.
.
.
U
b
.
.
.
,对任何
a
,
a
∈
L
A
S
T
V
T
(
U
)
,
a
>
b
W∷=...Ub... ,对任何a, a∈LASTVT(U),a>b
W::=...Ub...,对任何a,a∈LASTVT(U),a>b
构造 F I R S T V T ( U ) FIRSTVT(U) FIRSTVT(U)的算法
构造
L
A
S
T
V
T
(
U
)
LASTVT(U)
LASTVT(U)的算法原理一样
3.
若有规则
U
:
:
=
…
a
或
U
:
:
=
…
a
V
,
则
a
∈
L
A
S
T
V
T
(
U
)
若有规则U::=…a或U::=…aV,则a∈LASTVT(U)
若有规则U::=…a或U::=…aV,则a∈LASTVT(U)
4.
若有规则
U
:
:
=
…
V
,
且
a
∈
L
A
S
T
V
T
(
V
)
,
则
a
∈
L
A
S
T
V
T
(
U
)
若有规则U::=…V,且a∈LASTVT(V), 则a∈LASTVT(U)
若有规则U::=…V,且a∈LASTVT(V),则a∈LASTVT(U)
算符优先文法(OPG)的定义:
设有一OG文法,如果在任意两个终结符之间,至多只有上述关系中的一种,则称该文法为算符优先文法(OPG)。即不会出现二义性,两个终结符之间有两个优先级关系
算符优先分析算法的实现
本质上就是先定义优先级,在分析过程中通过比较相邻运算符之间的优先级来确定**句型的“句柄”**并进行归约。
但是根据运算优先级确定的句柄和之前所定义的句柄不同,因此必须要有终结符从中间参与,因此定义素短语:
素短语:文法G的句型的素短语是一个短语,它至少包含有一个终结符号,并且除它自身以外不再包含其他素短语。
只有TF和i为素短语,其中TF为最左素短语,而该句型句柄为T。
画出优先级图,找到最左素短语
每次归约最左子串,确实是当前句型的最左素短语(语法树)。
归约的不都是真句柄(仅i归约为F是句柄,但它是最左素短语)。
没有完全按规则进行归约,因为素短语不一定是简单短语。