句型分析
- 句型分析是一個識別輸入符號串是否為語法上正確的程序的過程
- 在語言的編譯實現中,把完成句型分析的程序稱為分析程序或識別程序,分析算法又稱識別算法
該書介紹的都是從左到右的分析算法,從左到右地識別輸入符號串
兩大類分析算法
- 自頂向下,從文法開始符號出發,反復使用各種產生式,尋找"匹配"於輸入符號串的推導 (正着推)
- 自底向上,從輸入符號串開始,逐步進行"歸約",直至歸約到文法的開始符號 (反着推)
- 從構造語法樹的角度看,自頂向下,從樹根開始構造;自底向上,從末端結點開始構造
自頂向下的分析方法
例題2.9 考慮文法G[S]
- S→sAd
- A→ab
- A→a
S=>cAd=>cabd
自底向上的分析方法
例題2.9中的文法來為輸入符號 cabd 構造語法樹
句型分析的有關問題
在自頂向下分析方法中,回溯
- 從各種可能的選擇中隨機挑選一種,並希望它是正確的
- 如果它是錯誤的,必須退回去,再試另外的選擇
在自底向上分析方法中,句柄
- 需要精確定義"可歸約串",稱為句柄
- 令G是一個文法,S是文法的開始符號,αβδ是文法G的一個句型
- 若有S
αAδ 且 A
β,則稱β是句型αβδ相對於非終結符號A的短語
- 如果有 A=>β,則稱β是句型αβδ相對於規則 A→β 的直接短語(簡單短語)
-
一個右句型的直接短語,稱為該句型的句柄,句柄的概念只適用於右句型
-
若所考慮的文法是無二義的,每個右句型有唯一的最右推導,句柄是唯一的;對於二義文法,右句型可能有 多個句柄
- 對於無二義文法,一個右句型的唯一句柄是其所有直接短語中最左邊的那一個,該句型的最左直接短語即是它的句柄
舉例
考慮例2.8 中的無二義文法G[E]的一個句型 i*i + i,將句型寫作 i1 * i2 + i3 ,因為有 E F * i2 + i3,且 F => i1,則稱 i1 是句型 i1 * i2 + i3 的相對於非終結符號F的短語,也是相對於規則 F→i 的直接短語
有關文法應用的一些說明
有關文法的實用限制
在實際應用中,應限制文法不得含有 有害規則 和 多余規則
- 有害規則,形為U→U的產生式,會引起文法的二義性
- 多余規則,文法中那些連一個句子的推導都用不到的規則,以兩種形式出現
- 第一種是文法中某些非終結符不在任何規則的右部出現,任何句子的推導中都不可能用到他
- 第二種是文法中的非終結符號,不能夠從它推導出終結符來
例題 2.10 有文法 G[S]:
- S→Be
- B→Ce
- B→Af
- A→Ae
- A→e
- C→Cf
- D→f
對文法G=(VN,VT,S,P)來說,為了保證其非終結符A在句子推導中出現,必須滿足以下兩個條件
- A必須在某句型中出現,有 S
αAβ,其中α、β∈(VN ∪ VT)*
- 必須能夠從A推出終結符號串t來,即 A
t,其中∈V*T
在該例中,
- 非終結符D不在任何規則右部,這種非終結符稱為不可到達
- 在文法中,不能夠推導出終結符號串來,這種非終結符稱為不可終止
上下文無關文法的ε規則
上下文中某些規則可具有形式 A→ε,其中A∈VN,這種稱為ε規則
定理2.1
- 若L是由文法G=(VN,VT,P,S)產生的語言,P中的每一個產生式的形式均為A→α,A∈VN,α∈(VN ∪ VT)*
- L能由這樣的一種文法產生,每一個產生式或者為A→β形式,其中A為一個非終結符,即 A∈VN,β∈(VN ∪ VT)+
- 或者為 S→ε,且S不出現再任何產生式的右邊
定理2.
- 如果G=(VN,VT,P,S)是一個上下文有關文法,則存在另一個上下文有關文法G1,它所產生的語言與G相同,其中G1的開始符號不出現在G1的任何產生式的右邊
- 如果G是一個上下文無關文法,也能找到一個上下文無關文法G1,如果G是一個正規文法,也能找到這樣一個正規文法G1