1. 程式人生 > >編譯原理之證明LL(1)文法

編譯原理之證明LL(1)文法

LL(1)文法的證明方法

一個文法G是LL(1)的,當且僅當G的任意兩個不同的產生式A -> α | β 滿足下面的條件:
1. 不存在終結符號a使得α 和 β 都能夠推匯出以a開頭的串。
2. α 和 β中最多隻有一個可以推匯出空串。
3. 如果 β =>* ε,那麼α不能推匯出任何以FOLLOW(A)中某個終結符號開頭的串。類似的,如果 α =>* ε,那麼β不能推匯出任何以FOLLOW(A)中某個終結符號開頭的串。

前面兩個條件等價說FIRST(α) 和FIRST(β)是不相交的集合。第三個條件等價於說如果ε在FIRST(β)中,那麼FIRST(α)和FOLLOW(A)是不相交的集合,並且當ε在FIRST(α)中時類似結論成立。

舉個小栗子

文法G[E]:
1. E -> TE’
2. E’-> +E| ε
3. T -> FT’
4. T’-> T| ε
5. F -> PF’
6. F’ -> *F’| ε
7. P -> (E) | a | b | ∩
證明該文法是LL(1)文法

(1) FIRST集合(這裡只求非終結符號的FIRST集合)

FIRST(E) = { ( , a , b , ∩ }
FIRST(T) = { ( , a , b , ∩ }
FIRST(F) = { ( , a , b , ∩ };
FIRST(P) = { ( , a , b , ∩ };
FIRST(E’) = { + , ε };
FIRST(T’) = { ( , a , b , ∩ , ε };
FIRST(F’) = { * , ε };

(2) FOLLOW集合

FOLLOW(E) = FOLLOW(E’) + { ) ,$}
FOLLOW(E’) = FOLLOW(E) = { ) ,\$ }
FOLLOW(T) = FIRST(E’) / ε +FOLLOW(T’) = { + , ) , \$ }
FOLLOW(T’) = FOLLOW(T) = { + , ) , \$ }
FOLLOW(F) = FIRST(T’) / ε +FOLLOW(T) = { ( , a , b , ∩ , + , ) ,\$ }
FOLLOW(F’) = FOLLOW(F) = { ( , a , b , ∩ , + , ) ,\$ }
FOLLOW(P) = FIRST(F’) / ε + FOLLOW(F) = {* , ( , a , b , ∩ , + , ), \$ }

(3) 證明是LL(1)文法
對於E’-> +E’| ε ,( FIRST(+E’) = { + } ) ∩ ( FIRST( ε ) = { ε } )= ∅
對於T’-> T| ε ,( FIRST(T) = { ( , a , b , ∩ } ) ∩ ( FIRST( ε ) = { ε } )= ∅
對於F’ -> *F’| ε ,( FIRST(*F’) = { * } ) ∩ ( FIRST( ε ) = { ε } )= ∅
對於P -> (E) | a | b | ∩ ,( FIRST( (E) ) = { ( } ) ∩ ( FIRST( a ) = { a } ) ∩ ( FIRST( b ) = { b } ) ∩ ( FIRST( ∩ ) = { ∩ } )= ∅

對於E’-> +E| ε , (FIRST(+E) = { + }) ∩ (FOLLOW(E’) = { ) ,$ }) = ∅
對於T’-> T| ε , (FIRST(T) =( , a , b , ∩) ∩ (FOLLOW(T’) = {+ , ) , $ }) = ∅
對於F’ -> *F’| ε , (FIRST(*F’) = { * }) ∩ (FOLLOW(F’) = { ( , a , b , ∩ , + , ) ,$ }) = ∅

得證,該文法是LL(1)文法。

小練習

下面哪些文法是LL(1)的,並說明理由
(1) 文法:
1. S -> Abc
2. A -> a | ε
3. B -> b | ε

(2) 文法:
1. S -> ABBA
2. A -> a | ε
3. B -> b | ε

(1)該文法不含有左遞迴
FIRST集合

FIRST(S) = {a , b , ε }
FIRST(A) = {a , ε }
FIRST(B) = {b , ε }

FOLLOW集合

FOLLOW(S) = { $ }
FOLLOW(A) = {b}
FOLLOW(B) = { }

對於A -> a | ε ,FIRST(a) ∩ FIRST( ε ) = ∅
對於B -> b | ε ,FIRST(b) ∩ FIRST( ε ) = ∅
FIRST(a) ∩ FOLLOW(A) = ∅
FIRST(b) ∩ FOLLOW(B) = ∅

符合LL(1)文法的要求,是LL(1)文法。

(2)該文法不含有左遞迴
1. S -> ABBA
2. A -> a | ε
3. B -> b | ε
FIRST集合

FIRST(S) = {a , b , ε }
FIRST(A) = {a , ε }
FIRST(B) = {b , ε }

FOLLOW集合

FOLLOW(S) = { $ }
FOLLOW(A) = {a , b , $}
FOLLOW(B) = {a , b , $ }

因為 A -> a | ε ,FIRST(a) ∩ FOLLOW(A) ≠ ∅
因為 B -> b | ε,FIRST(b) ∩ FOLLOW(B) ≠ ∅

不符合LL(1)文法的要求,不是LL(1)文法