本文用一个例子作为演示,通俗易懂
Qs:
已知文法G(S)为:
S → a ∣ ∧ ∣ ( T ) S→a | ∧ | (T) S→a∣∧∣(T)
T → T , S ∣ S T→T,S | S T→T,S∣S
对输入串(a,a)#
进行自底向上的算符优先分析
An:
一·计算FirstVT和LastVT
方法:
- 求FirstVT集:从左向右找第一个终结符VT,可以忽视非终结符VN
- 求LastVT集:从右向左找第一个终结符VT,可以忽视非终结符VN
FirstVT | LastVT | |
---|---|---|
S | a ∧ ( | ) ∧ a |
T | a ∧ ( , | ) ∧ a , |
二·构造算符优先关系表
方法:
- 先加上一个生成式:S’ → #S#
- A → …aBb…,则 a = b
- A → …bB…,则 b < FirstVN(B)
- A → …Bb…,则 LastVN(B) > b
根据生成式可写出:
( < FirstVT(T)
LastVT(T) > (
LastVT(T) > ,
,< FirstVT(S)
# < FirstVT(S)
LastVT(S) > #
# = #
( = )
据此画出算符优先关系表:
a | ^ | ( | ) | , | # | |
---|---|---|---|---|---|---|
a | > | > | > | |||
^ | > | > | > | |||
( | < | < | < | = | < | |
) | > | > | > | |||
, | < | < | < | > | > | |
# | < | < | < | = |
二·算符优先分析过程
方法:
- 先画上
栈 串1 串2 操作
- 当栈顶(最接近栈顶的VT)
<或=
串1,则移进(move)- 当栈顶(最接近栈顶的VT)
>
串1,则归约(reduce)- 一个思想是:非终结符VN完全是无关紧要的东西
完整分析过程:
栈 | 串 | 串 | 操作 |
---|---|---|---|
# | ( | a,a)# | move |
#( | a | ,a)# | move |
#(a | , | a)# | reduce |
#(S | , | a)# | move |
#(S, | a | )# | move |
#(S,a | ) | # | reduce |
#(S,S | ) | # | reduce |
#(S | ) | # | move |
#(S) | # | move | |
#S | # | Accept |
E N D END END