我们喜欢和需要使用是LL(1)文法,但是我们往往遇到的文法不是LL(1)文法这时候需要将它进行转换转换成LL(1)文法。
这里给出两种方法分别是提取左公因子和消除左递归
1 提取左公因子
含有左公共因子的文法
若文法中含有形如:
A→
α
β|
α
r
的产生式,称
文法含有左公共因子
显然
,
SELECT(A→αβ)∩SELECT(A→αr)
≠ф
,
文法不是
LL(1)
文法
提取左公因子基本思想
通过改写产生式来推迟决定,读入足够多的输
入,获得足够的信息之后,再做出正确判断。
提取左公因子
有左因子的文法
A→αβ1 | αβ2
等价于
A →A’( β1 | β2)
提左因子
A →αA’ A→ β1 | β2
一般定义:
A→δβ1
|δβ
2
|…|δβ
n
|γ
1
|γ
2
|…|γ
m
(每个
γ不
以
δ
开头)
可改写为
A→δA’|γ1
|γ
2
|…|γ
m
A’→β1
|β
2
|…|β
n
这个左公因子有两种形式:显示和隐式的!!!接下来两个例子会讲述这个问题。
例子1:
文法G[S] S →
aSb | aS | ε
请判断该文法是否为LL(1)文法?
解:该文法不是LL(1)文法。
提左因子
S →
aS(b| ε)
S →
ε
引入S’转换成
S →
aSS’
S’→
b| ε
S →
ε
注意:这里只是举例子讲述原理定义不去判断是否是LL(1)文法!!!具体判断可以参考
LL(1)文法定义及判别_用编程写诗的博客-优快云博客
例子2:
文法 G[A]
A →
ad | Bc
B
→
aA | bB
请判断该文法是否为LL(1)文法?
解:含有隐含左公因子
第一次改写后
G[A] A →
ad | aAc | bBc
B →
aA | bB
我们发现还是有公因子的接着提公因子后
A →
aA’| bBc
A’→
d| Ac
B →
aA | bB
这个才是最终的结果!!!
消除左公因子小结
经过提取左公因子之后,有些文法从非
LL(1)
文法
变为
LL(1)
文法,有的仍不是
LL(1)
文法。因此,文
法不
含左公共因子只是
LL(1)
文法的必要条件
。
对于隐含的左公因子,可先等价变换为明确的左公
因子之后,再进行提取。
经过提取左公因子之后,有时会使某些规则变为多
余规则
,故必须检查提取左公因子之后
的文法,去除多余规则。
个别文法不能在有限步之内提取完左公因子。
2
消除左递归
含有左递归的文法
若文法中含有形如
a)
A
→
A
β(A
∈
V
N
, β∈
(V)*)
的规则
b)
A
→Bβ B→
A
α
的规则
那么
在
a)
中含有左递归的规则,称为
直接左递归
在
b)
中虽然没有含左递归的规则,
但
A=>
Bβ
=>
Aα
β
即
A
=>
+
A
…,
称为
间接左递归
含有左递归的文法不是一个LL(1)文法证明:
以直接左递归为例,若有如下产生式
A→A α
| A→β
其中
, α
和β
为任意语法符号串。
不难证明有下面关系式:
First( β )⊆
First( A α )⊆
Select( A→A α)
First( β
)⊆
Select( A→ β
)
由于
A→A α
和
A→ β
的
Select
集相交,故含有左递归的
文法不是
LL(1)
文法
对于产生式
P→
Pα|β (
串的特点
βα
. . .
α)
α不
为
ε
,
β不
以
P开头,则可改写规则为:
P
→
βP’
P’→αP’| ε
例:S
→
Sa|b
可改写为:
S→bS’
S’ →aS’| ε
消除直接左递归一般定义
P →
Pα
1
|Pα
2
|…|Pα
m
|β
1
|β
2
|…|β
n
其中每个
α
均不等于
ε
,每个
β不
以
P
开头,则:
P →
β
1
P’|β
2
P’|…|β
n
P’
P’→
α
1
P’|α
2
P’|…|α
m
P’|ε
注意:
(1)利用这种方法可以把
直接左递归
都消去,即换成右递归。
(2)但是,这种方法并没有消除整个文法的左递归性。
间接左
递归
仍会存在
消除间接左递归
先将
间接
左递归等价
变换
为等价的
直接
左递归
后再消除左递归
eg:
G[A]
A →
aB | Bb
B →
Ac | d
将规则
1,2
代入
3
中
先变换成直接左递归
A →
aB | Bb
B →
aBc | Bbc
|
d
再消除
B
的直接左递归
A →
aB | Bb
B →
aBcB’
| dB’
B’
→
bcB’ |
ε
消除左递归
小结
消除左递归之后,有些文法从非
LL(1)
文法变为
LL(1)
文法,有的仍不是
LL(1)
文法。因此,文法不
含左公共因子只是
LL(1)
文法的必要条件。
消除左递归之后,有时会使某些规则变为多余规则,
故必须检查消除左递归之后的文法,去除多余规则
消除左递归的文法在形式上可能不同,但均等价。