因为过去几节课比较摸鱼,到了这节已经有好多听不懂了。
所以试着学一下LL(k)
一路上遇到不少坑 记录一下
(突然学会了点
L
A
T
E
X
L^AT_EX
LATEX正好试试看)
R
e
f
e
r
e
n
c
e
s
:
References:
References:
写得很好的博文
写得很好的博文
讲解很明确的pdf
wiki传送门
1.
c
o
n
t
e
x
t
−
f
r
e
e
g
r
a
m
m
a
r
上
下
文
无
关
文
法
1.context-free\ grammar \ 上下文无关文法
1.context−free grammar 上下文无关文法
引用知乎上的回答:
上下文无关文法就是说这个文法中所有的产生式左边只有一个非终结符
比如:
S
→
a
S
b
S \rightarrow aSb
S→aSb
S
→
a
b
S \rightarrow ab
S→ab
这个文法有两个产生式,每个产生式左边只有一个非终结符S,这就是上下文无关文法,因为你只要找到符合产生式右边的串,就可以把它归约为对应的非终结符。
比如:
a
S
b
→
a
a
S
b
b
aSb \rightarrow aaSbb
aSb→aaSbb
S
→
a
b
S \rightarrow ab
S→ab
这就是上下文相关文法,因为它的第一个产生式左边有不止一个符号,所以你在匹配这个产生式中的S的时候必需确保这个S有正确的“上下文”,也就是左边的a和右边的b,所以叫上下文相关文法。
作者:徐辰 链接:https://www.zhihu.com/question/21833944/answer/40689967
2.
L
e
f
t
d
e
r
i
v
a
t
i
o
n
2.Left\ derivation
2.Left derivation 最左推导
每次对最左边非终结符进行替换 直到无法替换为止
3.
F
i
r
s
t
s
e
t
3.First\ set
3.First set
求法:
如果
S
→
a
S\rightarrow a
S→a 若a是终止符 ,就直接把a放到
F
i
r
s
t
(
S
)
First(S)
First(S)中
如果
S
→
A
S\rightarrow A
S→A 若A不是终止符,就把
F
i
r
s
t
(
A
)
First(A)
First(A)的元素加入
F
i
r
s
t
(
S
)
First(S)
First(S)中
如果
S
→
A
B
C
S\rightarrow ABC
S→ABC 若ABC不是终止符:
若A不含
ϵ
\epsilon
ϵ则
F
i
r
s
t
(
S
)
=
F
i
r
s
t
(
A
)
First(S)=First(A)
First(S)=First(A),
否则 若B不含
ϵ
\epsilon
ϵ则
F
i
r
s
t
(
S
)
=
(
F
i
r
s
t
(
A
)
−
ϵ
)
∪
F
i
r
s
t
(
B
)
First(S)=(First(A)-\epsilon) \cup First(B)
First(S)=(First(A)−ϵ)∪First(B),
否则
F
i
r
s
t
(
S
)
=
(
F
i
r
s
t
(
A
)
−
ϵ
)
∪
(
F
i
r
s
t
(
B
)
−
ϵ
)
∪
F
i
r
s
t
(
C
)
First(S)=(First(A)-\epsilon) \cup (First(B)-\epsilon) \cup First(C)
First(S)=(First(A)−ϵ)∪(First(B)−ϵ)∪First(C)。
4.
F
o
l
l
o
w
s
e
t
4.Follow\ set
4.Follow set
求法:
1.如果存在一个产生式
A
→
.
.
.
U
P
A\rightarrow... UP
A→...UP,那么
F
i
r
s
t
(
P
)
First(P)
First(P)中除了
ϵ
\epsilon
ϵ之外都应该放入
F
o
l
l
o
w
(
U
)
Follow(U)
Follow(U)中
2.如果一个存在一个产生式
A
→
.
.
.
U
A\rightarrow...U
A→...U,或者存在产生式
A
→
.
.
.
U
P
A\rightarrow... UP
A→...UP,且
F
i
r
s
t
(
P
)
First(P)
First(P)中包含
ϵ
\epsilon
ϵ,则
F
o
l
l
o
w
(
A
)
Follow(A)
Follow(A)中的所有元素都在
F
o
l
l
o
w
(
U
)
Follow(U)
Follow(U)中
3.若S是开始标记,$是结束标记,则在
F
o
l
l
o
w
(
S
)
Follow(S)
Follow(S)中加入$
可以做一个练习…
E
→
T
E
′
E\rightarrow TE'
E→TE′
E
′
→
+
T
E
′
∣
ϵ
E'\rightarrow+TE'|\epsilon
E′→+TE′∣ϵ
T
→
F
T
′
T\rightarrow FT'
T→FT′
T
′
→
∗
F
T
′
∣
ϵ
T'\rightarrow *FT'|\epsilon
T′→∗FT′∣ϵ
F
→
(
E
)
∣
i
d
F\rightarrow (E)|id
F→(E)∣id
根据上面的分类方法,我们可以得到:
F
I
R
S
T
(
E
)
=
F
I
R
S
T
(
T
)
=
F
I
R
S
T
(
F
)
=
{
(
,
i
d
}
FIRST(E) = FIRST(T) = FIRST(F) = \{( , id \}
FIRST(E)=FIRST(T)=FIRST(F)={(,id}
F I R S T ( E ′ ) = F I R S T ( + ) ∪ F I R S T ( ε ) = { + , ϵ } FIRST(E') = FIRST(+) \cup FIRST(ε)= \{ + , \epsilon \} FIRST(E′)=FIRST(+)∪FIRST(ε)={+,ϵ}
F I R S T ( E ′ ) = F I R S T ( ∗ ) ∪ F I R S T ( ε ) = { ∗ , ε } FIRST(E') = FIRST(*) \cup FIRST(ε)= \{ * , ε \} FIRST(E′)=FIRST(∗)∪FIRST(ε)={∗,ε}
F O L L O W ( E ) = F O L L O W ( E ′ ) = { ) , $ } FOLLOW(E) = FOLLOW(E') = \{) , \$\} FOLLOW(E)=FOLLOW(E′)={),$}
F O L L O W ( T ) = F O L L O W ( T ′ ) = { + , ) , $ } FOLLOW(T) = FOLLOW(T') = \{+ , ) , \$\} FOLLOW(T)=FOLLOW(T′)={+,),$}
F O L L O W ( F ) = { ∗ , + , ) , $ } FOLLOW(F) = \{* , + , ) , \$\} FOLLOW(F)={∗,+,),$}
你学会了吗?
5.
L
L
(
1
)
g
r
a
m
m
a
r
5.LL(1)\ grammar
5.LL(1) grammar
解释
LL(1) 中第一个“L”表示从左向右扫描输入,第二个“L”表示产生最左推导,而“1”表示在每一步中只需要向前看一个输入符号来决定语法分析动作。
定义
对于文法LL(1)文法G,当且仅当G的任意两个不同产生式
A
→
α
∣
β
A \rightarrow \alpha | \beta
A→α∣β
(1)不存在终结符号a使得α和β都能推导出以a开头的串。
(2)
α
\alpha
α和
β
\beta
β中最多只有一个可以推导出空串。
(3)如果
β
→
ϵ
\beta\rightarrow \epsilon
β→ϵ,那么α不能推导出任何以Follow(A)中某个终结符号开头的串。
构建预测分析表
方法:
对于文法G的每个产生式
A
→
α
A\rightarrow α
A→α ,进行如下处理
(1)对于FIRST(α)中每个终结符号a,将
A
→
α
A\rightarrow α
A→α 加入到 M[A,a] 中。
(2)如果 ε在FIRST(α)中,那么对于FOLLOW(A)中每个终结符号b,将
A
→
α
A\rightarrow α
A→α 加入到 M[A,b] 中。如果 ε在FIRST(α),且在FOLLOW(A)中,也将
A
→
α
A\rightarrow α
A→α 加入到M[A,]中。
以之前的练习为例:
E → T E ′ E\rightarrow TE' E→TE′
E ′ → + T E ′ ∣ ϵ E'\rightarrow+TE'|\epsilon E′→+TE′∣ϵ
T → F T ′ T\rightarrow FT' T→FT′
T ′ → ∗ F T ′ ∣ ϵ T'\rightarrow *FT'|\epsilon T′→∗FT′∣ϵ
F → ( E ) ∣ i d F\rightarrow (E)|id F→(E)∣id根据上面的分类方法,我们可以得到:
F I R S T ( E ) = F I R S T ( T ) = F I R S T ( F ) = { ( , i d } FIRST(E) = FIRST(T) = FIRST(F) = \{( , id \} FIRST(E)=FIRST(T)=FIRST(F)={(,id}
F I R S T ( E ′ ) = F I R S T ( + ) ∪ F I R S T ( ε ) = { + , ϵ } FIRST(E') = FIRST(+) \cup FIRST(ε)= \{ + , \epsilon \} FIRST(E′)=FIRST(+)∪FIRST(ε)={+,ϵ}
F I R S T ( E ′ ) = F I R S T ( ∗ ) ∪ F I R S T ( ε ) = { ∗ , ε } FIRST(E') = FIRST(*) \cup FIRST(ε)= \{ * , ε \} FIRST(E′)=FIRST(∗)∪FIRST(ε)={∗,ε}
F O L L O W ( E ) = F O L L O W ( E ′ ) = { ) , $ } FOLLOW(E) = FOLLOW(E') = \{) , \$\} FOLLOW(E)=FOLLOW(E′)={),$}
F O L L O W ( T ) = F O L L O W ( T ′ ) = { + , ) , $ } FOLLOW(T) = FOLLOW(T') = \{+ , ) , \$\} FOLLOW(T)=FOLLOW(T′)={+,),$}
F O L L O W ( F ) = { ∗ , + , ) , $ } FOLLOW(F) = \{* , + , ) , \$\} FOLLOW(F)={∗,+,),$}
构建表
按照规则1
按照规则2