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