編譯原理與編譯構造 由語言構造文法2

2021-08-08 11:03:14 字數 1920 閱讀 5717

基本思想:產生的兩邊應該具有相同的特性

例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,那個撇不一定能看得清 具體推導過程如圖 此時可以推得構造表,但是此時是會有衝突的。我們只能強...