编译原理——First集、Follow集、LL(1)填表、左递归/非LL(1)文法改写、LL(1)文法判断
First集
可能有3种产生式:
①
A
→
a
B
C
A \to aBC
A→aBC
②
A
→
ε
A \to \varepsilon
A→ε
③
A
→
B
C
D
a
A \to BCDa
A→BCDa
解决方法:
① 以终结符开头。
直接将终结符添加到 F i r s t ( A ) First(A) First(A)。
② 只有 ϵ \epsilon ϵ。
将 e p s i l o n epsilon epsilon添加到 F i r s t ( A ) First(A) First(A)。
③ 以非终结符开头。
(1) 若
ε
∉
F
i
r
s
t
(
B
)
\varepsilon\ \notin \ First(B)
ε ∈/ First(B),将
F
i
r
s
t
(
B
)
First(B)
First(B)添加到
F
i
r
s
t
(
A
)
First(A)
First(A)中;
(2) 若
ε
∈
F
i
r
s
t
(
B
)
\varepsilon\ \in \ First(B)
ε ∈ First(B),则将
F
i
r
s
t
(
B
)
∪
F
i
r
s
t
(
C
)
First(B)\cup First (C)
First(B)∪First(C)添加到
F
i
r
s
t
(
A
)
First(A)
First(A)中;
(3) 若
ε
∈
F
i
r
s
t
(
C
)
\varepsilon\ \in \ First(C)
ε ∈ First(C),则将
F
i
r
s
t
(
B
)
∪
F
i
r
s
t
(
C
)
∪
F
i
r
s
t
(
D
)
First(B)\cup First (C)\cup First(D)
First(B)∪First(C)∪First(D)添加到
F
i
r
s
t
(
A
)
First(A)
First(A)中;
(4) 若
ε
∈
F
i
r
s
t
(
D
)
\varepsilon\ \in \ First(D)
ε ∈ First(D),则将
F
i
r
s
t
(
B
)
∪
F
i
r
s
t
(
C
)
∪
F
i
r
s
t
(
D
)
∪
{
a
}
First(B)\cup First (C)\cup First(D)\cup \{a\}
First(B)∪First(C)∪First(D)∪{a}添加到
F
i
r
s
t
(
A
)
First(A)
First(A)中。
总结:
(1) 以终结符或
ε
\varepsilon
ε开头,将终结符或
ε
\varepsilon
ε添加到
F
i
r
s
t
(
A
)
First(A)
First(A)中。
(2) 以非终结符或开头,产生式形如
A
→
A
1
A
2
.
.
.
A
n
a
b
.
.
.
z
A\to A_1A_2...A_nab...z
A→A1A2...Anab...z,若
A
1
A
2
.
.
.
A
m
(
m
≤
n
)
A_1A_2...A_m(m\leq n)
A1A2...Am(m≤n)中的每个非终结符的
F
i
r
s
t
First
First集均包含
ε
\varepsilon
ε,则将
F
i
r
s
t
(
A
1
)
∪
F
i
r
s
t
(
A
2
)
∪
.
.
.
∪
F
i
r
s
t
(
A
m
+
1
First(A_1)\cup First (A_2)\cup ... \cup First(A_{m+1}
First(A1)∪First(A2)∪...∪First(Am+1添加到
F
i
r
s
t
(
A
)
First(A)
First(A)中(此处
a
=
A
n
+
1
a=A_{n+1}
a=An+1)
Follow集
产生式:
①
A
→
B
C
D
a
A \to BCDa
A→BCDa
②
A
→
B
C
D
A \to BCD
A→BCD
解决方法:
① 以终结符结尾:
(1) 若
ε
∉
F
i
r
s
t
(
C
)
\varepsilon\ \notin \ First(C)
ε ∈/ First(C)并且
ε
∉
F
i
r
s
t
(
D
)
\varepsilon\ \notin\ First(D)
ε ∈/ First(D),则将
F
i
r
s
t
(
C
)
First(C)
First(C)添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中,将
F
i
r
s
t
(
D
)
First (D)
First(D)添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
{
a
}
\{a\}
{a}添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
(2) 若
ε
∉
F
i
r
s
t
(
C
)
\varepsilon\ \notin \ First(C)
ε ∈/ First(C)并且
ε
∈
F
i
r
s
t
(
D
)
\varepsilon\ \in\ First(D)
ε ∈ First(D),则将
F
i
r
s
t
(
C
)
First(C)
First(C)添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中,将
F
i
r
s
t
(
D
)
∪
{
a
}
−
{
ε
}
First (D)\cup \{a\}-\{\varepsilon\}
First(D)∪{a}−{ε}添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
{
a
}
\{a\}
{a}添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
(3) 若
ε
∈
F
i
r
s
t
(
C
)
\varepsilon\ \in \ First(C)
ε ∈ First(C)并且
ε
∉
F
i
r
s
t
(
D
)
\varepsilon\ \notin\ First(D)
ε ∈/ First(D),则将
F
i
r
s
t
(
C
)
∪
F
i
r
s
t
(
D
)
−
{
ε
}
First(C)\cup First (D)-\{\varepsilon\}
First(C)∪First(D)−{ε}添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中,将
F
i
r
s
t
(
D
)
First (D)
First(D)添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
{
a
}
\{a\}
{a}添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
(4) 若
ε
∈
F
i
r
s
t
(
C
)
\varepsilon\ \in \ First(C)
ε ∈ First(C)并且
ε
∈
F
i
r
s
t
(
D
)
\varepsilon\ \in\ First(D)
ε ∈ First(D),则将
F
i
r
s
t
(
C
)
∪
F
i
r
s
t
(
D
)
∪
{
a
}
−
{
ε
}
First(C)\cup First (D)\cup \{a\}-\{\varepsilon\}
First(C)∪First(D)∪{a}−{ε}添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中;将
F
i
r
s
t
(
D
)
∪
{
a
}
First (D)\cup \{a\}
First(D)∪{a}添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
{
a
}
\{a\}
{a}添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
②以非终结符结尾:
(1) 若
ε
∉
F
i
r
s
t
(
C
)
\varepsilon\ \notin \ First(C)
ε ∈/ First(C)并且
ε
∉
F
i
r
s
t
(
D
)
\varepsilon\ \notin\ First(D)
ε ∈/ First(D),则将
F
i
r
s
t
(
C
)
First(C)
First(C)添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中,将
F
i
r
s
t
(
D
)
First (D)
First(D)添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
F
o
l
l
o
w
(
A
)
Follow (A)
Follow(A)添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
(2) 若
ε
∉
F
i
r
s
t
(
C
)
\varepsilon\ \notin \ First(C)
ε ∈/ First(C)并且
ε
∈
F
i
r
s
t
(
D
)
\varepsilon\ \in\ First(D)
ε ∈ First(D),则将
F
i
r
s
t
(
C
)
First(C)
First(C)添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中,将
F
i
r
s
t
(
D
)
∪
{
a
}
−
{
ε
}
First (D)\cup \{a\}-\{\varepsilon\}
First(D)∪{a}−{ε}添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
F
o
l
l
o
w
(
A
)
Follow (A)
Follow(A)添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
(3) 若
ε
∈
F
i
r
s
t
(
C
)
\varepsilon\ \in \ First(C)
ε ∈ First(C)并且
ε
∉
F
i
r
s
t
(
D
)
\varepsilon\ \notin\ First(D)
ε ∈/ First(D),则将
F
i
r
s
t
(
C
)
∪
F
i
r
s
t
(
D
)
−
{
ε
}
First(C)\cup First (D)-\{\varepsilon\}
First(C)∪First(D)−{ε}添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中,将
F
i
r
s
t
(
D
)
First (D)
First(D)添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
F
o
l
l
o
w
(
A
)
Follow (A)
Follow(A)添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
(4) 若
ε
∈
F
i
r
s
t
(
C
)
\varepsilon\ \in \ First(C)
ε ∈ First(C)并且
ε
∈
F
i
r
s
t
(
D
)
\varepsilon\ \in\ First(D)
ε ∈ First(D),则将
F
i
r
s
t
(
C
)
∪
F
i
r
s
t
(
D
)
∪
F
o
l
l
o
w
(
A
)
−
{
ε
}
First(C)\cup First (D)\cup Follow (A)-\{\varepsilon\}
First(C)∪First(D)∪Follow(A)−{ε}添加到
F
o
l
l
o
w
(
B
)
Follow(B)
Follow(B)中;将
F
i
r
s
t
(
D
)
∪
F
o
l
l
o
w
(
A
)
−
{
ε
}
First (D)\cup Follow (A)-\{\varepsilon\}
First(D)∪Follow(A)−{ε}添加到
F
o
l
l
o
w
(
C
)
Follow(C)
Follow(C)中,将
F
o
l
l
o
w
(
A
)
Follow (A)
Follow(A)添加到
F
o
l
l
o
w
(
D
)
Follow(D)
Follow(D)中;
LL(1)填表
产生式:
①
A
→
w
A\to w
A→w
②
A
→
ε
A\to \varepsilon
A→ε
解决方法:
① 产生式右侧是一个或多个非终结符和终结符的组合。
(1) 对每一个在
F
i
r
s
t
(
w
)
First(w)
First(w)内的终结符
t
t
t,设
T
[
A
,
t
]
=
w
T[A,t]=w
T[A,t]=w。
(2) 如果
ε
∈
F
i
r
s
t
(
w
)
\varepsilon\in First(w)
ε∈First(w),则对于
F
o
l
l
o
w
(
A
)
Follow(A)
Follow(A)中的每一个终结符
b
b
b,设
T
[
A
,
b
]
=
w
T[A,b]=w
T[A,b]=w。
(3) 如果
ε
∈
F
i
r
s
t
(
w
)
\varepsilon\in First(w)
ε∈First(w)中且$
∈
F
i
r
s
t
(
w
)
\in First(w)
∈First(w),设
T
[
A
,
T[A,
T[A,$
]
=
w
]=w
]=w。
② 产生式右侧是
ε
\varepsilon
ε。
对于
F
o
l
l
o
w
(
A
)
Follow(A)
Follow(A)中的每一个终结符
b
b
b,设
T
[
A
,
b
]
=
ε
T[A,b]=\varepsilon
T[A,b]=ε。
消除直接左递归
形如:
P
→
P
α
∣
β
P\to P\alpha|\beta
P→Pα∣β,
α
\alpha
α非
β
\beta
β,
α
、
β
\alpha、\beta
α、β不以
P
P
P打头
解决方法:
(1)
P
→
β
Q
P\to \beta Q
P→βQ
(2)
Q
→
α
Q
∣
ε
Q\to \alpha Q|\varepsilon
Q→αQ∣ε。其中,
Q
Q
Q为新增加的非终结符。
另外的非LL(1)文法
形如:
S
→
E
S\to E
S→E
E
→
T
E\to T
E→T
E
→
T
+
E
E\to T+E
E→T+E
解决方法:
S
→
E
S\to E
S→E
E
→
T
Y
E\to TY
E→TY
Y
→
+
E
Y\to +E
Y→+E
Y
→
ε
Y\to \varepsilon
Y→ε
LL(1)文法判断
方法一:通过LL(1)表看是否有某一个矩阵元素存在两条及以上的产生式,若有则存在冲突,否则无冲突。
方法二:通过
F
i
r
s
t
(
w
)
∩
F
o
l
l
o
w
(
A
)
=
∅
First(w)\cap Follow(A)=\empty
First(w)∩Follow(A)=∅判断,若为空则无冲突,否则有。