版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
2025/1/7編譯原理1計(jì)算機(jī)學(xué)院厚德和諧礪學(xué)創(chuàng)新編譯原理
CompilerPrinciples
任課教師:鄭麗萍2014-2015第2學(xué)期2025/1/7編譯原理2句型分析:就是識(shí)別一個(gè)符號(hào)串是否為某文法的句型,是某個(gè)推導(dǎo)(歸約)的構(gòu)造過程。分析程序(識(shí)別程序):在語言的編譯實(shí)現(xiàn)中,完成句型分析的程序。從左到右的分析算法:總是從左到右地識(shí)別輸入符號(hào)串,首先識(shí)別符號(hào)串中的最左符號(hào),進(jìn)而依次識(shí)別右邊的一個(gè)符號(hào),直到分析結(jié)束。
語法分析的方法一、基本概念2025/1/7編譯原理3自上而下分析法從文法的開始符號(hào)出發(fā),反復(fù)使用文法的產(chǎn)生式,為待識(shí)別句子建立一個(gè)最左推導(dǎo),以尋找與輸入符號(hào)串匹配的推導(dǎo)。自下而上分析法從輸入符號(hào)串開始,逐步進(jìn)行歸約,從葉子節(jié)點(diǎn),由底上向上逐步建立一棵完整的語法樹,直至歸約到文法的開始符號(hào)(樹根)。二、語法分析的兩種方法2025/1/7編譯原理4自頂向下分析方法的基本缺點(diǎn)不能處理具有左遞歸性的文法文法G,存在U∈VN,ifU==>U…,則G為左遞歸文法+
一、左遞歸文法
左遞歸文法回溯問題一般方法面臨問題及解決2025/1/7編譯原理5
要實(shí)行自頂向下分析,必須要消除文法的左遞歸,不僅消除直接左遞歸,而且消除間接左遞歸。
直接左遞歸
若P→P
α|β
α、β∈V*且β不以P開頭串的特點(diǎn) βα...α
間接左遞歸若P=>Pα
例如:S→Aa
A→Sb|b
*如果文法具有間接左遞歸,則也將發(fā)生上述問題。2025/1/7編譯原理6二、回溯問題1什么是回溯?
分析工作要部分地或全部地退回去重做叫回溯。
嚴(yán)重的效率低,只有在理論上的意義而無實(shí)際意義。U::=aβ1|a
β
2|a
β
32造成回溯的條件?3回溯帶來的問題?
文法中,對(duì)于某個(gè)非終結(jié)符號(hào)的規(guī)則其右部有多個(gè)選擇,并根據(jù)所面臨的輸入符號(hào)不能準(zhǔn)確的確定所要選擇時(shí),就可能出現(xiàn)回溯。2025/1/7編譯原理71)語法分析要重做2)語法處理工作要推倒重來
因此自頂向下的一般分析方法不能處理左遞歸、復(fù)雜的回溯技術(shù)、回溯導(dǎo)致語義工作推倒重來、難以報(bào)告出錯(cuò)的確切位置、效率低。欲采用此方法,必須:1、消除左遞歸;
2、消除回溯4效率低的原因2025/1/7編譯原理8消除文法的左遞歸產(chǎn)生式方法:改寫產(chǎn)生式,使產(chǎn)生式不含左遞歸。法一:P→Pα|β產(chǎn)生式的符號(hào)串為βα...α引入一元語言符號(hào){},{x}表示x可出現(xiàn)任意次。則:P→Pα|β改寫為P→β{α}例1:S→AcA→Aa|b
改為:S→AcA→b{a}一、消除直接左遞歸例2:E→E+T|TT→T*F|F
消除左遞歸:
E→T{+T}T→F{*F}2025/1/7編譯原理9法二:對(duì)左遞歸
A→Aα|β的非終結(jié)符A,引入一個(gè)新的非終結(jié)符A’,使得:
A→Aα|β
等價(jià)寫成:一般地:若其中βi均不以A打頭,則:A→βA’
A’→αA’|ε2025/1/7編譯原理10i)已知U→xy|xw|…|xz
解:U→x(y|w|…|z)
得:U→xU’U’→y|w|…|zii)已知U→x|xy
解:U→x(y|ε)法二步驟總結(jié)
使用提因子法,不僅有助于消除直接左遞歸。而且有助于壓縮文件的長(zhǎng)度,使我們更加有效的分析句子。Step1:提因子2025/1/7編譯原理11若:P→P
|
則可改寫為:P→
P’P’→
P’|ε例
E
E+T|T T
T*F|F F
(E)|id消除左遞歸后文法
E
TE
E
+TE
|
T
FT
T
*FT
|
F
(E)|id注意:此方法只能消除出現(xiàn)在產(chǎn)生式的全部直接左遞歸,不能消除經(jīng)兩步或多步推導(dǎo)所出現(xiàn)的一切間接左遞歸。Step1:將左遞歸規(guī)則改為右遞歸2025/1/7編譯原理12二、消除間接左遞歸1間接左遞歸產(chǎn)生原因產(chǎn)生式右邊首符號(hào)為非終結(jié)符;(存在回路)前面非終結(jié)符引用后面非終結(jié)符,后面非終結(jié)符引用前面非終結(jié)符。例1:S→Ac|c(1)
A→Bb|b(2)B→Sa|a(3)對(duì)例1:
B→Sa|a帶入(2),得A→Sab|ab|b
帶入S產(chǎn)生式,得S→Sabc|abc|bc|c
對(duì)S消除直接左遞歸得:
S→(abc|bc|c)S’S’→abcS’|ε2消除方法
找出所有引用前面非終結(jié)符的產(chǎn)生式進(jìn)行代換,即先變換成直接左遞歸。2025/1/7編譯原理13一、消除回溯的途徑
改寫文法對(duì)具有多個(gè)候選式右部反復(fù)提取左因子,使其具有不同首符號(hào)例1U→xV|xWU,V,W∈Vn,x∈Vt改寫為:
U→x(V|W)
更清楚表示
U→xZZ→V|W注意:要進(jìn)一步檢查V和W的首符號(hào)集是否相交,若相交,則要再次提取左因子?;厮莸南癓L(1)文法2025/1/7編譯原理14一般的,對(duì)于有公共左因子的文法A
a
1|a
2|…
a
k|γ,其中γ不以a開頭,
a∈V。提左因子:判斷adeS
aA
adA‘a(chǎn)de例:A
d|de|f改為:A
dA’|fA’
ε|e
A
aA
|γA
1|
2
|…
k若
1
2…
k還有某些候選式有相同首符號(hào),則依次提取,直到每個(gè)候選式的首符號(hào)不同為止。注意:提取公因子會(huì)引入大量非終結(jié)符和ε產(chǎn)生式?;厮莸南癓L(1)文法2025/1/7編譯原理151定義
FIRST(X)={a|a∈VT且Xa,X,∈V*}
特別的:X
,則
FIRST(X)
對(duì)文法G的所有非終結(jié)符的每個(gè)候選式X其首符號(hào)集為FIRST(X)。對(duì)A的任何兩個(gè)不同的選擇
i
和
j,希望有
FIRST(
i)
FIRST(
j)=
此時(shí),當(dāng)要求A匹配輸入串時(shí),A就可根據(jù)所面臨第一個(gè)輸入符號(hào)a,準(zhǔn)確指派某個(gè)候選式推導(dǎo),該候選式即為a∈FIRST(X)的X候選式。二、FIRST集**回溯的消除及LL(1)文法2025/1/7編譯原理162FIRST(X)構(gòu)造方法1).若X
V
,則FIRST(X)={X};2).若X
VN,且有X
a…,則{a}∪FIRST(X);a可為;3).若有X
Y1Y2…YK
,Yi
VN
(1≤i≤K),則
(FIRST(Y1)-{
})
∪
FIRST(X);
若
FIRST(Y1),則(FIRST(Y2)-{
})
∪
FIRST(X);同樣,若
FIRST(Yj)(1≤j<K),(FIRST(Yj+1)-{
})
∪
FIRST(X);特別的,若所有的FIRST(Yj)(j=1,2,…,K)均含有
,則把
加到FRIST(X)中。反復(fù)使用上述2、3步,直到每個(gè)符號(hào)的FIRST集不再增大為止。2025/1/7編譯原理171定義
FOLLOW(A)={a|S
…Aa…,a
VT}
特別的:若S
…A,則#
FOLLOW(A)
FOLLOW(A)={aS=>A且a∈
FRIST(),∈V*,
∈V*
}若S=>
uA,且
=>ε,則#∈FOLLOW(A)三、FOLLOW集對(duì)文法G的所有含有ε產(chǎn)生式的非終結(jié)符A定義它的FOLLOW(A)。對(duì)含有ε的A的所有候選式
i
,希望有
FIRST(
i
)
FOLLOW(A
)=
*****2025/1/7編譯原理181).文法的開始符號(hào)S,置{#}∪FOLLOW(S);當(dāng)A∈VN為句型的尾符號(hào)時(shí),則#∈FOLLOW(A)2).對(duì)于B
αAβ,則
(FIRST(β)-{})∪
FOLLOW(A);3).對(duì)于B
αA,或B
αAβ而
FIRST(β),則把FOLLOW(B)加至FOLLOW(A)中。反復(fù)使用2、3步,直到每個(gè)非終結(jié)符的FOLLOW集不再增大為止。2FOLLOW(A)構(gòu)造方法2025/1/7編譯原理19
四、LL(1)文法2、若β==>ε,則FIRST(α)∩FOLLOW(A)=Ф*定理:文法G是LL(1)文法的充分必要條件是:對(duì)于G的每一個(gè)非終結(jié)符A的任意兩條規(guī)則A→α|β,下列條件成立:1、FIRST(α)∩FIRST(β)=Ф2025/1/7編譯原理20
1LL(1)含義:
L:從左至右順序掃描輸入串;
L:按最左推導(dǎo)方式;
1:每一次推導(dǎo)均向前查看一個(gè)輸入符號(hào)準(zhǔn)確指派產(chǎn)生式。
2LL(1)文法性質(zhì):
沒有公共左因子;無二義性;不含左遞歸。對(duì)LL(1)文法,可構(gòu)造一個(gè)無回溯自頂向下語法分析程序,方法為:預(yù)測(cè)分析法(LL(1)分析法)2025/1/7編譯原理21LL(1)分析方法是一種比遞歸子程序法更有效的自頂向下分析方法。LL(1)分析使用一個(gè)下推棧而不是遞歸調(diào)用來完成分析。名稱中第一個(gè)L表示自左向右順序掃描輸入符號(hào)串,第二個(gè)L表示分析過程產(chǎn)生一個(gè)句子的最左推導(dǎo)。括號(hào)中的1表示每進(jìn)行一步推導(dǎo),只需要向前查看一個(gè)輸入符號(hào),便能確定當(dāng)前所應(yīng)選用的規(guī)則。
預(yù)測(cè)分析法2025/1/7編譯原理22LL(1)分析器由一個(gè)總控程序(表驅(qū)動(dòng)程序)、一張分析表(預(yù)測(cè)分析表、LL(1)分析表)和一個(gè)分析棧組成。輸入符號(hào)串:分析棧a1a2…………an#
XZS#LL(1)總控程序分析表輸出流棧中存放文法的符號(hào)串,棧底符號(hào)是#待分析串,從左到右掃描是一個(gè)兩維數(shù)組M[A,a],A是非終結(jié)符,a是終結(jié)符或#LL(1)分析的基本方法2025/1/7編譯原理23輸入符號(hào)串:指要分析的輸入符號(hào)串,它以右界符#作為結(jié)尾。分析棧:用來存放一系列文法符號(hào)。分析開始時(shí),先將#入棧,然后再將文法的開始符號(hào)入棧。輸出流:分析過程中使用的產(chǎn)生式序列??偪爻绦颍悍治銎鲗?duì)輸入串的分析靠總控程序完成.根據(jù)分析棧的棧頂符號(hào)X和當(dāng)前的輸入符號(hào)a,總控程序按照分析表的指示來決定分析器的動(dòng)作。工作過程如下:2025/1/7編譯原理24第一步初始化:分析開始時(shí),首先將符號(hào)#及文法的開始符號(hào)S依次置于分析棧的底部,并把各指示器調(diào)整至起始位置,如圖1所示。然后,反復(fù)執(zhí)行第二步的操作。
輸入符號(hào)串:
a1a2…………an#分析棧:
S#圖1分析開始時(shí)狀況第二步假設(shè)分析的某一步,分析棧及余留的符號(hào)串如圖2:aiai+1…………an##X1X2…Xm-1Xm
圖2分析進(jìn)行中的狀況2025/1/7編譯原理25(1)若Xm∈Vn,則查分析表的Xm行ai列,假設(shè)M[Xm,ai]為產(chǎn)生式Xm→Y1Y2…Yk,則將Xm出棧,并將Y1Y2…Yk反序入棧,如圖3;若M[Xm,ai]為ERROR,則出錯(cuò)。aiai+1…………an##X1X2…Xm-1YkYk-1…Y1
圖3反序入棧(2)若Xm=ai≠#,表示棧頂與掃描的符號(hào)匹配,則棧頂符號(hào)Xm出棧,輸入指示器指向下一個(gè)符號(hào),否則(即Xm≠ai)出錯(cuò)。(3)若Xm=ai=#,表示輸入串完全匹配,分析成功。2025/1/7編譯原理261分析表:可用一個(gè)二維數(shù)組表示,它的每一行與文法的一個(gè)非終結(jié)符相關(guān)聯(lián),每一列則與文法的一個(gè)終結(jié)符號(hào)或界符“#”相關(guān)聯(lián)。元素:M[A,a]=文法產(chǎn)生式|error(A∈VN,a∈VT∪{#})基本思想
當(dāng)文法中某一非終結(jié)符呈現(xiàn)在棧頂時(shí),根據(jù)當(dāng)前的輸入符號(hào),分析表應(yīng)指示要用該非終結(jié)符的哪一條候選式匹配輸入串(即進(jìn)行下一步最左推導(dǎo))
根據(jù)這個(gè)思想,我們可以構(gòu)造分析表算法!預(yù)測(cè)分析表的構(gòu)造2025/1/7編譯原理27
分析表元素M[A,a](A∈VN,a∈VT∪#),按下述規(guī)則確定:對(duì)于文法中的每個(gè)產(chǎn)生式A→γ1|γ2|……|γm1)若a∈First(γi),則置M[A,a]=“A→γi”2)若
∈First(γj),且a∈Follow(A),則M[A,a]=“A→
”3)除上述兩種情況外,其余的一切表元素均置為error。2預(yù)測(cè)分析表構(gòu)造算法預(yù)測(cè)分析表各元素含義為:或指出當(dāng)前推導(dǎo)所應(yīng)使用的產(chǎn)生式,或指出輸入符號(hào)串中存在著語法錯(cuò)誤.2025/1/7編譯原理28注:1)用分析表構(gòu)造算法可以為任意文法G構(gòu)造其分析表M2)若文法為非LL(1)文法,則構(gòu)造出的M包含有多重元素。則分析過程有回溯。可以證明:一個(gè)文法G的預(yù)測(cè)分析表不含多重元素,當(dāng)且僅當(dāng)該文法是LL(1)的。2025/1/7編譯原理29五、結(jié)論對(duì)LL(1)文法,總能構(gòu)造預(yù)測(cè)分析表,且表中不含多重元素。對(duì)非LL(1)文法,盡管可為其建立預(yù)測(cè)分析表,但表中必出現(xiàn)多重元素。非LL(1)文法所造表中,必有沖突元素。事實(shí)上,是否有沖突元素也是判別一文法是否是LL(1)文法的方法之一。對(duì)某些非LL(1)文法,可通過消除左遞歸,反復(fù)提取左因子等方法將其改造成LL(1)文法。但是,并非所有的非LL(1)文法都能改造為L(zhǎng)L(1)文法。六、非LL(1)文法的改造2025/1/7編譯原理30從輸入串開始,進(jìn)行最左歸約,直到到達(dá)文法的開始符號(hào)為止。大致過程:把輸入符號(hào)逐個(gè)移進(jìn)到一個(gè)棧里,當(dāng)棧頂形成某個(gè)產(chǎn)生式的右部(句柄)時(shí),把棧頂?shù)倪@一部分替換成(歸約為)它的左部符號(hào)。稱作“移進(jìn)—?dú)w約”分析。
自下而上分析過程語法分析程序查找規(guī)約串依據(jù)
a+b……#輸出帶#2025/1/7編譯原理31“移進(jìn)-歸約”分析對(duì)符號(hào)棧的使用有四類操作:移進(jìn)、歸約、接受和出錯(cuò)處理?!耙七M(jìn)一歸約”分析器使用一個(gè)棧和一個(gè)存放輸入符號(hào)串w的緩沖器。工作過程:自左至右將串w的符號(hào)依次入棧,一旦棧頂形成句柄即歸約。歸約可持續(xù)多次,直至棧頂不再呈現(xiàn)句柄為止。然后,繼續(xù)移進(jìn)符號(hào),重復(fù)這個(gè)過程,直至最終形成如下格局:
棧
輸入
#S
#分析過程的每一步,棧中符號(hào)串與剩余輸入符號(hào)串恰是一個(gè)規(guī)范句型。且棧中符號(hào)串為該句型的一個(gè)活前綴??偨Y(jié)活前綴:是規(guī)范句型的一個(gè)前綴,且不含句柄之后的任何符號(hào)
,則稱為該規(guī)范句型的一個(gè)活前綴。2025/1/7編譯原理32算符優(yōu)先分析法一、算符文法定義
算符文法CFGG=(VN,VT,P,S),U,V,W均為非終結(jié)符,x,y均為終結(jié)符。如果CFG(不含空產(chǎn)生式)G中沒有形如U
…VW…的產(chǎn)生式,則稱G為算符文法(OG)。推論:
算符文法的任何句型都不含兩個(gè)相鄰的非終結(jié)符。終結(jié)符號(hào)a與b之間的優(yōu)先關(guān)系有三種:
a
b表示a的優(yōu)先級(jí)低于ba
b表示a的優(yōu)先級(jí)等于b
a
b表示a的優(yōu)先級(jí)大于b2025/1/7編譯原理33二、算符優(yōu)先關(guān)系定義
在OG(算符優(yōu)先文法)中x?=y
G中有形如U
…xy…或U
…xVy…的產(chǎn)生式。x<?y
G中有形如U
…xW…的產(chǎn)生式,
而Wy….或WVy…x?>y
G中有形如U
…Wy…的產(chǎn)生式,
而W…x或W…xV規(guī)定:若Sx…或SVx…則#<?x
若S…x或S…xV則x?>#2025/1/7編譯原理34三、算符優(yōu)先關(guān)系計(jì)算及其表示1定義
FIRSTVT(W)={y|Wy…WVy…}LASTVT(W)={x|W…xW…xV}2三種關(guān)系計(jì)算x?=y:U
…xy…或U
…xVy…x<?y:每個(gè)非終結(jié)符B的FIRSTVT(B),形如U
…xB…中,每個(gè)y∈FIRSTVT(B),則有x<?y成立。x?>y:每個(gè)非終結(jié)符B的LASTVT(B),形如U
…By…中,每個(gè)x∈LASTVT(B),則有x?>y成立。2025/1/7編譯原理35對(duì)文法的每一非終結(jié)符號(hào)構(gòu)造FIRSTVT集和LASTVT集,算法分別如下ⅰ)構(gòu)造FIRSTVT集,置FIRSTVT(A)=φ
若文法中有形如A→b…或A→Bb…的規(guī)則,則b∈FIRSTVT(A)
若文法中有形如A→B…的規(guī)則,則FIRSTVT(B)∈FIRSTVT(A)2025/1/7編譯原理36ⅱ)構(gòu)造LASTVT集,置LASTVT(A)=φ
若文法中有形如A→…a或A→…aB的規(guī)則,則a∈LASTVT(A)
若文法中有形如A→…B的規(guī)則,則LASTVT(B)∈LASTVT(A)(2)ⅰ)形如…aA…的規(guī)則右部,a<FIRSTVT(A)ⅱ)形如…Ab…的規(guī)則右部,LASTVT(A)>bⅲ)形如…ab…或…aAb…的規(guī)則右部,a=b(3)#<FIRSTVT(S)LASTVT(S)>#2025/1/7編譯原理373、
算符優(yōu)先文法在OG文法G中,若任意兩個(gè)終結(jié)符間至多只有三種算符優(yōu)先關(guān)系=、<和>中的一種算符優(yōu)先關(guān)系存在,則稱G為算符優(yōu)先文法(OPG)。
算符優(yōu)先文法是無二義的。2025/1/7編譯原理381素短語:至少含有一個(gè)終結(jié)符號(hào),并且除自身之外不再含有任何更小的帶有終結(jié)符號(hào)的短語,則稱為素短語。2最左素短語:句型最左邊的素短語。算符優(yōu)先文法句型的最左素短語是唯一的。EE+TE+TTT*FFi句型T+T*F+i的語法樹最左素短語不一定是當(dāng)前句型的句柄最左素短語可能不是相應(yīng)文法的任何產(chǎn)生式的右部。按算符優(yōu)先關(guān)系所確定的歸約串恰好是當(dāng)前句型的最左素短語2025/1/7編譯原理39LR分析器概述一、LR分析器構(gòu)成總控程序(驅(qū)動(dòng)程序)。對(duì)所有LR分析器都相同。分析表(分析函數(shù))。不同文法分析表不同,同一文法采用的LR分析器不同時(shí),分析表也將不同。分析棧。包括文法符號(hào)棧和相應(yīng)的狀態(tài)棧。總控程序outputInput(#)LR分析表ACTIONGOTOS0#SmXm……
狀態(tài)棧符號(hào)棧2025/1/7編譯原理401分析表構(gòu)成
動(dòng)作表(ACTION)
ACTION[S,a]:表示在當(dāng)前狀態(tài)S下,面臨掃描符號(hào)a所應(yīng)采取的動(dòng)作。動(dòng)作有四種:移進(jìn)、歸約、出錯(cuò)、接受。
轉(zhuǎn)向表(GOTO)
GOTO[S,X]:若XVT,表示在當(dāng)前狀態(tài)下,讀入a應(yīng)轉(zhuǎn)向什么狀態(tài);若XVN,表示當(dāng)前棧頂句柄歸約成X后,應(yīng)轉(zhuǎn)向什么狀態(tài)。
移進(jìn)ai和s=goto[sm,ai]進(jìn)棧action[sm,ai]=歸約rj:AXm-r+1Xm-r+2…Xm
接受s=goto[sm-r,A]
出錯(cuò)2025/1/7編譯原理41注:對(duì)于終結(jié)符的轉(zhuǎn)向動(dòng)作,可與其移進(jìn)動(dòng)作合并在一起填在動(dòng)作表中,這樣轉(zhuǎn)向表可進(jìn)行壓縮,只保留非終結(jié)符轉(zhuǎn)向部分。ACTIONGOTOa1a2…anS0S1…SkA1A2…AmS5r4acc282025/1/7編譯原理422LR分析器的總控程序
總控程序的動(dòng)作由當(dāng)前棧頂狀態(tài)Sm和掃描符號(hào)ai查表決定。1)移進(jìn)
把(Sm,ai)的下一狀態(tài)S‘=GOTO[Sm,ai]連同掃描符號(hào)進(jìn)棧,棧頂成(S’,ai),掃描指針后移;2)歸約
用產(chǎn)生式A
進(jìn)行歸約。若
的長(zhǎng)度為,則彈出棧頂
項(xiàng),使棧頂狀態(tài)變?yōu)镾m-,然后將(Sm-,A)的下一狀態(tài)S’=GOTO[Sm-,A]連同A一起入棧,棧頂變?yōu)?S’,A)。掃描指針不動(dòng),即不改變現(xiàn)行輸入符號(hào)。3)接受
4)報(bào)錯(cuò)注:不管哪一類分析程序,總控程序的動(dòng)作都一樣。2025/1/7編譯原理43LR分析總結(jié)
特征規(guī)范的;符號(hào)棧中的符號(hào)是規(guī)范句型的前綴,且不含句柄以后的任何符號(hào)(活前綴);分析決策依據(jù)――棧頂狀態(tài)和現(xiàn)行輸入符號(hào)。識(shí)別活前綴的DFA.
四種技術(shù)
LR(0)SLR(1)LR(1)2025/1/7編譯原理44
在規(guī)范歸約的句型中,不含有句柄以后任何符號(hào)的前綴稱為活前綴。它有兩種情況:歸態(tài)活前綴和非歸態(tài)活前綴。
歸態(tài)活前綴
活前綴尾部正好是句柄之尾,這時(shí)可進(jìn)行歸約。歸約后又會(huì)成為另一句型的活前綴。
非歸態(tài)活前綴
句柄尚未形成,需要繼續(xù)移進(jìn)若干符號(hào)后才能形成。
活前綴2025/1/7編譯原理45一、LR(0)分析表的基本策略
狀態(tài)DFA狀態(tài)的轉(zhuǎn)換構(gòu)造文法G的一個(gè)DFA,用于識(shí)別所有活前綴。由若干LR(0)項(xiàng)目所組成的集合(項(xiàng)目集)來表示。由分析過程中的移進(jìn)-歸約操作引發(fā)。LR(0)分析表的構(gòu)造2025/1/7編譯原理46定義:對(duì)文法G的每個(gè)產(chǎn)生式右部添加一個(gè)圓點(diǎn),稱為G的一個(gè)LR(0)項(xiàng)目(簡(jiǎn)稱項(xiàng)目)。Aα?
或Aα?χβ
注:添加位置不同,叫做不同項(xiàng)目。用圓點(diǎn)“?”表示識(shí)別一個(gè)產(chǎn)生式右部符號(hào)到達(dá)的位置,項(xiàng)目記錄了當(dāng)前活前綴狀況。1文法G的LR(0)項(xiàng)目2025/1/7編譯原理47LR(0)項(xiàng)目分類移進(jìn)待歸約歸約接受接受項(xiàng)目:S’SS’S?歸約項(xiàng)目:A?待歸約項(xiàng)目:A?BBVN移進(jìn)項(xiàng)目:A?aaVT2025/1/7編譯原理481)定義項(xiàng)目集是相關(guān)項(xiàng)目的集合。是通過對(duì)某個(gè)基本項(xiàng)目集I通過closure(I)運(yùn)算求得。2)closure(I)構(gòu)造設(shè)I是文法G的一個(gè)LR(0)項(xiàng)目集,
closure(I)是從I出發(fā)用下面三個(gè)規(guī)則構(gòu)造的項(xiàng)目集:1I中每一個(gè)項(xiàng)目都屬于closure(I);2若項(xiàng)目A→α·Bβ
closure(I)且B∈VN,B→ηP,則將B→·η加進(jìn)closure(I)中。3重復(fù)執(zhí)行(2)直到closure(I)不再增大為止。
2文法G的LR(0)項(xiàng)目集2025/1/7編譯原理49
其中,I:項(xiàng)目集,x∈V,J={A
x?
|A
?
x
I}。含義:對(duì)于任意項(xiàng)目集I,轉(zhuǎn)換到項(xiàng)目J,是由于I中有A
?X
,J中有A
X?
,表示識(shí)別的活前綴增加了X。XAα?XβI:AαX?βJ:go(I,X)=Jclosure()1)定義3狀態(tài)轉(zhuǎn)換函數(shù)GO(I,X)2025/1/7編譯原理50二、識(shí)別所有規(guī)范句型全部活前綴的DFA1由項(xiàng)目構(gòu)成識(shí)別文法活前綴的DFA
1)對(duì)于一個(gè)文法G,可構(gòu)造一個(gè)DFA,由它的狀態(tài)(項(xiàng)目集)記住當(dāng)前活前綴狀況,該DFA能識(shí)別G的所有活前綴。
若狀態(tài)中項(xiàng)目為Aα?,則表示它已處于歸態(tài)活前綴。若為Aα?χβ則表示它處于非歸態(tài)活前綴。
2)DFA的整個(gè)狀態(tài)集稱為L(zhǎng)R(0)項(xiàng)目集規(guī)范族。
項(xiàng)目、項(xiàng)目集、項(xiàng)目集規(guī)范族。目的:構(gòu)造LR(0)的項(xiàng)目集規(guī)范族。2025/1/7編譯原理51Step1拓廣文法G,形成新的文法G’。即增加產(chǎn)生式S’S,并令S’
?S作為G’的初態(tài)I0的基本項(xiàng)目2DFA構(gòu)造過程Step2定義和構(gòu)造項(xiàng)目集的閉包。設(shè)I是G’的一個(gè)項(xiàng)目集,構(gòu)造I的閉包CLOSURE(I)Step3確定狀態(tài)轉(zhuǎn)移。利用轉(zhuǎn)換函數(shù)GO實(shí)現(xiàn)。Step3構(gòu)造LR(0)項(xiàng)目集規(guī)范族Q。將所有項(xiàng)目集,以及所有狀態(tài)間轉(zhuǎn)移構(gòu)造出來。構(gòu)造算法:2025/1/7編譯原理52DFAM=(
VT∪VN∪{S},Q{項(xiàng)目集規(guī)范族},I0=closure{S’→?S},Q,
=go(I,X))DFA中每個(gè)狀態(tài)為終態(tài),從I0出發(fā),沿著有向邊可使DFA所經(jīng)歷的任何狀態(tài)終止其工作,將從I0出發(fā)到達(dá)該狀態(tài)所經(jīng)過的弧上的標(biāo)記依次連接,即可得到DFA到達(dá)該狀態(tài)時(shí),所識(shí)別的某規(guī)范句型的一個(gè)活前綴。因此該DFA可識(shí)別所有活前綴。注意:當(dāng)M到達(dá)只含有歸約項(xiàng)目的項(xiàng)目集時(shí),表明活前綴中已含有相應(yīng)句柄的全部符號(hào),這些狀態(tài)稱為句柄的識(shí)別狀態(tài)。2025/1/7編譯原理53三、LR(0)分析表的構(gòu)造假定C={I0,I1,……,In},用整數(shù)0,1,……,n表示狀態(tài)I0,I1,……,In,因此,G’的LR(0)分析表含有狀態(tài)0,1,……,n。令含有項(xiàng)目S’→.S的Ik的下標(biāo)k為初態(tài)。ACTION和GOTO可按如下方法構(gòu)造:若項(xiàng)目A→α.a(chǎn)β屬于Ii且GO(Ii,a)=Ij,a∈VT,則置ACTION[i,a]為“把狀態(tài)j和符號(hào)a移進(jìn)?!?,簡(jiǎn)記為“sj”;若a∈VN,則置GOTO(i,a)=j;若規(guī)約項(xiàng)目A→α.∈Ii,則對(duì)任何終結(jié)符a,置ACTION[i,a]為“用產(chǎn)生式A→α進(jìn)行規(guī)約”,簡(jiǎn)記為“rj”;其中,假定A→α為文法G`的第j個(gè)產(chǎn)生式;若接受項(xiàng)目S’→S.屬于Ik,則置ACTION[k,#]為“接受”,簡(jiǎn)記為“acc”;分析表中凡不能用上述規(guī)則填入信息的空白格均置上“出錯(cuò)標(biāo)志”。2025/1/7編譯原理54注意:一個(gè)LR(0)項(xiàng)目集中不能有下列情況存在:
1、移進(jìn)和歸約項(xiàng)目同時(shí)存在(移進(jìn)-歸約沖突)
形如:A→α·aβ,a∈VTB→γ·
2、歸約和歸約項(xiàng)目同時(shí)存在(歸約-歸約沖突)
形如:A→α·B→γ·§
4.4.2LR(0)分析表的構(gòu)造2025/1/7編譯原理55
對(duì)于沖突狀態(tài)I中的歸約項(xiàng)目A
,不管當(dāng)前輸入符號(hào),都把ACTION表中的狀態(tài)行所有非終結(jié)符列置為rj,其中j為A產(chǎn)生式編號(hào)。產(chǎn)生沖突的根本原因?
構(gòu)造分析表時(shí)根據(jù)不同的掃描符號(hào)a,將I中各項(xiàng)目對(duì)應(yīng)的分析動(dòng)作加以區(qū)別,沖突即可解決。
SLR(1)是LR(0)的一種改進(jìn),對(duì)有沖突的狀態(tài)向前查看一個(gè)符號(hào),以確定作何種動(dòng)作。如何解決?一、問題分析SLR(1)分析表的構(gòu)造2025/1/7編譯原理56
定義:對(duì)于文法中的非終結(jié)符U∈VNFOLLOW(U)={a|S’?…Ua…,a∈VT∪{#}}
對(duì)含沖突的項(xiàng)目集I={X
b,A
,B},若、FOLLOW(A)、FOLLOW(B)兩兩不相交,則面對(duì)當(dāng)前讀入符號(hào)a,狀態(tài)I的解決方法:
1.若a=b,則移進(jìn)。
2.若aFOLLOW(A),則用A進(jìn)行歸約。3.若aFOLLOW(B),則用B進(jìn)行歸約。4.此外,報(bào)錯(cuò)。具體解決過程*2025/1/7編譯原理57二、構(gòu)造SLR(1)分析表的算法
設(shè)C={I0,I1,…In},以各項(xiàng)目集Ik(k=0,…,n)的k作為狀態(tài)序號(hào),并以包含S`?S的項(xiàng)目集作為初始狀態(tài),同時(shí)將產(chǎn)生式進(jìn)行編號(hào)。然后按下列步驟填寫ACTION表和GOTO表:
1)若項(xiàng)目A
?a
屬于Ik狀態(tài)且GO(Ik,a)=Ij,a為終結(jié)符,則置ACTION[k,a]=Sj;即:移進(jìn)a,并轉(zhuǎn)向Ij狀態(tài)。
2)若項(xiàng)目A
?Ik,則對(duì)任何終結(jié)符a
Follow(A),置ACTION[k,a]=rj;其中j是產(chǎn)生式A
的編號(hào),即按該產(chǎn)生式進(jìn)行歸約。
3)若項(xiàng)目S`S?屬于Ik,則置ACTION[k,#]=acc;4)若GO(Ik,A)=Ij,A是非終結(jié)符,則置GOTO[k,A]=j5)分析表中凡不能用步驟1至4填入信息的空白項(xiàng),均置上“出錯(cuò)標(biāo)志”。2025/1/7編譯原理58注意!1)若文法G按上面算法構(gòu)造出來的分析表不包含多重定義項(xiàng),則該文法G是SLR(1)文法。
2)若項(xiàng)目集中存在A
?
項(xiàng)目,不應(yīng)設(shè)計(jì)相應(yīng)GO函數(shù)以轉(zhuǎn)到其他項(xiàng)目集,因?yàn)锳
?和A
?
是同一項(xiàng)目,都是A
?項(xiàng)目,是歸約項(xiàng)目。
3)二義文法決不是LR文法。
4)每個(gè)SLR(1)文法都不是二義的,但是有很多非二義的文法,包括一些程序設(shè)計(jì)語言結(jié)構(gòu),都不是SLR(1)的,這說明SLR(1)文法的描述能力有限。原因是SLR分析器的構(gòu)造方法沒有記住足夠多的上下文。2025/1/7編譯原理59失效原因:SLR(1)規(guī)則僅孤立地考察輸入符號(hào)是否屬于與歸約項(xiàng)目Aα·相關(guān)聯(lián)的集合FOLLOW(A)以確定是否應(yīng)按產(chǎn)生式Aα歸約,沒有考察符號(hào)串α所在規(guī)范句型的“環(huán)境”——沒有考察L在規(guī)范句型中的“上下文”,這就具有一定的片面性。請(qǐng)閱讀課本例4.82025/1/7編譯原理601)當(dāng)出現(xiàn)移進(jìn)-歸約沖突時(shí),可選取移進(jìn),這樣,這是一個(gè)自然的消除二義性的規(guī)則。
2)當(dāng)出現(xiàn)歸約-歸約沖突時(shí)(如課本例4.8)情形就較復(fù)雜,需要有新的解決方法——LR(1)。解決方法
給每個(gè)LR(0)項(xiàng)目添加展望信息,即:添加句柄之后可能跟的終結(jié)符,這些終結(jié)符確實(shí)跟在規(guī)范句型句柄之后。2025/1/7編譯原理61一、LR(1)項(xiàng)目定義1LR(1)項(xiàng)目:形如(A
?
,a)的二元式稱為L(zhǎng)R(1)項(xiàng)目。其中A
是文法的一個(gè)產(chǎn)生式,a是終結(jié)符,稱為搜索符。
(A
?
,a)的含義:預(yù)期當(dāng)棧頂句柄
形成后,若掃描到符號(hào)a,即可進(jìn)行歸約。此時(shí),
在棧內(nèi),
還未入棧,即它展望了句柄后的一個(gè)符號(hào)。對(duì)于多數(shù)程序設(shè)計(jì)語言,向前展望一個(gè)符號(hào)就足以決定歸約與否,所以只研究LR(1)。
在LR(1)項(xiàng)目中有效的項(xiàng)目并不多。
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 長(zhǎng)春信息技術(shù)職業(yè)學(xué)院《自動(dòng)化實(shí)踐初步》2023-2024學(xué)年第一學(xué)期期末試卷
- 玉林師范學(xué)院《結(jié)構(gòu)模型設(shè)計(jì)制作》2023-2024學(xué)年第一學(xué)期期末試卷
- 市場(chǎng)波動(dòng)下的投資決策風(fēng)險(xiǎn)分析
- 財(cái)務(wù)戰(zhàn)略述職報(bào)告模板
- 保險(xiǎn)業(yè)務(wù)月度報(bào)告模板
- 保險(xiǎn)行業(yè)發(fā)展展望模板
- 實(shí)施環(huán)保生活講座
- 社團(tuán)招新簡(jiǎn)報(bào)
- 統(tǒng)編版六年級(jí)語文上冊(cè)寒假作業(yè)(十一)(有答案)
- 2025年四川省眉山市區(qū)縣高考數(shù)學(xué)一診模擬試卷(含答案)
- 英語現(xiàn)在完成時(shí)專項(xiàng)練習(xí)題(附答案)
- 制造樣品生產(chǎn)作業(yè)指導(dǎo)書
- 服務(wù)經(jīng)營培訓(xùn)課件ppt 老客戶經(jīng)營綜合版
- MT/T 199-1996煤礦用液壓鉆車通用技術(shù)條件
- GB/T 6144-1985合成切削液
- GB/T 10357.1-2013家具力學(xué)性能試驗(yàn)第1部分:桌類強(qiáng)度和耐久性
- 公寓de全人物攻略本為個(gè)人愛好而制成如需轉(zhuǎn)載注明信息
- 第5章-群體-團(tuán)隊(duì)溝通-管理溝通
- 腎臟病飲食依從行為量表(RABQ)附有答案
- 深基坑-安全教育課件
- 園林施工管理大型園林集團(tuán)南部區(qū)域養(yǎng)護(hù)標(biāo)準(zhǔn)圖例
評(píng)論
0/150
提交評(píng)論