下面是乙個只包含符號 a 和 b 的正規表示式文法。它使用 + 替代表示並運算的字元 | ,以避免和文法中作為元符號使用的豎線相混淆:
rexpr -> rexpr + rterm | rterm
rterm -> rterm ***ctor | ***ctor
***ctor -> ***ctor * | rprimary
rprimary -> a | b
對這個文法提取左公因子。
提取左公因子的變換能使這個文法適用於自頂向下的語法分析技術嗎?
提取左公因子之後,從原文法中消除左遞迴。
得到的文法適用於自頂向下的語法分析嗎? 解答
無左公因子
不適合消除左遞迴
rexpr -> rterm a
a -> + rterm a | ε
rterm -> ***ctor b
b -> ***ctor b | ε
***ctor -> rprimary c
c -> * c | ε
rprimary -> a | b
適合?對下面的文法重複練習 4.3.1
練習 4.2.1 的文法
練習 4.2.2-1 的文法
練習 4.2.2-3 的文法
練習 4.2.2-5 的文法
練習 4.2.2-7 的文法 解答
s -> s s + | s s * | a
提取左公因子
s -> s s a | a
a -> + | *
不適合消除左遞迴
// initial status
1)s -> s s a | a
2) a -> + | *
// i = 1
1) s -> a b
2) b -> s a b | ε
3) a -> + | *
// i = 2, j = 1
1) s -> a b
2) b -> a b a b | ε
3) a -> + | *
// i = 3, j = 1 ~ 2
// nothing changed
適合s -> 0 s 1 | 0 1
提取左公因子
s -> 0 a
a -> s 1 | 1
不適合,有間接左遞迴
消除左遞迴
// initial status
1) s -> 0 a
2) a -> s 1 | 1
// i = 1
// nothing changed
// i = 2, j = 1
1) s -> 0 a
2) a -> 0 a 1 | 1
合適s -> s (s) s | ε
無左公因子
不合適消除左遞迴
// initial status
1) s -> s (s) s | ε
// i = 1
1) s -> a
2) a -> (s) s a | ε
// i = 2, j = 1
// nothing changed
合適s -> (l) | a 以及 l -> l, s | s
無左公因子
不合適消除左遞迴
// initial status
1) s -> (l) | a
2) l -> l, s | s
// i = 1
// nothing changed
// i = 2, j = 1
1) s -> (l) | a
2) l -> (l) a | a a
3) a -> , s a | ε
// i = 3, j = 1~2
// nothing changed
合適下面文法的目的是消除 4.3.2 節中討論的 「懸空-else 二義性」:
stmt -> if expr then stmt
| matchedstmt
matchedstmt -> if expr then matchedstmt else stmt
| other
說明這個文法仍然是二義性的。
解答看一段示範**,我們通過縮進來表示**解析的層次結構
if expr
then
if expr
then matchedstmt
else
if expr
then matchedstmt
else stmt
這段**還可以被解析成
if expr
then
if expr
then matchedstmt
else
if expr
then matchedstmt
else stmt
所以這仍然是乙個二義性的文法。原因在於matchedstmt -> if expr then matchedstmt else stmt
中的最後乙個stmt
,如果包含else
語句的話,既可以認為是屬於這個stmt
的,也可以認為是屬於包含這個matchedstmt
的語句的。 編譯原理第二版3 4答案
給出識別練習 3.3.2 中各個正規表示式所描述的語言狀態轉換圖。解答解答步驟 nfa dfa 最少狀態的 dfa 狀態轉換圖 最少狀態的 dfa 狀態轉換圖 合併不可區分的狀態 b 和 d c 最少狀態的 dfa 狀態轉換圖 合併不可區分的狀態 a 和 c 給出識別練習 3.3.5 中各個正規表示...
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...
編譯原理與技術(第二版)個人總結3
語法分析程式分為自頂向下和自底向上兩種。語法分析程式的基本目標如下 1.能夠清楚而準確地報告發現的錯誤,如錯誤的位置和性質。2.能夠迅速地從錯誤中恢復過來,以便繼續診斷後面可能存在的錯誤。3.錯誤處理功能不應該明顯地影響編譯程式對正確程式的處理效率。自頂向下分析方法是一種面向目標的分析方法,該方法從...