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) =(2) follow集合first(t) =
first(f) = ;
first(p) = ;
first(e』) = ;
first(t』) = ;
first(f』) = ;
follow(e) = follow(e』) +注:關於first集合和follow集合的計算,請參照這篇部落格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集合
(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) =follow集合first(a) =
first(b) =
follow(s) =對於a -> a | ε ,first(a) ∩ first( ε ) = ∅follow(a) =
follow(b) =
對於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) =follow集合first(a) =
first(b) =
follow(s) =因為 a -> a | ε ,first(a) ∩ follow(a) ≠ ∅follow(a) =
follow(b) =
因為 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 表...