語法分析程式分為自頂向下和自底向上兩種。
語法分析程式的基本目標如下:
1.能夠清楚而準確地報告發現的錯誤,如錯誤的位置和性質。
2.能夠迅速地從錯誤中恢復過來,以便繼續診斷後面可能存在的錯誤。
3.錯誤處理功能不應該明顯地影響編譯程式對正確程式的處理效率。
自頂向下分析方法是一種面向目標的分析方法,該方法從文法開始符開始,試圖推導出與輸入符號完全匹配的句子。該方法又分為確定的和不確定的兩種。
有效的無回溯的自頂向下分析程式常稱之為**分析程式。
由於分析時對輸入符號串的掃瞄是自左向右進行的,為保證能夠按照掃瞄的順序去匹配輸入的符號串,採用最左推導好些。但是這種方法要消除左遞迴,同時回溯浪費時間較多。
下面介紹first集的求法:
1.終結符的first集是其本身
2.非終結符的first集是由其推出的開頭終結符或者空串
3.非終結符a如果能推出非終結符b並且b不在a能推出的終結符之後,則將b的first集併入a的first集
例如:其中@表示空串
終結符:
i + * ( ) #
非終結符
e a t b f
產生式:
e→ta
a→+ta|@
t→fb
b→ * fb|@
f→(e)|i
求出的first集如下:
非遞迴**分析程式用到:乙個輸入緩衝區。乙個分析棧。一張分析表。其核心是**分析程式,此外還有輸出流。
注意:這裡分析的符號串只能含有終結符,並且要消除左遞迴。從開始符開始推,根據**分析表的式子推即可,推不動或者與符號串不匹配就是語法錯誤。
下面介紹follow集的求法:
1.終結符沒有follow集
2.對於產生式:a->abc,將除去空串的first(c)加入follow(b)中
3.對於產生式:a->ab或者a->abc,(其中c可以推導出空串,c=>空串),則將follow(a)加入follow(b)中
4.把所有的follow集都補上美元符號。
注意:2.3中的c可以是終結符也可以是非終結符
例如:其中@表示空串
終結符:
i + * ( ) #
非終結符
e a t b f
產生式:
e→ta
a→+ta|@
t→fb
b→ * fb|@
f→(e)|i
求出的follow集如下:
對於g中的每乙個產生式, a -> α ,執行以下2步:
for ∀ a ∈ first(α),
}注意:a可以是空串
例如:其中@表示空串
終結符:
i + * ( ) #
非終結符
e a t b f
產生式:
e→ta
a→+ta|@
t→fb
b→*fb|@
f→(e)|i
求出的**分析表如下:
編譯原理第二版3 4答案
給出識別練習 3.3.2 中各個正規表示式所描述的語言狀態轉換圖。解答解答步驟 nfa dfa 最少狀態的 dfa 狀態轉換圖 最少狀態的 dfa 狀態轉換圖 合併不可區分的狀態 b 和 d c 最少狀態的 dfa 狀態轉換圖 合併不可區分的狀態 a 和 c 給出識別練習 3.3.5 中各個正規表示...
編譯原理第二版4 3答案
下面是乙個只包含符號 a 和 b 的正規表示式文法。它使用 替代表示並運算的字元 以避免和文法中作為元符號使用的豎線相混淆 rexpr rexpr rterm rterm rterm rterm ctor ctor ctor ctor rprimary rprimary a b對這個文法提取左公因子...
opencv交叉編譯第二版
主機 ubuntu 12.04 32bit tar xvf arm 2009q3 gcc.tg.bz2 c 預設指定的跟檔案目錄 sudo gedit etc profile source etc profile 修改檔案 export path paht opt friendly toolscha...