編譯原理
- 正規(guī)式或NFA到DFA最小化
- 四元式DAG圖的優(yōu)化,根據(jù)要求寫(xiě)出優(yōu)化結(jié)果翻譯到目標(biāo)代碼
- 給你文法,給你句型,讓你寫(xiě)出最左推導(dǎo)和最右推導(dǎo),或者讓你畫(huà)出語(yǔ)法樹(shù),說(shuō)出素短語(yǔ),直接短語(yǔ)等(之類的東西)
- 給文法求firstvt lastvt first follow的過(guò)程
- 目標(biāo)代碼三種形式:絕對(duì)指令代碼,可重定位指令代碼,匯編指令代碼。
- 編譯程序開(kāi)發(fā)技術(shù):自編譯,交叉編譯,自展,移植
詞法分析
子程序大綱:把詞法分析作為語(yǔ)法分析的子程序
詞法分析器設(shè)計(jì)方法
- 通常分為五種:保留字,標(biāo)識(shí)符,常數(shù),運(yùn)算符,界符
- 詞法分析單詞的輸入輸出形式:輸入源程序字符串,輸出單詞符號(hào)序列,通常是二元式:(單詞種別,單詞自身的值)
- 關(guān)于單詞種別:保留字全體一種或者一字一種(更方便),標(biāo)識(shí)符統(tǒng)一一種,常數(shù)可以歸為一種,也可以按類型分類。運(yùn)算符一符一種或一種。單詞自身值:一符一種種就是值。
- 狀態(tài)轉(zhuǎn)換圖:p11有標(biāo)識(shí)符,無(wú)符號(hào)數(shù)和無(wú)符號(hào)整數(shù)的狀態(tài)轉(zhuǎn)換圖。終態(tài)有*代表多余的字符回退。
簡(jiǎn)單詞法分析器的示例
正規(guī)表達(dá)式和有限自動(dòng)機(jī)
- 正規(guī)表達(dá)式與正規(guī)集:對(duì)于給定的字母表(segema),正規(guī)式和正規(guī)集遞歸定義如下:
-
和
都是
上的正規(guī)式,它們所表示的正規(guī)集分別為{
}和
。
- 對(duì)任何一個(gè)a
,a是
上的一個(gè)正規(guī)式,它所表示的正規(guī)集為{a}。
- R和S是
上的正規(guī)式,它所表示的正規(guī)集為L(zhǎng)(R)和L(S),則:
- R|S(或運(yùn)算)是
上的正規(guī)式,它所表示的正規(guī)集為L(zhǎng)(R)
L(S)
- R
S.............L(R)L(S)
- (R)*是
上的正規(guī)式,他的正規(guī)集為(L(R))*
- R..................L(R)(L就是語(yǔ)言)
- R|S(或運(yùn)算)是
- 有限次使用上述規(guī)則 得到
上的正規(guī)式與正規(guī)集
-
- 關(guān)于上述規(guī)則的一系列說(shuō)明:
- 運(yùn)算順序中,*(閉包)大于
,
大于|
- 關(guān)于閉包運(yùn)算 R0={
},并令R*=R0
R1
......
- R+=RR*,R+被稱為R的正則閉包,不含
- 正規(guī)式的正規(guī)集相等,正規(guī)式等價(jià)R=S,包括交換律:R|S=S|R,結(jié)合律:R|(S|T)=(R|S)|T;R(ST)=(RS)T,分配律(不贅述),同一律:
R=R
=R
- 簡(jiǎn)單就是L(R|S)=L(R)
L(S),其他同理
- 運(yùn)算順序中,*(閉包)大于
簡(jiǎn)單的舉例:
= { a,b },求
上正規(guī)式R = a(a|b)*的正規(guī)集
方法:一層一層展開(kāi):L(a)L((a|b)*)=L(a)(L(a|b))*=L(a)(L(a)L(b))*={a}({a}
{b})*={a}{a,b}*={a}{
,a,b,aa,ab,ba,bb,aaa,……}={a,aa,……}
- 判斷正規(guī)式等價(jià)只需看正規(guī)集是否等價(jià)
- 有限自動(dòng)機(jī):更一般化的狀態(tài)轉(zhuǎn)換圖,分為確定有限自動(dòng)機(jī)DFA以及非有限自動(dòng)機(jī)NFA。
- DFA:是一個(gè)五元組Md = (S,
,f,
,Z}
- s是有限狀態(tài)集,每個(gè)元素是一個(gè)狀態(tài)
-
是有窮輸入字母表,每個(gè)元素都是一個(gè)輸入字符
- f是S
到S的單值映射,即f(si,a)=sj,si,si
S,a
- s0
S,是唯一的初態(tài)
- Z
S,是一個(gè)終態(tài)集
- NFA:也是五元組Mn=(S,
,f,Q,Z),S,
,Z與DFA意義相同,f是S
*到S子集的映射(可以多值以及
),Q
S,是一個(gè)非空初態(tài)集。
- DFA到狀態(tài)矩陣,很簡(jiǎn)單(這里不填了),NFA一樣,只不過(guò)填狀態(tài)集,或者空集(NFA從初始態(tài)到終止態(tài)的通路,有向邊上字符連接的串為FAM識(shí)別的語(yǔ)言,字符串集為L(zhǎng)(M),可以根據(jù)L(M)判斷兩個(gè)有限自動(dòng)機(jī)是否等價(jià))(DFA與NFA本質(zhì)相同可以互相轉(zhuǎn)化)
狀態(tài)\字符 | a | b |
---|---|---|
S0 | 這里填的是S幾(狀態(tài)) | |
S1 | ||
S2 |
-
正規(guī)式到NFA的構(gòu)造(根據(jù)這規(guī)則)
轉(zhuǎn)換規(guī)則.jpg
例子:
轉(zhuǎn)換例子.jpg
- NFA確定化(到DFA)
解讀例子
nfatodfa.jpg
方法:1. 先求初態(tài)閉包(所有經(jīng)
可達(dá)的都算,
不限,因?yàn)橐粋€(gè)
和多個(gè)一樣),當(dāng)然必須包括自己。之后求其經(jīng)a,b可達(dá)狀態(tài)集,(比如求a先到a之后再找新集合的
閉包得到新集合),重復(fù)之前操作,直到不再有新集合出現(xiàn)為止。
- DFA的化簡(jiǎn)
這是例題:dfa.jpg
- 首先分為終態(tài)集和非終態(tài)集(包含原初態(tài)為初態(tài),包含原終態(tài)為終態(tài)),之后經(jīng)過(guò)a,b是否 落在一個(gè)集合,不落則分開(kāi),經(jīng)過(guò)多次重復(fù)得到最終結(jié)果。(得到新的狀態(tài)轉(zhuǎn)換矩陣,不可達(dá)用橫杠代替)