編譯原理 龍書第二版 3 3節練習 部分習題解答

2021-10-02 22:05:46 字數 2799 閱讀 2671

練習3.3.5 寫出下列語言的正則定義:

1)2)比較簡單,就不寫出答案了

3)注釋,即/* 和 */ 中間的串,且串中沒有不在雙引號"裡面的*/

這道題是說,/* 和 */ 中間的內容可能會出現 「*/」

解答:\/\*([^"*/]|\"\*\/\")*\*\/

首先,注釋由是 /* 和 */包圍的,再因為/、*是正規表示式保留字,所以要轉義:\/\* \*\/。然後,裡面是([^"*/]|\"\*\/\")*。這個正規表示式表明要匹配除"*/之外的字元([^"*/])或者(|)字串 「 「*/」 」(\"\*\/\")。

!!4)所有不重複數字組成的字串

(?!.*?(\d).*?\1.*?$)\d+

這個正規表示式親測可用,首先(?!exp)\d+的意思是斷言exp後面的數字串(\d+)無法匹配exp。也就是說,對於這一題,exp匹配重複的數字。

再看exp的表示式,.*?(\d).*?\1.*?$,首先匹配了任意的0個或多個字元(.*),後面的?代表的是這次匹配使用懶惰模式,即匹配最短的串。也就是說,.*?匹配的是最短的任意字元組成的串。然後\1表示引用前面(\d)的匹配結果,也就是說,.*?(\d).*?\1.*?$表示的是在乙個串內同乙個數字至少重複兩次,$表示的是要匹配到整個字串的結尾。再配合上前面的(?!exp)\d+,exp表示匹配有重複數字的串,那麼這整個表示式(?!.*?(\d).*?\1.*?$)\d+自然就是匹配所有不重複數字組成的字串了。

!!5) 最多有乙個重複數字組成的串

(?!.*?(\d).*?\1.*?\1.*?$)\d+

沿用上題的結論,我們要想出exp的表示式,我們首先想到「最多有乙個重複數字組成的串」的否定形式是「有2個及以上重複數字組成的串」,我們可以取這個否定命題的簡單情況「有三個重複的數字組成的串」,而如果我們找到了三個重複的數字就一定可以推導出這是「有2個及以上重複數字組成的串」。因此exp要做到的推斷就是「有三個重複的數字」。

因此可以寫出對應的正規表示式:(?!.*?(\d).*?\1.*?\1.*?$)\d+

!!6) 所有由偶數個a和奇數個b構成的串

我們首先在習題3.3.2的!!5)看到了偶數個a、偶數個b的表示方法:

(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

首先(aa|bb)*表示的是兩個字元連著出現(出現偶數次)的情況。由於a b兩個字元在串**現的情況無非aa、ab、ba、bb四種情況,因此我們在後面定義了ab、ba出現的情況。(ab|ba)表示的是ab或者ba出現一次的情況,然後他的前面、後面可能會出現0次或者多次兩個字元連著出現並且出現偶數次的情況,即(aa|bb)*(ab|ba)(aa|bb)*。又由於題目要求a、b都要出現偶數次,而上述的表示式中不是a出現奇數次就是b出現奇數次,因此我們要重複(ab|ba)。同樣的,考慮到它的後面可能會出現兩個字元連著出現並且出現偶數次的情況,整個正規表示式最後的結果是(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

我們在上述討論的基礎上繼續**如何匹配所有由偶數個a和奇數個b構成的串。

我們首先定義上述正則:

even_ab ->(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

然後考慮如何使得讓b變為奇數個。我們可以發現,若是我們在上述表示式前加b,那麼就得到了匹配以b開頭的偶數a、奇數b的正則定義。即:

even_a_odd_b_withprefix_b ->b(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

我們再考慮在even_ab前面加a的情況,那麼就得到了匹配以a開頭的偶數b、奇數a的正則定義。即:

even_a_odd_b_withprefix_a1 ->a(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

此時我們為了使得a、b奇偶性倒過來,結合上面的討論,我們自需要再加上(ab|ba)(aa|bb)*即可,即:

even_a_odd_b_withprefix_a ->a(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

最終的正則定義是:

even_a_odd_b -> even_a_odd_b_withprefix_a | even_a_odd_b_withprefix_b

even_a_odd_b_withprefix_b ->b(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

even_a_odd_b_withprefix_a ->a(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

even_ab ->(aa|bb)*((ab|ba)(aa|bb)*(ab|ba)(aa|bb)*)*

編譯原理第二版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對這個文法提取左公因子...

靠!龍書第二版兩天前上架了

更新,原來書預定於8月31號上架。現在只能預訂。一不小心,預訂了兩本書,被天殺的amazon壓貨了。這裡有賣。每個寫過編譯器的老大都知道這本書吧?不要告訴我你的龍書沒有翻起毛邊。預告了一下,轉眼一年就過去了。不得不感嘆歲月無情。這兩天業界牛人joel spolsky推出一篇帖子language wa...