基本思想:產生的兩邊應該具有相同的特性
例1:l=
解:s→
aa|b
b 這一步是說,句子可以以a|
b 開頭,之後加乙個a、
b 數量不等的式子
其中,s:
|a|=
|b|,
a:|a
|+1=
|b|,
b:|a
|=|b
|+1
a→aaa
這一步比較神,但是我的理解是這樣的,aa
這個表示式,滿足|a
|=|b
| ,因此直接是在
a 之前加了乙個aa
來進行擴充 a
→bs 這一步我是這麼理解的,其實與上一步沒有什麼區別,就是
s 滿足|a
|=|b
|,前面加乙個
b 進行擴充a→
b這是前面提過的特殊情況
也就是說a→
aaa|
bs|b
b→as|b
bb|a
同前面例2:l=
解:s→a′|
b′其中,a′
表示|a
|<|b
|,b′
表示|b
|<|a
| a
′→a|
aa′b
→b′|
bb′
其中,a:
|a|+
1=|b
|b:|
a|=|
b|+1
c→aa|b
b|ϵ a
→aaa
|bc|
b b
→ac|
bbb|
a
其中,c:
|a|=
|b|
可以看出,第2步就是例1
這是翟老師獨創的方法,主要用於解決奇偶性問題例:l
= 方法:
構造轉換圖
這一步其實是最重要的,但是目前沒有較好的展現形式
假設有n個符號關係到奇偶性,就有2n一系列的狀態用0、1來表示,0表示為奇數,1表示為偶數,例如abcd分別為奇偶偶奇,那麼就表示為1001個狀態
乙個狀態對應乙個節點,乙個轉換關係對應一條邊,如果通過一次變換能得到另外乙個狀態,那麼這兩個狀態之間有一條邊。在這裡,一次變換是指將其中的乙個1變成0,或者將其中的乙個0變成1。就比如,0000可以變成0001,也可以變成0010,也可以變成0100,也可以變成1000。很顯然,乙個長度為n的串所表示的任意乙個狀態,有n條邊與別的狀態相連,也就是有n條與別的點相連的邊。對於每個無關奇偶性的字元,每乙個點對每乙個字串增加乙個自環。例如題目中,d的奇偶性無關,那麼就直接在每個點上增加乙個d的自環。
注意,初始狀態需要在外面加乙個箭頭,表示起始;結束狀態需要在原來的圓外面再加乙個圓表示結束。
假設有n個符號關係到奇偶性,就有2n確定開始狀態和結束狀態⋅(n+
m)條邊
結束狀態為全零,開始狀態根據需要來確定
開始狀態為全零,結束狀態根據需要來確定
命名每個狀態
這裡就用abcd之類的來命名用s表示開始,其餘用大寫字母即可。
寫下每條邊的過程
由1中的結論,我們知道顯然是需要2n終態必須加上⋅(n+
m)條邊的,但是結束狀態還需要加一條邊,就是e→
ϵ ,因此總共需要寫2n
⋅(n+
m)+1
個式子
ϵ 產生式
綜合法就是綜合運用方法1-4
編譯原理與編譯構造 由NFA變為DFA
正規文法 形如 a aba a 缺點是不直觀 正規表示式 採用模板,好處是直觀 1 a r e 屬於特殊字元,re 2 if is re,are res 例 a,b 且倒數第3個是 a a b a a b a b 詞法分析 re fa 詞法分析程式 fa 狀態數目有限,是乙個有始有終的過程模型 fa...
編譯原理 NFA構造DFA
本題摘自北郵的編譯原理與技術。首先,根據此圖構造狀態轉換表 表中第一列第一行表示從第乙個符號b通過任意個空轉換能到達的節點,ia表示由此行的狀態陣列 可以看作0狀態 經過乙個a可以到達的節點,同理,ib表示由狀態陣列經過乙個b可以到達的節點。當然,有些人可能覺得和看作兩個狀態不合理,他們之間不是有交...
編譯原理與編譯構造 二義文法的處理 語義
本文依舊來自記筆記相當勤快的七公尺八同學。向他表示真誠的感謝!在前面的內容中,我們已經知道,想要解決二義文法的問題,必須新增附加條件。例 e e e e e e i 注意一下下圖中的i0 第一行式子是e e,那個撇不一定能看得清 具體推導過程如圖 此時可以推得構造表,但是此時是會有衝突的。我們只能強...