语法分析
消除直接左递归
A => A α | β
修改后:
A => β A’
A’ => α A’ | ε
例如
E => E + T | T # α为+T,β为T
T => T * F | F # α为*F,β为F
F => (E) | id # 不含左递归,直接照抄下来
修改成
E => T E’
E’ => + T E’ | ε
T => F T’
T’ => * F T’ | ε
F => (E) | id
消除间接左递归
直接代入即可
First集
如
果
X
是
终
结
符
或
者
ϵ
,
F
i
r
s
t
(
X
)
=
X
如果X是终结符或者\epsilon, First(X) = {X}
如果X是终结符或者ϵ,First(X)=X
如
果
X
是
非
终
结
符
且
X
如果X是非终结符且X
如果X是非终结符且X ->
X
1
X
2
X
3
.
.
.
.
.
.
X
n
,
F
i
r
s
t
(
X
)
包
含
了
F
i
r
s
t
(
X
1
)
−
{
ϵ
}
X_1X_2X_3......X_n,First(X) 包含了 First(X_1) - \{\epsilon\}
X1X2X3......Xn,First(X)包含了First(X1)−{ϵ}
如
果
F
i
r
s
t
(
X
1
)
包
括
了
ϵ
,
那
么
F
i
r
s
t
(
X
)
也
包
含
了
F
i
r
s
t
(
X
2
)
−
{
ϵ
}
如果First(X_1)包括了\epsilon,那么First(X)也包含了First(X_2)- \{\epsilon\}
如果First(X1)包括了ϵ,那么First(X)也包含了First(X2)−{ϵ}
如
果
F
i
r
s
t
(
X
2
)
也
包
括
了
ϵ
,
那
么
F
i
r
s
t
(
X
)
也
包
含
了
F
i
r
s
t
(
X
3
)
−
{
ϵ
}
如果First(X_2)也包括了\epsilon,那么First(X)也包含了First(X_3)- \{\epsilon\}
如果First(X2)也包括了ϵ,那么First(X)也包含了First(X3)−{ϵ}
.
.
.
.
.
.
......
......
如
果
F
i
r
s
t
(
X
1
)
,
F
i
r
s
t
(
X
2
)
,
F
i
r
s
t
(
X
3
)
.
.
.
.
.
.
F
i
r
s
t
(
X
n
)
都
包
括
了
ϵ
,
那
么
F
i
r
s
t
(
X
)
也
包
含
了
{
ϵ
}
如果First(X_1),First(X_2),First(X_3)......First(X_n)都包括了\epsilon,那么First(X)也包含了\{\epsilon\}
如果First(X1),First(X2),First(X3)......First(Xn)都包括了ϵ,那么First(X)也包含了{ϵ}
Follow集
如
果
S
是
文
法
开
始
符
号
,
那
么
F
o
l
l
o
w
(
S
)
包
含
了
如果S是文法开始符号,那么Follow(S)包含了
如果S是文法开始符号,那么Follow(S)包含了$
如
果
G
如果G
如果G ->
α
S
γ
,
那
么
F
o
l
l
o
w
(
S
)
包
含
了
F
i
r
s
t
(
γ
)
−
{
ϵ
}
αSγ,那么Follow(S)包含了 First ( γ) -\{\epsilon\}
αSγ,那么Follow(S)包含了First(γ)−{ϵ}
如
果
G
如果G
如果G ->
α
S
γ
且
F
i
r
s
t
(
γ
)
包
含
了
ϵ
,
那
么
F
o
l
l
o
w
(
S
)
还
包
含
了
F
o
l
l
o
w
(
G
)
αSγ且First(γ)包含了\epsilon,那么Follow(S)还包含了Follow(G)
αSγ且First(γ)包含了ϵ,那么Follow(S)还包含了Follow(G)