編譯原理 學習記錄4

2021-10-09 23:18:17 字數 3610 閱讀 2172

直接遞迴:呈現出u→x

uy

u\rightarrow xuy

u→xu

y形式的文法產生式

間接遞迴:具有u⇒∗

xu

yu\mathop\rightarrow\limits^* xuy

u⇒∗xuy

形式的推導

產生式呈u→u

yu\rightarrow uy

u→uy

形式如果是經過多步推導得到,則稱之為文法/間接左遞迴

產生式呈u→x

uu\rightarrow xu

u→xu

形式同左遞迴,如果是多步推導得到的,則稱之為文法/間接右遞迴

使用有限的產生式,描述無限的句子——用有窮表示無窮

對於兩個文法g1,

g2

g_1,\ g_2

g1​,g2

​,如果l(g

1g_1

g1​)=l(g

2g_2

g2​),則g

1g_1

g1​與g

2g_2

g2​是等價文法

弱等價:符號和順序相同(此處涉及弱等價)

強等價:符號、順序和語義都相同

左遞迴和右遞迴,對應左結合和右結合

越靠近語法樹下端,運算的優先順序越高

優先順序更高的運算更晚被推導得到

如果文法g在推導某乙個句子的過程中,能夠得到兩種及以上不同的語法樹(無論最左最右推導:最左推導得到的語法樹,和最右推導得到的語法樹不一樣,也算是兩種語法樹),則稱該文法是二義性文法。

消除二義性通常有兩種方法:

1、對語義增加限制

2、重新構造乙個等價的無二義性文法

通常在if-else語句中,為了提高可理解性,還是使用有二義性文法。通過對語義加上限制來消除二義性

二義性文法不可判定:不存在乙個演算法,使得能夠在有限的步驟內,確切地判定乙個文法是否為二義性的

1、文法不能含有有害產生式:u→u

u\rightarrow u

u→u2、文法不能含有多餘產生式:一種是從開始符號出發的所有推導都不會用到的產生式(不可達非終結符號),另一種是無法推導出終結符號串的產生式

從開始符號出發,不斷建立直接推導,試圖構造乙個最左推導序列,最後推導出與輸入符號串相同的符號串

從待輸入的符號串開始,利用文法的產生式逐步向上規約,試圖規約到文法的開始符號

有限狀態、有限輸入、有開始有結束

是一種能進行運算並實現自我控制的裝置

對於2型文法(上下文無關語言),使用下推自動機進行識別;而對於3型文法(正則語言),使用有窮自動機進行識別

定義:dfa=(q, σ

\sigma

σ, t, q

0q_0

q0​, f)

其中,q是有窮非空的狀態集,σ

\sigma

σ是有窮的輸入字母表,t是對映q×σ

→q

q\times \sigma\rightarrow q

q×σ→q,q0∈

qq_0\in q

q0​∈

q是開始狀態,而f⊆

\subseteq

⊆ q是非空終止狀態集合

有狀態轉換表和狀態轉換圖兩種表示方式

例如:dfa a=(, , t, q

1q_1

q1​, )以及對映t(圖1:狀態轉換表):

圖1 狀態轉換表

表示共有q

1q_1

q1​, q

2q_2

q2​, q

3q_3

q3​, q

4q_4

q4​這四種狀態,輸入為0或1,開始狀態為q

1q_1

q1​,結束狀態為q

3q_3

q3​, q

4q_4

q4​。用圓表示狀態,start指向開始狀態,雙圓表示結束狀態,輸入導致的狀態轉換使用箭頭表示,即可得到狀態轉換圖(圖2):

圖2 狀態轉換圖

dfa的擴充:擴充為能夠接受符號串,接受方式為從左到右逐字元接收

例如:對於上述dfa,輸入0011,則:t(q

1q_1

q1​, 0011)=t(t(q

1q_1

q1​, 0), 011)=t(q

1q_1

q1​, 011)=……=t(q

1q_1

q1​, 11)=……=t(q

2q_2

q2​, 1)=q3∈

fq_3\in f

q3​∈f

擴充的對映:t:q

×σ∗→

qt:q\times\sigma^* \rightarrow q

t:q×σ∗

→q,注意到此處原有對映中的σ

\sigma

σ被替換為σ

∗\sigma^*

σ∗,即此時能夠接受符號串,而不僅侷限於**於字母表中的單個符號

dfa中的「確定」,代表開始狀態是唯一的,且輸入字母唯一地確定了下乙個狀態

定義:nfa=(q, σ

\sigma

σ, t, q

0q_0

q0​, f)

其中,q是有窮非空的狀態集,σ

\sigma

σ是有窮的輸入字母表,t是對映q×σ

→q

q\times \sigma\rightarrow q

q×σ→

q的冪集,q0∈

qq_0\in q

q0​∈

q是開始狀態集,而f⊆

\subseteq

⊆ q是非空終止狀態集合

注意到與dfa不同的地方:1、對映的右端是q的冪集(即集合內的元素不再是乙個單獨的狀態,而是可能有多個狀態。也就是說,接受輸入後,可以到達多個狀態);2、開始狀態變為了開始狀態集,說明開始狀態不再僅僅侷限於乙個

nfa的擴充

擴充的對映:t(q

,β)=

t(q,

aα)=

t(q1

,α)∪

t(q2

,α).

..

t(q,\ \beta)=t(q,\ a\alpha)=t(q_1,\ \alpha)\cup t(q_2,\ \alpha)...

t(q,β)

=t(q

,aα)

=t(q

1​,α

)∪t(

q2​,

α)..

.。其中,a

aa是β

\beta

β中的第乙個元素,q1,

q2..

.q_1,\ q_2...

q1​,q2

​...

是狀態q

qq接受輸入a

aa後可能達到的新狀態,這些狀態的並集就是全部可能到達的狀態

1、確定輸入字母

2、確定關鍵狀態(模擬識別過程)

3、確定狀態間的轉換關係

4、確定開始和終止狀態

不合法的狀態不在圖內顯示

nfa的確定化

到達的狀態

1、確定輸入字母

2、確定關鍵狀態(模擬識別過程)

3、確定狀態間的轉換關係

4、確定開始和終止狀態

不合法的狀態不在圖內顯示

編譯原理 學習記錄11

上回,為了解決移進 規約時的幾個問題,引入了幾個定義 短語 設有文法g z w xuy是它的乙個句型,如果有 z xu yz mathop rightarrow limits xuy z xuy 並且u uu mathop rightarrow limits u u u 則稱句型xuy中子串u為句型...

編譯原理 學習記錄6

正規集 字母表 sigma 上的正規表示式e,所描述的語言集合l e 從e到l e 的變換有如下規則 el e epsilon empty a e 1e 1 e1 l e 1e 1 e1 e 1e 2e 1e 2 e1 e2 l e 1e 1 e1 l e 2e 2 e2 e 1e 1 e1 e 2...

編譯原理 學習記錄1 程式編譯過程

前端 該階段的編譯工作主要依賴源程式,與目標機無關。語法分析 在詞法分析基礎上,將單詞序列分解成各類語法短語 也稱語法單位,如 程式 語句 表示式 可表示成語法樹 推導樹 通過語法分析,確定乙個輸入串是否構成乙個語法上正確的程式。即 經語法分析可以得到乙個分析樹。問 如何根據單詞序列構造語法分析樹?...