版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第3章語法分析本章要點(diǎn)上下文無關(guān)文法自上而下語法分析自下而上語法分析語法分析器的自動(dòng)生成
語法分析器的功能語法分析器的功能:分析、判斷記號(hào)序列是否符合語法規(guī)則。詞法分析器記號(hào)取下一個(gè)記號(hào)源程序分析樹前端的其余部分語法分析器中間表示符號(hào)表3.1上下文無關(guān)文法3.1.1上下文無關(guān)文法的定義正規(guī)式能定義一些簡單的語言,能表示給定結(jié)構(gòu)的固定次數(shù)的重復(fù)或者沒有指定次數(shù)的重復(fù) 例:a(ba)5,a(ba)*正規(guī)式不能用于描述配對(duì)或嵌套的結(jié)構(gòu) 例1:配對(duì)括號(hào)串的集合 例2:{wcw|w是a和b的串}
可以用形式語言中的文法來描述產(chǎn)生式產(chǎn)生式(規(guī)則)是定義語法單位的一種書寫規(guī)則。它的形式為:α→β(或α::=β)
其中:“→”讀作“定義為”
α,β為符號(hào)串箭頭左邊稱為產(chǎn)生式左部箭頭右邊稱為產(chǎn)生式右部
例:S→0S1,0S→01上下文無關(guān)文法上下文無關(guān)文法G是一個(gè)四元組(VT,VN,S,P)
VT:終結(jié)符集合-通常表示語言集中不能再分割的單詞記號(hào)
VN:非終結(jié)符-表示程序語言中的語法單位,且
VN∩VT=φ
S:開始符號(hào),至少在某個(gè)產(chǎn)生式左部出現(xiàn)一次
P:產(chǎn)生式集合(有限),每個(gè)產(chǎn)生式的形式為:
P→α,P∈VN,α∈(VN∪VT)*例:算術(shù)表達(dá)式文法({id,+,,,(,)},{expr,op},expr,P)
VT:{id,+,,,(,)}VN:{expr,op}S:exprP:{expr
expr
op
exprop+expr(expr)op
expr
exprexpr
id}
說明:為書寫方便,常把若干左部相同的產(chǎn)生式合并為一個(gè),并用元語言符號(hào)“|”隔開。上例簡化表示expr
expr
op
expr |
(expr)|
expr|idop+|習(xí)慣上,常用大寫字母表示非終結(jié)符,小寫字母表示終結(jié)符。上例簡化表示E
EAE|(E)|E|idA+|例:文法G(S)
G(S)=(VT,VN,S,P)其中:
VT={a,b}VN={S,A}
P={S→bA,A→aA|a}
是上下文無關(guān)文法文法G(E):
E
EAE|0E0|a
A
b|c
也是上下文無關(guān)文法
G(S)=(VT,
VN,
S,
P)
VT:{id,
+,*,
(
,
),
}VN:{S,E,A}P:{S→id=E
EEAE|(E)|E|idA+|}
例:賦值語句的上下文無關(guān)文法描述3.1.2推導(dǎo)把產(chǎn)生式看成重寫規(guī)則,把符號(hào)串中的非終結(jié)符用其產(chǎn)生式右部的串來代替,這個(gè)過程在語法分析中有重要意義。例:E
E+E|E
E|(E)|
E|idE
E
(E)
(E+E)
(id+E)(id+id)顯然,(id+id)是合法的表達(dá)式概念直接推出
如果A→γ是一個(gè)產(chǎn)生式,而α,β∈(VT∪VN)*,則將產(chǎn)生式A→γ用于符號(hào)串αAβ得到符號(hào)串αγβ,記為αAβ=>αγβ,稱αAβ直接推出αγβ。
如:E=>(E),(E+E)=>(i+E)推導(dǎo)設(shè)α1,α2,…,αn(n>0)∈(VT∪VN)*,且有α1=>α2=>…=>αn
則稱這個(gè)序列是從α1到αn的一個(gè)推導(dǎo)。若存在一個(gè)α1到αn的一個(gè)推導(dǎo),則稱α1可推導(dǎo)出αn,記為:α1=>+αn
(經(jīng)一步或若干步推導(dǎo))或α1=>*αn
(經(jīng)0步或若干步推導(dǎo))句型假定G是一個(gè)文法,S是它的開始符號(hào),如果S=>α,則稱α是文法G的一個(gè)句型。如:(E+E),(i+E),(i+i),E都是G(E)的句型。句子僅由終結(jié)符組成的句型稱為句子。
如:(i×i+i),(i+i)都是G(E)的句子。語言文法G所產(chǎn)生句子的全體,即:L(G)={α|S=>+α,α∈VT*}概念最左(右)推導(dǎo)若某推導(dǎo)中任何一步直接推出α=>β都是對(duì)α中的最左(最右)非終結(jié)符進(jìn)行替換,則稱其為最左(最右)推導(dǎo)。例:E
E+E|E
E|(E)|
E|id最左推導(dǎo) E lm
Elm
(E)lm
(E
+E)
lm
(id+E)lm(id+id)最右推導(dǎo)(規(guī)范推導(dǎo)) E rm
Erm
(E)rm
(E+E)
rm
(E+id)rm(id+id)E=>(E)=>(E+E)=>(E×E+E)=>(E×E+i)。既非最右也非最左推導(dǎo)。3.1.3分析樹文法句型(句子)推導(dǎo)的樹形表示即語法分析樹,簡稱分析樹。分析樹的構(gòu)造
語法分析樹是一棵根在上,葉子在下的倒立的樹,(1)根結(jié)點(diǎn)由開始符號(hào)標(biāo)記,隨著推導(dǎo)的展開,向下畫一分支;(2)某個(gè)非終結(jié)符被它的某個(gè)候選式所替換時(shí),產(chǎn)生下一代新結(jié)點(diǎn),候選式中自左到右的每個(gè)符號(hào)作為新結(jié)點(diǎn)的標(biāo)記;(3)每個(gè)新結(jié)點(diǎn)和其父結(jié)點(diǎn)間有一條連線。3.1.3分析樹例:E
E+E|E
E|(E)|
E|id
(id+id)的分析樹EE()EEE+idid在一棵語法樹生長過程中的任何時(shí)刻,所有那些沒有后代的端末結(jié)點(diǎn)自左到右排列起來就是一個(gè)句型。3.1.4二義性
例:E
E+E|E
E|(E)|
E|id
句子idid+id的最左推導(dǎo)如下
E
E
E
E
E+E idE
E
E+E
id
E+E id
E+E
idid+E idid+E idid+id idid+idEEE*+EEidididEEidE*+EEidid如果一個(gè)文法存在某個(gè)句子對(duì)應(yīng)兩棵不同的語法樹,則稱這個(gè)文法是二義的。文法二義不代表語言一定是二義的。當(dāng)產(chǎn)生一個(gè)語言的所有文法都是二義時(shí),這個(gè)語言才稱為二義的。有些語法分析器希望處理的文法是無二義的,則要構(gòu)造無二義文法;出于某些需要,也可以構(gòu)造允許二義文法的分析器,不過文法要附帶消除二義性的規(guī)則。如對(duì)文法G(E),規(guī)定“*”的優(yōu)先級(jí)高于“+”,并服從左結(jié)合,文法改寫為 E→T|E+T
T→F|T*F
F→(E)|id是無二義性的。文法的二義性3.2語言和文法文法的優(yōu)點(diǎn)
文法給出了精確的,易于理解的語法說明自動(dòng)產(chǎn)生高效的分析器可以給語言定義出層次結(jié)構(gòu)以文法為基礎(chǔ)的語言的實(shí)現(xiàn)便于語言的修改文法的問題文法能描述編程語言的大部分語法,但不是所有。3.2.1
正規(guī)式和上下文無關(guān)文法的比較正規(guī)式可以描述的語言都能用上下文無關(guān)文法描述,通過NFA可以變換出相應(yīng)文法。正規(guī)式(a|b)*ab文法A0
a
A0|bA0|a
A1A1
b
A2A2
12開始a0abb3.2.2分離詞法分析器理由為什么要用正規(guī)式定義詞法
詞法規(guī)則非常簡單,不必用上下文無關(guān)文法對(duì)于詞法記號(hào),正規(guī)式描述簡潔且易于理解從正規(guī)式構(gòu)造出的詞法分析器效率高從軟件工程角度看,詞法分析和語法分析的分離有如下好處簡化詞法分析器設(shè)計(jì),改進(jìn)編譯器的效率編譯器的可移植性加強(qiáng)便于編譯器前端的模塊劃分3.2.3驗(yàn)證文法產(chǎn)生的語言例:G:S
(S)S|L(G):配對(duì)的括號(hào)串的集合按推導(dǎo)步數(shù)進(jìn)行歸納:推出的是配對(duì)括號(hào)串歸納基礎(chǔ):S
歸納假設(shè):少于n步的推導(dǎo)都產(chǎn)生配對(duì)的括號(hào)串歸納步驟:n步的最左推導(dǎo)如下:
S(S)S*(x)S*(x)y3.2.3驗(yàn)證文法產(chǎn)生的語言例:G:S
(S)S|L(G):配對(duì)的括號(hào)串的集合按串長進(jìn)行歸納:配對(duì)括號(hào)串可由S推出歸納基礎(chǔ):S
歸納假設(shè):長度小于2n的都可以從S推導(dǎo)出來歸納步驟:考慮長度為2n(n
1)的w=(x)y
S(S)S*(x)S*(x)y3.2.4適當(dāng)?shù)谋磉_(dá)式文法
用一種層次觀點(diǎn)看待表達(dá)式
idid(id+id)+idid+id
id
id
(id+id)
文法 expr
expr+term|term term
term
factor|factor
factor
id|(expr)expr
expr+term|termterm
term
factor|factor
factor
id|(expr)expridtermfactorididterm*termfactorfactor*exprexpr+idfactortermididterm*termfactorfactorid+idid分析樹
ididid分析樹
3.2.4適當(dāng)?shù)谋磉_(dá)式文法
3.2.5消除二義性stmt
ifexprthenstmt |ifexprthenstmtelsestmt |other句型:ifexprthenifexprthenstmt
elsestmt兩個(gè)最左推導(dǎo):
stmtifexprthenstmt
ifexprthenifexprthenstmtelsestmt
stmtifexprthenstmtelsestmt
ifexprthenifexprthenstmt
elsestmt
無二義的文法stmt
matched_stmt
|unmatched_stmtmatched_stmt
ifexprthenmatched_stmt
elsematched_stmt
|otherunmatched_stmt
ifexprthenstmt |ifexprthenmatched_stmt
elseunmatched_stmt3.2.5消除二義性3.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||13.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||1短語文法3.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||11型文法:||||,但S可以例外短語文法3.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||11型文法:||||,但S可以例外短語文法、上下文有關(guān)文法3.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||11型文法:||||,但S可以例外2型文法:A,AVN,(VN∪VT)*短語文法、上下文有關(guān)文法3.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||11型文法:||||,但S可以例外2型文法:A,AVN,(VN∪VT)*短語文法、上下文有關(guān)文法、上下文無關(guān)文法3.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||11型文法:||||,但S可以例外2型文法:A,AVN,(VN∪VT)*3型文法:AaB或Aa,A,BVN,aVT
短語文法、上下文有關(guān)文法、上下文無關(guān)文法3.2.6形式語言鳥瞰文法G=(VT
,VN,S,P)0型文法:,,(VNVT)*,||11型文法:||||,但S可以例外2型文法:A,AVN,(VN∪VT)*3型文法:AaB或Aa,A,BVN,aVT
短語文法、上下文有關(guān)文法、上下文無關(guān)文法、正規(guī)文法上下文有關(guān)文法舉例例 L3={anbncn|n1}的上下文有關(guān)文法S
aSBC
S
aBC
CB
BCaB
ab
bB
bb bC
bccC
ccanbncn的推導(dǎo)過程如下:S*an-1S(BC)n1 用S
aSBCn-1次S+an(BC)n 用S
aBC1次S+anBnCn 用CB
BC交換相鄰的CBS+anbBn1Cn 用aB
ab1次S+anbnCn 用bB
bbn-1次S+anbncCn-1 用bC
bc1次S+anbncn 用cC
cc
n-1次3.3自上而下分析3.3.1自上而下分析的一般方法對(duì)任何的輸入串(單詞記號(hào)流),試圖用一切可能的辦法,從文法的開始符號(hào)出發(fā),為輸入串尋找一個(gè)最左推導(dǎo),也就是自上而下地為輸入串建立一棵語法樹。這是一種帶回溯的試探過程。
判定輸入串x*y是否為它的句子?
SxAySxAyS**用S→xAy
推導(dǎo)過程:S=>xAy用A→*用A→**=>x**yxAy*(成功)(回溯)(回溯)=>x*y(成功)例:文法G:S→
xAy
A→**│*
一個(gè)文法,如果存在非終結(jié)符:P=>+
Pα,稱它是含有左遞歸的。文法的左遞歸使分析過程陷入無限循環(huán)?;厮菔狗治鲎叽蠖五e(cuò)路。存在虛假匹配現(xiàn)象。報(bào)告分析不成功時(shí),難于知道輸入串中出錯(cuò)的確切位置。效率低,代價(jià)高,有理論意義,實(shí)踐價(jià)值不大。自上而下分析面臨的問題3.3.2LL(1)文法對(duì)于LL(1)文法,可以進(jìn)行不帶回溯的自上而下的LL(1)分析。LL(1)是指從左(Left)到右掃描輸入串;構(gòu)造句子的最左(Leftmost)推導(dǎo);分析時(shí)每步向前看一個(gè)字符。消除左遞歸消除回溯FIRST集合,FOLLOW集合LL(1)文法LL(1)分析方法1.消除左遞歸例:
E→E+T│TT→T*F│F F→(E)│i
P→Pα│β(α≠ε,β不以P開頭)P→βP'
P'→αP’│εE→TE’E’→+TE’│εT→FT’T’→*FT’│εF→(E)│i(1)消除直接左遞歸一般地:若P→Pα1│Pα2│…│Pαm│β1│β2│…│βn其中:αi≠ε,βi不以P開頭改寫為:P→β1P’│β2P’│...│βnP’P’→α1P’│α2P’│…│αmP’│ε(2)消除間接左遞歸例:設(shè)文法G(S)為:
S→Qc│c Q→Rb│b R→Sa│a
該文法不含直接左遞歸,但含間接左遞歸。如:S=>Qc=>Rbc=>Sabc等等解:
1)排序:R、Q、S
2)代入:Q→Sab│ab│b
S→Sabc│abc│bc│c
消除直接左遞歸:
S→abcS’│bcS’│cS’
S’→abcS’│ε
Q→Sab│ab│b
R→Sa│a
3)化簡:S→abcS’│bcS’│cS’
S’→abcS’│εG(S):
S→Qc│c
Q→Rb│b
R→Sa│a例:為文法消除間接左遞歸算法
1)排序:P1、P2、…、Pn2)FORi:=1TOnDOBEGINFORj:=1TOi-1DO
把形如Pi→Pjγ的規(guī)則改寫為:
Pi→δ1γ│δ2γ│…│δkγ
其中:Pj→δ1│δ2│…│δk
消除關(guān)于Pi規(guī)則的直接左遞歸
END3)化簡:刪除永不使用的產(chǎn)生式
解2:
1)排序:S、Q、R
2)代入得:S→Qc│c Q→Rb│b R→Rbca│bca|ca|a
消除直接左遞歸:
S→Qc│c Q→Rb│b R→bcaR‘│caR’|aR‘
R’→bcaR‘│εG(S):
S→Qc│c
Q→Rb│b
R→Sa│a例:為文法消除間接左遞歸在分析過程中,對(duì)任非終結(jié)符A,用它匹配輸入串時(shí)要求能夠根據(jù)當(dāng)前輸入,準(zhǔn)確地指派一個(gè)候選式,若匹配成功,則不虛假,若匹配不成功,則其它的候選式也不會(huì)成功。即當(dāng)A執(zhí)行匹配時(shí),A→α1│α2│…│αn
若A面臨的第一個(gè)輸入符號(hào)為a,則應(yīng)該準(zhǔn)確地指派某一個(gè)αi,其成敗完全代表A,無需進(jìn)行試探和回溯。2.消除回溯定義:符號(hào)串α的終結(jié)首符集FIRST(α)
FIRST(α)={a│α=>*a…,a∈VT}特別地,若α=>*ε,則規(guī)定ε∈FIRST(α)對(duì)文法的任一非終結(jié)符號(hào)A,A→α1│α2│…│αn,
若要準(zhǔn)確地指派候選式,則應(yīng)滿足FIRST(αi)∩FIRST(αj)=Φ,i≠j通過提取公共左因子,將文法改造成任何非終結(jié)符的所有候選首符集兩兩不相交。
設(shè)A→δβ1│δβ2│…│δβn│
γ1│γ2│…│γm
(其中γ1、
γ2、
…、
γm不以δ開頭) 改寫:
A→δB│γ1│γ2│…│γm
B→β1│β2│…│βn例1:文法G:S→aSb|aS|ε解:提?。篠→aS(b|ε)
S→ε引入新符:S→aSA|ε A→b|ε 提取左因子例2:對(duì)文法G2:A→ad提左公因子
A→Bc B→aA B→bB
解:先替換為:
A→ad A→aAc A→bBc B→aA B→bB再提取A→a(Ac|d)A→bBcB→aAB→bB引入新符A→aA‘A→bBcA’→Ac|dB→aAB→bB一般地,經(jīng)過反復(fù)提取左因子可把每一個(gè)非終結(jié)符的所有候選首符集變成兩兩不相交。結(jié)論當(dāng)文法滿足:(1)消除了左遞歸(2)FIRST(αi)∩FIRST(αj)=Φ,i≠j)對(duì)某個(gè)輸入符號(hào)a,及待匹配的非終結(jié)符A,若a∈FIRST(αi),則對(duì)A選用αi候選式工作。這種選擇是唯一、確定和無虛假匹配的。3.
LL(1)文法當(dāng)文法滿足以上兩個(gè)條件,但對(duì)任意αi,a都不屬于FIRST(αi)時(shí),該如何選擇A的候選式,或者就認(rèn)為a的出現(xiàn)是一種語法錯(cuò)誤?例:G(S): S→aA|d 輸入符號(hào)串a(chǎn)bd是否為句子?
A→bAS|εS=>aA=>abAS=>abS=>abd這是因?yàn)锳有產(chǎn)生式A→ε,而從開始符號(hào)S可以得出S=>*…Ad…
定義A的后繼終結(jié)符號(hào)集FOLLOW(A)設(shè)S是文法G的開始符號(hào),對(duì)G的任何非終結(jié)符A,定義A的后繼終結(jié)符號(hào)集為:
FOLLOW(A)={a│S=>*…Aa…,a∈VT}當(dāng)特別地,若S=>*…A,則規(guī)定$∈FOLLOW(A)非終結(jié)符A面臨輸入符號(hào)a,如果a∈/FIRST(αi)(對(duì)任意i),ε∈FIRST(A),那么,當(dāng)a∈FOLLOW(A)時(shí),就選用產(chǎn)生式A→ε工作。此時(shí)滿足:FIRST(A)∩FOLLOW(A)
=Φ要正確進(jìn)行不帶回溯的語法分析,文法應(yīng)滿足以下條件:(1)文法不含左遞歸;(2)對(duì)文法中每個(gè)非終結(jié)符A的各個(gè)產(chǎn)生式的候選首符集兩兩不相交,即A→α1│α2│…│αn
,F(xiàn)IRST(αi)∩FIRST(αj)=Φ,(i≠j);(3)對(duì)文法中的每個(gè)非終結(jié)符A,若它存在某個(gè)候選首符集中包含ε,則FIRST(A)∩FOLLOW(A)=Φ稱滿足以上條件的文法為LL(1)文法。LL(1)文法對(duì)一個(gè)LL(1)文法,可以對(duì)某個(gè)輸入串進(jìn)行有效的無回溯的自上而下分析。設(shè)面臨的輸入符號(hào)為a,要用非終結(jié)符A進(jìn)行匹配,且A→α1│α2│…│αn
,則可如下分析(1)若a∈FIRST(αi),則指派αi執(zhí)行匹配任務(wù);(2)否則
1)若ε∈FIRST(A),且a∈FOLLOW(A),則讓A與ε自動(dòng)匹配;
2)否則,a的出現(xiàn)是一種語法錯(cuò)誤。LL(1)分析方法4.FIRST集合和FOLLOW集合的構(gòu)造
FIRST(α)={a│α=>*a…,a∈VT}FOLLOW(A)={a│S=>*…Aa…,a∈VT}以下討論:對(duì)于每個(gè)文法符號(hào)X∈VT∪VN,構(gòu)造FIRST(X)對(duì)于符號(hào)串α=X1X2…Xn,構(gòu)造FIRST(α)對(duì)于文法的每個(gè)非終結(jié)符,構(gòu)造FOLLOW(A)FIRST(X)構(gòu)造對(duì)于文法G的每個(gè)文法符號(hào)X∈VT∪VN,構(gòu)造FIRST(X)的方法
1)若X∈VT,則FIRST(X)={X};
2)若X∈VN,且有產(chǎn)生式X→a…,a∈VT,則把a(bǔ)加入到FIRST(X)中,若有X→ε,則把ε加入FIRST(X);
3)若X∈VN,且X→Y…,Y∈VN,則FIRST(Y)-{ε}加到 FIRST(X)中,若X→Y1Y2…Yk
,Y1,Y2,…,Yi
-1∈VN,ε∈FIRST(Yj) (1<=j<=i-1)則FIRST(Yi)-{ε}加到FIRST(X)中。特別地,若ε∈FIRST(Yj)(1<=j<=k),則ε加入FIRST(X)例
G:E→TE’E’→+TE’│εT→FT’T’→*FT’│εF→(E)│i求每個(gè)非終結(jié)符號(hào)的FIRST集合解:
FIRST(E)=FIRST(T)=FIRST(F) ={(,i}FIRST(E’)={+,ε}FIRST(T’)={*,ε}對(duì)于符號(hào)串α=X1X2…Xn,構(gòu)造FIRST(α)1)置FIRST(α)=FIRST(X1)-{ε};2)若對(duì)1<=j<=i-1,ε∈FIRST(Xj),
則把FIRST(Xi)-{ε}加到FIRST(α)中;
3)若對(duì)1<=j<=n,ε∈FIRST(Xj),則把ε加到 FIRST(α)中。FIRST(α)構(gòu)造例G:E→TE’E’→+TE’│εT→FT’T’→*FT’│εF→(E)│i求每個(gè)產(chǎn)生式右部符號(hào)串的FIRST集合
解
FIRST(TE’)={(,i}FIRST(+TE’)={+}FIRST(FT’)={(,i}FIRST(*FT’)={*}FIRST((E))={(} FIRST(i)={i}
對(duì)于文法G的每個(gè)非終結(jié)符,構(gòu)造FOLLOW(A)的方法是:1)若A為文法開始符號(hào),置$于FOLLOW(A)中;2)若有產(chǎn)生式B→αAβ,
則將FIRST(β)-{ε}加到FOLLOW(A)中;3)若有B→αA或B→αAβ,且β=>*ε
則將FOLLOW(B)加到FOLLOW(A)中;
4)反復(fù)使用以上規(guī)則,直至FOLLOW(A)不再增大為止FOLLOW(A)構(gòu)造例
G:E→TE’E’→+TE’│εT→FT’T’→*FT’│εF→(E)│i
求每個(gè)非終結(jié)符號(hào)的FOLLOW集合解
FOLLOW(E)={$,)}FOLLOW(E’)=FOLLOW(E)
={$,)}
FOLLOW(T)={+,$,)}FOLLOW(T’)=FOLLOW(T) ={+,$,)}FOLLOW(F)={*,+,$,)}
3.3.3遞歸下降的預(yù)測分析預(yù)測分析是指能根據(jù)當(dāng)前的輸入符號(hào)為非終結(jié)符確定一個(gè)候選式,LL(1)文法滿足這個(gè)要求。遞歸下降的預(yù)測分析是為每一個(gè)非終結(jié)符寫一個(gè)分析過程,由于文法定義是遞歸的,因此這些過程也是遞歸的。在處理輸入串時(shí),首先執(zhí)行的是開始符號(hào)的過程,然后根據(jù)產(chǎn)生式右部出現(xiàn)的非終結(jié)符,依次調(diào)用相應(yīng)的過程,這種逐步下降的過程調(diào)用序列隱含地定義了輸入的分析樹。程序構(gòu)造對(duì)每一個(gè)非終結(jié)符A,編寫一個(gè)相應(yīng)的子程序P(A),如果A→α1│α2│…│αn相應(yīng)的子程序?yàn)椋?/p>
IFchINFIRST(α1)THENP(α1)
ELSEIFch
INFIRST(α2)THENP(α2)ELSE……ELSEIFchINFIRST(αn)THENP(αn)ELSEIF(ε
∈
FIRST(A))AND(chINFOLLOW(A))THENRETURN
ELSEERROR對(duì)于符號(hào)串α=γ1γ2γ3…γm相應(yīng)的子程序P(
α)為:
BEGINP(γ1)P(γ2)…P(γm)END如果γi∈VT,則P(γi)為:
IFch=γiTHENread(ch)ELSEERROR;如果γi∈VN,則P(
γi)為非終結(jié)符相應(yīng)的子程序程序構(gòu)造例
E→TE’;E’→+TE’|;T→FT’;T’→*FT’|;F→(E)|iFIRST(+TE’)={+}FIRST(*FT’)={*}
FOLLOW(E’)={),$}FOLLOW(T’)={+,),$}FIRST((E))={(}FIRST(i)={i}E→TE’
P(E)BeginP(T);P(E’);End;E’→+TE’|P(E’)BeginIfch=‘+’Thenbeginread(ch);P(T);P(E’);
End;
elseifch=“)”Thenreturn;elseifch=‘#’Thenreturn;elseError;End;T→FT’P(T)BeginP(F);P(T’);End;T’→*FT’|P(E’)BeginIfch=‘*’Thenbeginread(ch);P(F);P(T’);
End;
//chFollow(E’)?End;例
E→TE’;E’→+TE’|;T→FT’;T’→*FT’|;F→(E)|i
FIRST(+TE’)={+}FIRST(*FT’)={*}
FOLLOW(E’)={),$}FOLLOW(T’)={+,),$}FIRST((E))={(}FIRST(i)={i}F→(E)|i
P(F)
Beginifch=‘i’thenread(ch)elseifch=‘(’then
beginread(ch);P(E);ifch=‘)’then read(ch)elseErrorEndelseError;End;例E→TE’;E’→+TE’|;T→FT’;T’→*FT’|;F→(E)|i
FIRST(+TE’)={+}FIRST(*FT’)={*}
FOLLOW(E’)={),$}FOLLOW(T’)={+,),$}FIRST((E))={(}FIRST(i)={i}例:產(chǎn)生Pascal類型子集的文法
type
simple |id |array[simple]oftype simpleinteger |char |numdotdotnum一個(gè)輔助過程voidmatch(terminalt){ if(lookahead==t)lookahead=nextToken(); elseerror();}Type過程voidtype(){ if((lookahead==integer)||(lookahead==char)|| (lookahead==num)) simple(); elseif(lookahead==){match();match(id);} elseif(lookahead==array){ match(array);match([);simple(); match(]);match(of);type(); } elseerror();}typesimple |id |array[simple]oftypeSimple過程voidsimple(){ if(lookahead==integer)match(integer); elseif(lookahead==char)match(char); elseif(lookahead==num){ match(num);match(dotdot);match(num); } elseerror();}simpleinteger |char |numdotdotnum
3.3.4非遞歸的預(yù)測分析遞歸下降分析器需要具有能夠?qū)崿F(xiàn)遞歸過程的語言和編譯系統(tǒng),使程序?qū)崿F(xiàn)受到一定限制。如果顯示地維持一個(gè)棧,就可以構(gòu)造非遞歸的預(yù)測分析程序,這是實(shí)現(xiàn)LL(1)分析的另一種有效方法。非遞歸預(yù)測分析程序的關(guān)鍵是如何選擇候選式,分析程序通常由三部分組成:
預(yù)測分析表(LL(1)分析表)、符號(hào)棧、總控程序
1、LL(1)分析表
若文法有m個(gè)非終結(jié)符n個(gè)終結(jié)符,則LL(1)分析表是一個(gè)(m+1)*(n+2)的矩陣M,行標(biāo)題為文法非終結(jié)符,列標(biāo)題為終結(jié)符號(hào)和輸入結(jié)束符$。M[A,a]為一條關(guān)于A的產(chǎn)生式,指出當(dāng)A面臨a時(shí),應(yīng)使用的產(chǎn)生式或空格(出錯(cuò)標(biāo)志)例G:E→TE’E’→+TE’│ε T→FT’T’→*FT’│ε F→(E)│ii+*()$EE→TE’E→TE’E’E’→+TE’E’→εE’→εTT→ET’T→FT’T’T’→εT’→*FT’‘T’→εT’→ε
FF→i
F→(E)2、分析棧STACK:
放文法符號(hào),初始放一個(gè)$號(hào),
再放入開始符號(hào)S。3、總控程序:設(shè)棧頂為X,當(dāng)前輸入符號(hào)為a,則對(duì)于任何(X,a)執(zhí)行以下三種動(dòng)作之一:若X=a=“#”則分析成功若X=a≠“#”
則把X從STACK棧中彈出,a指向下一輸入符號(hào)若X是非終結(jié)符,則按M[X,a]中的產(chǎn)生式進(jìn)行推導(dǎo)(彈出X,將右部符號(hào)串反序入棧),或進(jìn)行出錯(cuò)處理。例:G:E→TE’E’→+TE’│εT→FT’T’→*FT’│εF→(E)│ii+*()$EE→TE’E→TE’E’E‘→+TE’E’→εE’→εTT→FT’T→FT’T’T’→εT’→*FT’T’→εT’→εFF→iF→(E)輸入串:i+i*i的分析過程
步驟分析棧 輸入串 產(chǎn)生式或動(dòng)作
1$E i+i*i$ E→TE’ 2 $E’T i+i*i$ T→FT’3 $E'T’Fi+i*i$ F→i4 $E'T’i i+i*i$ i退棧,輸入前進(jìn)
5 $E'T’ +i*i$ T’退棧
6 $E' +i*i$ E’→+TE’7 $E'T+ +i*i$ +退棧,輸入前進(jìn)
8 $E'Ti*i$ T→FT’9 .........17$ $ 成功3.3.5構(gòu)造預(yù)測分析表(1)對(duì)文法的每個(gè)產(chǎn)生式A
,執(zhí)行(2)和(3)(2)對(duì)FIRST()的每個(gè)終結(jié)符a, 把A
加入M[A,a](3)如果在FIRST()中,對(duì)FOLLOW(A)的每個(gè)終結(jié)符b(包括$),把A
加入M[A,b](4)M中其它沒有定義的條目都是errorEE’TT’Fi+*()$E→TE’E→TE’T→FT’T→FT’T’→εT’→*FT’T’→εT’→εF→iF→(E)例
:對(duì)G構(gòu)造分析表
E→TE’
E’→+TE’│ε
T→FT’T’→*FT’│ε
F→(E)│iE’→+TE’E’→εE’→εFIRST(TE’)={(,i}FIRST(+TE’)={+}FIRST(FT’)={(,i}FIRST(*FT’)={*}FIRST((E))={(}FOLLOW(E’)={$,)}FOLLOW(T’〕={+,$,)}
說明:
若文法G的分析表每一項(xiàng)M[A,a],均不含有多重定義入口,當(dāng)且僅當(dāng)G為LL(1)文法。條件對(duì)任意A→α│βFIRST(α)∩FIRST(β)=Φ若β=>*ε,則FIRST(α)∩FOLLOW(A)=Φ
總控程序的形式化描述
BEGIN
#及S進(jìn)棧(push(‘#’);push(‘S’););
read(a);
FLAG:=TRUE;
WHILEFLAGDOBEGIN
把STACK棧頂彈出放在X中(X=pop());
IFX∈VT
THEN IFX=aTHENread(a)ELSEERROR
ELSEIFX=“?!?/p>
THEN IFX=aTHENFLAG:=FALSEELSEERROR
ELSEIFM[X,a]={X→X1…Xk} THEN把Xk,Xk-1,…,X1逐一進(jìn)棧
ELSEERRORENDOFWHILE;
END3.3.6LL(1)分析中的出錯(cuò)處理出錯(cuò)場合棧頂?shù)慕K結(jié)符與當(dāng)前的輸入符號(hào)不匹配棧頂?shù)姆墙K結(jié)符A與當(dāng)前輸入符號(hào)a,分析表中M[A,a]為空。錯(cuò)誤恢復(fù)的思路分析器檢測到一個(gè)錯(cuò)誤時(shí),暫時(shí)放棄分析并給出錯(cuò)誤信息;如果分析器能到達(dá)一個(gè)狀態(tài),從該狀態(tài)可以對(duì)剩余輸入繼續(xù)分析,則從該狀態(tài)恢復(fù)。3.3.6LL(1)分析中的出錯(cuò)處理處理方法發(fā)現(xiàn)錯(cuò)誤時(shí),分析器跳過輸入串中的一些符號(hào),直到輸入符號(hào)屬于某個(gè)“同步符號(hào)”為止。通過選擇適當(dāng)?shù)摹巴椒?hào)”,可以使分析器迅速從錯(cuò)誤中恢復(fù)過來。
A的同步符號(hào)集(synch)的選擇FOLLOW(A)
的所有終結(jié)符放入A的同步符號(hào)集合。即如果跳過一些符號(hào)直到看見FOLLOW(A)的元素,再把A彈出,分析一般可以繼續(xù)下去。3.3.6LL(1)分析中的出錯(cuò)處理把高層構(gòu)造的開始符號(hào)加到低層構(gòu)造的同步記號(hào)集合中。如: a=expr;if… (語句的開始符號(hào)作為表達(dá)式的同步記號(hào),以免表達(dá)式出錯(cuò)又遺漏分號(hào)時(shí)忽略if語句等一大段程序)3.3.6LL(1)分析中的出錯(cuò)處理把FIRST(A)的終結(jié)符加入A的同步記號(hào)集合。 如:a=expr;,if…(語句的開始符號(hào)作為語句的同步符號(hào),以免多出一個(gè)逗號(hào)時(shí)會(huì)把if語句忽略了)如果非終結(jié)符可以產(chǎn)生空串,若出錯(cuò)時(shí)棧頂是這樣的非終結(jié)符,則可以使用推出空串的產(chǎn)生式。如果終結(jié)符在棧頂而不能匹配,彈出此終結(jié)符例:加入同步符號(hào)集(FOLLOW集合元素)的LL(1)分析表i+*()$EE→TE’E→TE’synchsynchE’E’→+TE’E’→εE’→εTT→FT’synchT→FT’synchsynchT’T’→εT’→*FT’T’→εT’→εFF→isynchsynchF→(E)synchsynch對(duì)輸入串+id*+id的語法分析與錯(cuò)誤處理過程見P62表3.53.4自下而上分析3.4.1
歸約例:
S
aABe輸入串a(chǎn)bbcde
的分析過程 A
Abc|b B
d
3.4.1歸約例:
S
aABe輸入串a(chǎn)bbcde
的分析過程 A
Abc|b B
dab
bcde
(讀入ab)
ab3.4.1歸約例:
S
aABe輸入串a(chǎn)bbcde
的分析過程 A
Abc|b B
dab
bcdeaAbcde(歸約)
abA3.4.1歸約例:
S
aABe輸入串a(chǎn)bbcde
的分析過程 A
Abc|b B
dabbcdeaAbcde(再讀入bc)
abAbc3.4.1歸約例:
S
aABe
A
Abc|b B
dabbcdeaAbcdeaAde(歸約)
abAbAc3.4.1歸約例:
S
aABe
A
Abc|b B
dabbcdeaAbcdeaAde(再讀入d)
abAbdAc3.4.1歸約例:
S
aABe
A
Abc|b B
dabbcdeaAbcdeaAdeaABe(歸約)
abAbdAcB3.4.1歸約例:
S
aABe
A
Abc|b B
dabbcdeaAbcdeaAdeaABe(再讀入e)
eabAbdAcB
3.4.1歸約例: S
aABe
A
Abc|b B
dabbcdeaAbcdeaAdeaABeS(歸約)SeabAbdAcB3.4.1歸約例: S
aABe
A
Abc|b B
dabbcdeaAbcdeaAdeaABeSSrmaABermaAdermaAbcdermabbcdeSeabAbdAcB3.4.2句柄句型的句柄是和某產(chǎn)生式右部匹配的子串,并且,把它歸約成該產(chǎn)生式左部的非終結(jié)符時(shí),恰是最右推導(dǎo)的逆過程的一步。
S
aABe
A
Abc|b B
dSrmaABe
rmaAdermaAbcdermabbcde句柄的右邊僅含終結(jié)符如果文法二義,那么句柄可能不唯一例:句柄不唯一
文法:EE+E|EE|(E)|id在句型EE+id3中,句柄不唯一ErmEE
E
rmE+ErmE
E+E
rmE+id3rmEE+id3
rmEE+id3rmE
id2
+id3
rmE
id2
+id3
rm
id1
id2+id3
rm
id1
id2+id3
3.4.2句柄3.4.3用棧實(shí)現(xiàn)移進(jìn)歸約分析先通過移進(jìn)歸約分析器在分析輸入串id1
id2+id3時(shí)的動(dòng)作序列,來了解移進(jìn)歸約分析的工作方式。棧輸入
動(dòng)作
$
id1
id2
+id3$移進(jìn)
$id1
id2
+id3$按E
id歸約
$E
id2
+id3$移進(jìn)
$E
id2
+id3$ 移進(jìn)
$Eid2
+id3$按E
id歸約
$EE
+id3$
移進(jìn)
$EE+
id3$ 移進(jìn)
$EE+id3
$ 按E
id歸約
$EE+E
$ 按E
E+E歸約
$EE
$ 按E
EE歸約
3.4.3用棧實(shí)現(xiàn)移進(jìn)歸約分析要想很好地使用移進(jìn)歸約方式,尚需解決一些問題如何決策移進(jìn)還是歸約進(jìn)行歸約時(shí),如何確定右句型中將要?dú)w約的子串進(jìn)行歸約時(shí),如何確定選擇哪一個(gè)產(chǎn)生式3.4.4移進(jìn)歸約分析的沖突1、移進(jìn)歸約沖突例 stmt
ifexprthenstmt |ifexprthenstmtelsestmt|other 如果移進(jìn)歸約分析器處于格局 棧
輸入 …ifexprthenstmt else…$是移進(jìn)還是歸約?-沖突!2、歸約歸約沖突stmtid(parameter_list)|expr=exprparameter_list
parameter_list,parameter|parameterparameter
idexpr
id(expr_list)|idexpr_list
expr_list,expr|expr分析由A(I,J)開始的語句 棧 輸入 …id(id ,id)…歸約成expr還是parameter?3.5
LR分析器本節(jié)介紹LR(k)分析技術(shù)特點(diǎn)適用于一大類上下文無關(guān)文法效率高主要介紹構(gòu)造LR分析表的三種技術(shù)簡單的LR方法(簡稱SLR)規(guī)范的LR方法向前看的LR方法(簡稱LALR)
3.5.1LR分析算法輸入LR分析程序輸出棧LR分析器的模型actiongotosmXmsm-1Xm-1…s0…a1ai…an$L表示從左到右掃描輸入串;R表示構(gòu)造一個(gè)最右推導(dǎo)的逆過程例
(1)E
E+T(2)E
T
(3)T
TF(4)
T
E
(5)F(E)(6)Fid(P70)狀態(tài)動(dòng)
作(action
)轉(zhuǎn)
移(goto)
id
+()$
E
TF
0s5s41231s6acc
2
r2s7r2r23r4r4r4r44…
s5s4
…
…
823……
移進(jìn)(Sj)把當(dāng)前a和狀態(tài)j進(jìn)棧歸約(rj)按第j個(gè)產(chǎn)生式歸約
接受(acc)成功結(jié)束出錯(cuò)(空白或出錯(cuò)處理)GOTO(S,X)狀態(tài)S面對(duì)文法符號(hào)X時(shí),下一狀態(tài)是什么棧輸入
動(dòng)作
0
id
id
+id$移進(jìn)
0id5
id
+id$按F
id歸約
0F3
id
+id$按TF歸約
0T2
id
+id$ 移進(jìn)
0T2*7
id+id$移進(jìn)
0T2*7id5
+id$按F
id歸約
0T2*7F10
+id$ 按T
T*F歸約
0T2
+id$ 按E
T歸約
…
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024城市公共交通系統(tǒng)運(yùn)營合作合同
- 2024年體育俱樂部與運(yùn)動(dòng)員轉(zhuǎn)會(huì)合同
- 2024土地使用權(quán)轉(zhuǎn)讓合同范本及稅費(fèi)
- 2024年大型購物中心消防設(shè)施維修合同
- 2024年小型工程建筑合同:新版施工條款
- 2024年地下管線探測及數(shù)據(jù)處理合同
- 辦公室離職后工作交接
- 橋梁加固圍擋施工合同
- 2024年工業(yè)用地地平施工改造合同
- 超市車位租賃合同范本
- 2024年四川省達(dá)州市中考英語試題含解析
- 金融求職自我介紹
- 標(biāo)志設(shè)計(jì)(全套課件88P)
- 2023年高考物理一輪復(fù)習(xí)練習(xí)題:靜電場及其應(yīng)用(含基礎(chǔ)、提升兩套)
- 鋰離子電池行業(yè)發(fā)展趨勢
- 第十八章 正比例函數(shù)和反比例函數(shù)(5類壓軸題專練)
- 單項(xiàng)式乘多項(xiàng)式教案
- DL-T 5190.1-2022 電力建設(shè)施工技術(shù)規(guī)范 第1部分:土建結(jié)構(gòu)工程(附條文說明)
- 內(nèi)分泌疾病內(nèi)分泌疾病診療規(guī)范
- (完整word版)手卡模板(總2頁)
- 高壓蒸汽滅菌鍋(SANYO)
評(píng)論
0/150
提交評(píng)論