編譯原理之證明LL 1 文法

2021-08-18 13:52:33 字數 2764 閱讀 4349

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) =

first(t) =

first(f) = ;

first(p) = ;

first(e』) = ;

first(t』) = ;

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) =

follow(f』) = follow(f) =

follow(p) = first(f』) / ε + follow(f) =

注:關於first集合和follow集合的計算,請參照這篇部落格

編譯原理之計算first集合和follow集合

(3) 證明是ll(1)文法

對於e』-> +e』| ε ,( first(+e』) = ) ∩ ( first( ε ) = )= ∅

對於t』-> t| ε ,( first(t) = ) ∩ ( first( ε ) = )= ∅

對於f』 -> *f』| ε ,( first(*f』) = ) ∩ ( first( ε ) = )= ∅

對於p -> (e) | a | b | ∩ ,( first( (e) ) = ) ∩ ( first( a ) = ) ∩ ( first( b ) = ) ∩ ( first( ∩ ) = )= ∅

對於e』-> +e| ε , (first(+e) = ) ∩ (follow(e』) = ) = ∅

對於t』-> t| ε , (first(t) =( , a , b , ∩) ∩ (follow(t』) = ) = ∅

對於f』 -> *f』| ε , (first(*f』) = ) ∩ (follow(f』) = ) = ∅

得證,該文法是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) =

first(a) =

first(b) =

follow集合

follow(s) =

follow(a) =

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) =

first(a) =

first(b) =

follow集合

follow(s) =

follow(a) =

follow(b) =

因為 a -> a | ε ,first(a) ∩ follow(a) ≠ ∅

因為 b -> b | ε,first(b) ∩ follow(b) ≠ ∅

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

編譯原理實驗 LL(1)文法

目標任務 實現 ll 1 分析中控制程式 表驅動程式 完成以下描述算術表示式的 ll 1 文法的 ll 1 分析程式。g e e te e ate t ft t mft f e i a m 說明 終結符號 i 為使用者定義的簡單變數,即識別符號的定義。compiler3.cpp 定義控制台應用程式的...

LL 1 文法判斷

ll 1 文法判斷 題型 1.判斷該文法是否是ll 1 文法?2.若是,給出它的ll 1 分析表,否則說明理由。概念 對於產生式 a 1.如果 均不能推導出 空語句 則 first first 2.和 至多有乙個能推導出 3.如果 經過0步或多步可以推導出 則 first follow a 關鍵 求...

LL(1)文法解析

一 問題描述 給定上下文無關文法,對其進行解析,得出first集和follow集。在有能力的情況下,可以求出ll 1 分析表。二 演算法設計 本程式主要分成三塊內容,第一是文法的讀入解析,第二是first集的求解,第三為follow集的求解。文法的解析需要根據整行讀入的文法,生成rulelist 表...