程序設(shè)計(jì)語(yǔ)言與編譯-編譯原理-自下而上的語(yǔ)法分析課件_第1頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯-編譯原理-自下而上的語(yǔ)法分析課件_第2頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯-編譯原理-自下而上的語(yǔ)法分析課件_第3頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯-編譯原理-自下而上的語(yǔ)法分析課件_第4頁(yè)
程序設(shè)計(jì)語(yǔ)言與編譯-編譯原理-自下而上的語(yǔ)法分析課件_第5頁(yè)
已閱讀5頁(yè),還剩193頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章自下而上的語(yǔ)法分析第一節(jié)引言自下而上分析:從輸入串出發(fā),歸約,直至開(kāi)始符方法:采用棧,在移進(jìn)的過(guò)程中,觀察棧頂是否形成某個(gè)產(chǎn)生式的一個(gè)候選

第8章自下而上的語(yǔ)法分析第一節(jié)引言自下而上分析:從輸入串G(S):

SSASSbAccAAa看輸入串bccab的歸約過(guò)程一.分析樹(shù)bScSccSaccSAccSASbASSASS符號(hào)棧

G(S):一.分析樹(shù)bSccaAAbSS符號(hào)棧SSSAbccAbaSbAcAacAaSb輸入串bccab分析樹(shù)的形成

SSSAbccAbaSbAcAacAaSb輸入串bccab分分析樹(shù)的剪枝過(guò)程SSSAbccAbaSSSAccAbaSSSAccAbSSSAccAbSSSAbSSSA

分析樹(shù)的剪枝過(guò)程SSSAbccAbaSSSAccAbaSSS

關(guān)鍵問(wèn)題:如何判斷棧頂符號(hào)串是否形

成可歸約串、如何歸約?當(dāng)對(duì)不同的歸約串進(jìn)行歸約,即形成了

不同的自下而上語(yǔ)法分析方法。

關(guān)鍵問(wèn)題:如何判斷棧頂符號(hào)串是否形

設(shè)有文法G,S是開(kāi)始符號(hào),設(shè)是G的一個(gè)句型,若有

S且A

則稱(chēng)是句型關(guān)于A的短語(yǔ);++在上面定義中,如果A直接推出,即A,則稱(chēng)是句型關(guān)于A的直接短語(yǔ);一個(gè)句型的最左直接短語(yǔ)稱(chēng)為句柄;二.回顧幾個(gè)核心概念短語(yǔ)直接短語(yǔ)句柄設(shè)有文法G,S是開(kāi)始符號(hào),設(shè)是G的一個(gè)句型,若有+EET+TTFFi*

G(E)E→E+T|TT→T*F|FF→(E)|i求T*F+i的短語(yǔ)、直接短語(yǔ)、句柄利用推導(dǎo)樹(shù)判斷句型的短語(yǔ)

EET+TTFFi*G(E)E→E

素短語(yǔ):文法G某句型的一個(gè)短語(yǔ)是素短語(yǔ),當(dāng)且僅當(dāng)它至少含有一個(gè)終結(jié)符,且除它自身之外不再含更小的素短語(yǔ);最左素短語(yǔ):在具有多個(gè)素短語(yǔ)的句型中處于最左邊的那個(gè)素短語(yǔ);E1E2+T2T1T3*F2F1i1F3i2素短語(yǔ):文法G某句型的一個(gè)短語(yǔ)是素短語(yǔ),當(dāng)且僅當(dāng)它至SSSAbccAbaSSSAccAbaSSSAccAbSSSAccAbSSSAbSSSA

SSSAbccAbaSSSAccAbaSSSAccAbSSS假定是文法G的一個(gè)句子,序列n,n-1,…,0滿(mǎn)足下述條件時(shí)稱(chēng)為規(guī)范歸約。(1)n=α;(2)0為文法的開(kāi)始符,即0=S;(3)對(duì)i,0<in,i-1是從i經(jīng)把句柄替換為相應(yīng)產(chǎn)生式的左部符號(hào)而得到的。三.規(guī)范歸約(最左歸約)

假定是文法G的一個(gè)句子,序列n,n-1,…,0EET+FTii*FTiFi+i*iF+i*iT+i*iE+i*iE+F*iE+T*iE+T*FE+TE例:G(E)E→E+T│TT→T*F│FF→(E)│ii+i*i的分析過(guò)程

EET+FTii*FTiFi+i*iF+i*iT+i*iE+例:G(S)S→aAcBeA→Ab|bB→dabbcde的分析過(guò)程SaAcBe

AbdbabbcdeaAbcdeaAcdeaAcBeS

例:G(S)S→aAcBeSaA內(nèi)容回顧

語(yǔ)法分析自上而下自上而下1.規(guī)范規(guī)約內(nèi)容回顧語(yǔ)法分析自上而下自上而下1.規(guī)范規(guī)約1.算符文法上下文無(wú)關(guān)文法G,沒(méi)有形如P→ε或P→...QR...的產(chǎn)生式,則稱(chēng)G為算符文法。第二節(jié)算符優(yōu)先分析法一.算符優(yōu)先文法

1.算符文法第二節(jié)算符優(yōu)先分析法一.算符優(yōu)先文法對(duì)算符文法G,a,bVT

定義2.終結(jié)符之間的優(yōu)先關(guān)系

(1)a=b:G中有P→...ab...或P→...aQb...++(2)a<b:G中有P→...aQ...且Qb…或QRb...++(3)a>b:G中有P→...Qb...且Q...a或Q…aR對(duì)算符文法G,a,bVT定義2.終結(jié)符之間的優(yōu)先若算符文法G的任何終結(jié)符a,b之間的優(yōu)先關(guān)系至多有=、>、<中的一個(gè),則G為一算符優(yōu)先文法。

據(jù)定義,構(gòu)造下述文法G的優(yōu)先關(guān)系表G(E):E→E+T|TT→T*F|FF→(E)|i3.算符優(yōu)先文法

若算符文法G的任何終結(jié)符a,b之間的優(yōu)先關(guān)系至3.算符優(yōu)先++**ii(())##>>><><<<<>>><<<<<<<<>>>>>>>>==算符優(yōu)先關(guān)系表

++**ii(())##>>><><<<<>>><<<<<<從上表可知:(1)相同終結(jié)符之間的優(yōu)先關(guān)系未必是=(2)有a<b,未必有b>a(3)a、b之間未必一定有優(yōu)先關(guān)系故=、<、>不同于關(guān)系運(yùn)算符“等于”、“小于”、“大于”

從上表可知:初始化:#棧讀一符號(hào)ba=b=#a<b或a=ba>b歸約最左素短語(yǔ),最左素短語(yǔ)出棧,左部符號(hào)入棧結(jié)束b入棧出錯(cuò)YNYYNN二.算符優(yōu)先分析算法a為棧頂終結(jié)符初始化:#棧讀一符號(hào)ba=b=#a<b或a=ba>b歸這是一種結(jié)構(gòu)歸約,處于棧頂待歸約的最左素短語(yǔ)與對(duì)應(yīng)的產(chǎn)生式在結(jié)構(gòu)上應(yīng)一致,即長(zhǎng)度一致,對(duì)應(yīng)的終結(jié)符一致,而非終結(jié)符可以不一致。歸約最左素短語(yǔ)的方法

E→E+TE+E這是一種結(jié)構(gòu)歸約,處于棧頂待歸約的最左素短語(yǔ)與對(duì)應(yīng)的產(chǎn)

算法優(yōu)先分析法的實(shí)現(xiàn):使用一個(gè)分析棧,當(dāng)其棧頂形成最左素短語(yǔ)時(shí),就進(jìn)行歸約。分析算法k:=1;S[k]=‘#’;repeatb:=下一輸入符號(hào);ifS[k]VTthenj:=kelsej:=k-1;whileS[j]>bdobeginrepeatQ:=S[j];ifS[j-1]VTthenj:=j-1elsej:=j-2;untilS[j]<Q;

把S[j+1]…S[k]歸約成某個(gè)N;k:=j+1;S[k]:=N;endofwhile;ifS[j]<borS[j]=bthenbegink:=k+1;S[k]:=bendelseerroruntila=‘#’;初始化,棧底置輸入串結(jié)束符;棧頂終結(jié)符,如果棧頂是終結(jié)符,則棧頂終結(jié)符是該終結(jié)符;如果棧頂是非終結(jié)符,則棧頂終結(jié)符是下一個(gè)終結(jié)符;如果棧頂終結(jié)符的優(yōu)先級(jí)大于輸入字符a,開(kāi)始?xì)w約;在棧頂尋找最左素短語(yǔ);如果棧頂終結(jié)符的優(yōu)先級(jí)小于或等于輸入字符,把輸入字符移進(jìn)棧;棧頂終結(jié)符=輸入字符=‘#’時(shí),分析結(jié)束算法優(yōu)先分析法的實(shí)現(xiàn):使用一個(gè)分析棧,當(dāng)其棧頂形成最左例G(E)E→E+T│TT→T*F│FF→(E)│ii+i*i的分析過(guò)程

例G(E)E→E+T│T步驟1234567891011下推棧輸入串動(dòng)作#i+i*i##<i,移進(jìn)i#i+i*i#i>+,用Fi歸約#F+i*i##<+,移進(jìn)+#F+i*i#+<i,移進(jìn)i#F+i*i#i>*,用Fi歸約#F+F*i#+<*,移進(jìn)*#F+F*i#*<i,移進(jìn)i#F+F*i####i>#,用Fi歸約*>#,用TT*F歸約+>#,用EE+T歸約結(jié)束#F+F*F#F+T#E

步驟1234567891011下推棧輸入串動(dòng)作#i+i*i#EET+FTii*FTiFEET+FTii*FTFEET+FTi*FTFEET+FT*FTFEET+TF

EET+FTii*FTiFEET+FTii*FTFEET+F

FIRSTVT(P)={a|Pa…,或PQa…,aVT,QVN}

++三.優(yōu)先關(guān)系表的構(gòu)造(1)FIRSTVT集若Pa…或PQa…,則aFIRSTVT(P);若PQ…,則FIRSTVT(Q)FIRSTVT(P);直至FIRSTVT(P)不再增大。求法

++三.優(yōu)先關(guān)系表的構(gòu)造(1)FIRSTVT集若Pa…

LASTVT(P)={a|P...a,或P…aQ,aVT,QVN}

++(2)LASTVT集若P...a或P…aQ,則aLASTVT(P);若P...Q,則LASTVT(Q)LASTVT(P);直至LASTVT(P)不再增大。求法

++(2)LASTVT集若P...a或P例G(E)E→E+T│TT→T*F│FF→(E)│iETFFIRSTVTLASTVT(i+*(i)i+*)i*)i(i*

例G(E)E→E+T│TETFFIR(3)構(gòu)造優(yōu)先關(guān)系表

a=b:G中有P→...ab...或P→...aQb...a<b:G中有P→...aQ...且Qb…或QRb...a<bFIRSTVT(Q)a>b:G中有P→...Qb...且Q...a或Q…aRaLASTVT(Q)>b(3)構(gòu)造優(yōu)先關(guān)系表a=b:G中有P→...ab.

FOR每條產(chǎn)生式PX1X2…XnDOFORi:=1TOn-1DOBEGINIFXi和Xi+1均為終結(jié)符THENXi=Xi+1;IFi<=n-2且Xi和Xi+2均為終結(jié)符但Xi+1VNTHENXi=Xi+2;IFXiVT,Xi+1VNTHENaFIRSTVT(Xi+1)Xi<a;IFXiVN,Xi+1VTTHENaLASTVT(Xi)a>Xi+1END;

構(gòu)造優(yōu)先關(guān)系表的算法

構(gòu)造優(yōu)先關(guān)系表的算法例G(E)E→E+T│TT→T*F│FF→(E)│iETFFIRSTVTLASTVT(i+*(i)i+*)i*)i(i*考察E→E+T中的E和+、+和T考察T→T*F中的T和*、*和F考察F→(E)中的(和E

、(和)、E和)

例G(E)E→E+T│TETFFIRSTVTLAS++**ii(())##>>><><<<<>>><<<<<<<<>>>>>>>>==算符優(yōu)先關(guān)系表

++**ii(())##>>><><<<<>>><<<<<<內(nèi)容回顧

條件一:

無(wú)

P→ε算符優(yōu)先分析法1.算符文法條件二:

無(wú)

P→…QP…2.定義優(yōu)先關(guān)系(1)a=b(2)a<b(3)a>b3.算法優(yōu)先文法優(yōu)先關(guān)系表內(nèi)容回顧條件一:無(wú)P→ε算符優(yōu)先分析法1.算符文法條內(nèi)容回顧

5.分析方法初始化:#棧讀一符號(hào)ba=b=#a<b或a=ba>b歸約最左素短語(yǔ),最左素短語(yǔ)出棧,左部符號(hào)入棧結(jié)束b入棧出錯(cuò)YNYYNN內(nèi)容回顧5.分析方法初始化:#棧讀一符號(hào)ba=b=#內(nèi)容回顧

5.構(gòu)造算符優(yōu)先表(1)FIRSTVT(2)LASTVT(3)構(gòu)造方法P→...Qb...P→...bQ...P→...ab...或...aQb...內(nèi)容回顧5.構(gòu)造算符優(yōu)先表(1)FIRSTVT(2)L已知文法

G=({a,b,(,)},{S,A,B},S,P)其中

P為S—>bAbA—>(B|aB—>Aa)1.求出文法G的FIRSTVT和LASTVT集。2.構(gòu)造文法G的優(yōu)先關(guān)系表。3.文法G是算符優(yōu)先文法嗎?為什么?課堂練習(xí)已知文法G=({a,b,(,)},{S,A,B},S,P)第二節(jié)LR分析法一.LR(K)分析法自底向上的LR分析法是指從左向右掃描輸入串,每次分析由分析棧中符號(hào)及向前搜索K個(gè)輸入符號(hào),以確定作為產(chǎn)生式右部的短語(yǔ)(句柄)是否已在分析棧的棧頂形成,從而決定應(yīng)采取的動(dòng)作。這種分析方法稱(chēng)為L(zhǎng)R(K)分析法。一般只考慮K1的情況。-“L”是指從左至右掃描輸入符號(hào)串,-“R”是指構(gòu)造一個(gè)最右推導(dǎo)的逆過(guò)程,-“k”是指為了作出分析決定而向前看的輸入符號(hào)的個(gè)數(shù)

第二節(jié)LR分析法一.LR(K)分析法自底向上的LR分析其組成為:分析棧,控制程序,分析表,輸入串輸入串分析棧驅(qū)動(dòng)程序輸出actiongoto分析表s0...sm-1sma1ai#......

其組成為:分析棧,控制程序,分析表,輸入串輸入串分析棧驅(qū)動(dòng)程

1.分析棧存放狀態(tài);初始時(shí),置初始狀態(tài)s0;棧里的每一狀態(tài)概括了從分析開(kāi)始到某一時(shí)刻已進(jìn)行的分析工作。

1.分析棧存放狀態(tài);初始時(shí),置初始狀態(tài)s0;棧里的每一狀態(tài)2.分析表由action[s,a]和goto[s,x]兩個(gè)子表組成。

(1)action[s,a]定義了在狀態(tài)s下,當(dāng)前輸入符號(hào)為a時(shí)應(yīng)采取的分析動(dòng)作:移進(jìn),歸約,接受,出錯(cuò)。

(2)goto表是一個(gè)狀態(tài)及非終結(jié)符的二維矩陣,goto[s,x]定義了在狀態(tài)s下,面對(duì)文法符號(hào)x時(shí)的狀態(tài)轉(zhuǎn)換。

2.分析表由action[s,a]和goto[s,x例G0(E)(1)E→E+T(2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→i的LR分析表如下:

例G0(E)LR分析表狀態(tài)01234567891011actiongotoi+*()#ETFs5s4123s6accr2s7r2r2r4r4r4r4r4s5s4823r6r6r6r6s5s493s5s410s6s11r1s7r1r1r3r3r3r3r5r5r5r5

LR分析表狀01234567891011actiongoto3.控制程序的工作據(jù)action[s,a]進(jìn)行(1)若action[s,a]=

sj

,則將狀態(tài)j推入棧頂,輸入指針指向下一輸入符號(hào);(2)若action[s,a]=rj

,則按第j個(gè)產(chǎn)生式A歸約,設(shè)||=t,應(yīng)在分析棧棧頂上托t個(gè)狀態(tài)出棧,呈現(xiàn)棧頂?shù)臓顟B(tài)設(shè)為si,則根據(jù)si及歸約后的非終結(jié)符A,查goto表,goto[si

,A]=j,則將狀態(tài)j下推入分析棧棧頂。(3)若action[s,a]=acc,則結(jié)束分析,輸入串被接受。(4)若action[s,a]或goto[s,A]不是上述情況,轉(zhuǎn)出錯(cuò)處理程序

3.控制程序的工作據(jù)action[s,a]進(jìn)行(1)若ac

序號(hào)狀態(tài)符號(hào)輸入串動(dòng)作10#i+i*i#action[0,i]=s520,5#i+i*i#action[5,+]=r6,goto[0,F]=330,3#F+i*i#action[3,+]=r4,goto[0,T]=240,2#T+i*i#action[2,+]=r2,goto[0,E]=150,1#E+i*i#action[1,+]=s660,1,6#E+i*i#action[6,i]=s570,1,6,5#E+i*i#action[5,*]=r6,goto[6,F]=380,1,6,3#E+F*i#action[3,*]=r4,goto[6,T]=990,1,6,9#E+T*i#action[9,*]=s7100,1,6,9,7#E+T*i#action[7,i]=s5110,1,6,9,7,5#E+T*i#action[5,#]=r6,goto[7,F]=10120,1,6,9,7,10#E+T*F#action[10,#]=r3,goto[6,T]=9130,1,6,9#E+T#action[9,#]=r1,goto[0,E]=1140,1#E#action[1,#]=acc,接受例:i+i*i的分析過(guò)程(6)F→i序號(hào)狀態(tài)符號(hào)輸入串動(dòng)作10#i+i*i#action[0,

序號(hào)狀態(tài)符號(hào)輸入串動(dòng)作10i+i*i#action[0,i]=s520,5+i*i#action[5,+]=r6,goto[0,F]=330,3+i*i#action[3,+]=r4,goto[0,T]=240,2+i*i#action[2,+]=r2,goto[0,E]=150,1+i*i#action[1,+]=s660,1,6i*i#action[6,i]=s570,1,6,5*i#action[5,*]=r6,goto[6,F]=380,1,6,3*i#action[3,*]=r4,goto[6,T]=990,1,6,9*i#action[9,*]=s7100,1,6,9,7i#action[7,i]=s5110,1,6,9,7,5#action[5,#]=r6,goto[7,F]=10120,1,6,9,7,10#action[10,#]=r3,goto[6,T]=9130,1,6,9#action[9,#]=r1,goto[0,E]=1140,1#action[1,#]=acc,接受例:i+i*i的分析過(guò)程(6)F→i序號(hào)狀態(tài)符號(hào)輸入串動(dòng)作10i+i*i#action[0,iEET+FTii*FTiFi+i*IF+i*iT+i*iE+i*iE+F*iE+T*iE+T*FE+TE

EET+FTii*FTiFi+i*I特點(diǎn):歸約符號(hào)串總是在棧頂;句柄之后的待入棧符號(hào)串總是終結(jié)符;在符號(hào)棧中的符號(hào)串是規(guī)范句型的前綴.

特點(diǎn):內(nèi)容回顧

LR分析法(4)總控程序(3)LR分析表(1)輸入串(2)分析棧action[s,a]sj

rj

accerrorgoto[si

,A]=j內(nèi)容回顧LR分析法(4)總控程序(3)LR分析表(1)例子:(0)S'→E(1)E→aA(2)E→bB(3)A→cA(4)A→d(5)B→cB(6)B→d對(duì)輸入串bccd#分析。

例子:

序號(hào)狀態(tài)符號(hào)輸入串動(dòng)作10#bccd#action[0,b]=s320,3#bccd#action[3,c]=s530,3,5#bccd#action[5,c]=s540,3,5,5#bccd#action[5,d]=s1150,3,5,5,11#bccd#action[11,#]=r6,goto[5,B]=960,3,5,5,9#bccB#Action[9,#]=r5,goto[5,B]=970,3,5,9#bcB#Action[9,#]=r5,goto[3,B]=780,3,7#bB#action[7,#]=r2,goto[0,E]=190,1#E#action[9,*]=accbccd#的分析過(guò)程序號(hào)狀態(tài)符號(hào)輸入串動(dòng)作10#bccd#action[0,b4.幾種LR分析法LR(0)、SLR(1)、LR(1)、LALR(1)

4.幾種LR分析法LR(0)、SLR(1)、LR(1)、*RR二.LR(0)項(xiàng)目集規(guī)范族1.活前綴:規(guī)范句型的不含句柄之后任何符號(hào)的一個(gè)前綴。亦即:若A→是文法的一個(gè)產(chǎn)生式,且有

SA

則的任何前綴都是規(guī)范句型的活前綴。

*RR二.LR(0)項(xiàng)目集規(guī)范族1.活前綴:規(guī)范句型的已知文法G(S),分析符號(hào)串a(chǎn)bbcde是否是G(S)的句子

(1)S→aAcBe

(2)A→b

(3)A→Ab

(4)B→d

句子的最右推導(dǎo)過(guò)程為:

S=>aAcBe=>aAcde=>aAbcde=>abbcde

已知文法G(S),分析符號(hào)串a(chǎn)bbcde是否是G(S)的句子

由于最右推導(dǎo)就是規(guī)范推導(dǎo),因此句型aAcBe、aAcde、aAbcde、abbcde為規(guī)范句型。

S=>aAcBeaAcBe的活前綴:ε,a,aA,aAc,aAcB,aAcBeS=>aAcBe=>aAcdeaAcde的活前綴:ε,a,aA,aAc,aAcdS=>aAcBe=>aAcde=>aAbcdeaAbcde的活前綴:ε,a,aA,aAbB→dA→AbS=>aAcBe=>aAcde=>aAbcde=>abbcdeA→babbcde的活前綴:ε,a,ab

S=>aAcBe=>aAcde=>aAbcde=>abbcde

由于最右推導(dǎo)就是規(guī)范推導(dǎo),因此句型S=>aAcBeaAc(1)作為規(guī)范句型的活前綴,它不含句柄后的任何符號(hào)。(2)活前綴與句柄之間的三種關(guān)系:活前綴不含句柄的任何符號(hào),此時(shí)期待從剩余輸入串中識(shí)別由A→的能推導(dǎo)出的符號(hào)串;活前綴只含句柄的真前綴,也即產(chǎn)生式A→中已識(shí)別于分析棧棧頂之上,

期待從剩余輸入串中識(shí)別由所能推導(dǎo)出的符號(hào)串;活前綴已含句柄的全部符號(hào),這表明產(chǎn)生式A→的右部符號(hào)已在分析棧棧頂之上,應(yīng)將歸約為A。(3)句柄是一類(lèi)活前綴的后綴,如果能識(shí)別一個(gè)文法的所有活前綴,自然也就能識(shí)別這個(gè)文法的所有句柄了。

(1)作為規(guī)范句型的活前綴,它不含句柄后的任何符號(hào)。項(xiàng)目:在產(chǎn)生式右部添加一個(gè)圓點(diǎn)如A→?、A→?、A→?

左邊:已經(jīng)識(shí)別;右邊:等等識(shí)別

項(xiàng)目個(gè)數(shù):n+1歸約項(xiàng)目:形如A→?移進(jìn)項(xiàng)目:形如A→?a,aVT待約項(xiàng)目:形如A→?B,BVN接受項(xiàng)目:形如S→?,S為開(kāi)始符2.LR(0)項(xiàng)目及分類(lèi)

項(xiàng)目:在產(chǎn)生式右部添加一個(gè)圓點(diǎn)2.LR(0)項(xiàng)目及分類(lèi)例:產(chǎn)生式S→aAcBe對(duì)應(yīng)的6個(gè)項(xiàng)目是:[0]S→.aAcBe[1]S→a.AcBe[2]S→aA.cBe[3]S→aAc.Be[4]S→aAcB.e[5]S→aAcBe.

例:產(chǎn)生式S→aAcBe對(duì)應(yīng)的6個(gè)項(xiàng)目是:3.拓廣文法增加產(chǎn)生式S’→S,從而S’→S?成為唯一的接受項(xiàng)目.4.狀態(tài)轉(zhuǎn)換圖的構(gòu)造一個(gè)項(xiàng)目對(duì)應(yīng)一個(gè)狀態(tài),S’→?S為唯一初態(tài),其余均為終態(tài)(活前綴識(shí)別態(tài))。

3.拓廣文法增加產(chǎn)生式S’→S,從而S’→S?成為唯一的接受構(gòu)造識(shí)別所有活前綴的轉(zhuǎn)換圖:每個(gè)狀態(tài)是一個(gè)LR(0)項(xiàng)目; S→?S是唯一的初態(tài);所有的其他項(xiàng)目是終態(tài),是某個(gè)活前綴的識(shí)別態(tài);若狀態(tài)i為X→X1…Xi-1?Xi…Xn,狀態(tài)j為X→X1…Xi?Xi+1…Xn,則從狀態(tài)i畫(huà)一條有向邊到狀態(tài)j,標(biāo)記為Xi;如果Xi為一非終結(jié)符,并有Xi→1|2|…|m

則從狀態(tài)i畫(huà)有向邊到所有狀態(tài)Xi→?i。

S→?EE→?T構(gòu)造識(shí)別所有活前綴的轉(zhuǎn)換圖:S→?E例:S→BBB→aBB→bS'→?SS'→S?S→?BBS→B?BS→BB?B→?aBB→a?BB→aB?B→?bB→b?S'→SS→BBB→aBB→b拓廣這個(gè)文法的項(xiàng)目有:12S345BB678Ba910b

例:S'→?SS'→S拓廣這個(gè)文法的項(xiàng)目有:12S345B*RR5.項(xiàng)目的有效性

(1)對(duì)于項(xiàng)目A→?,如果有

SA則稱(chēng)A→?對(duì)活前綴有效。意思是:到達(dá)項(xiàng)目A→?時(shí),已識(shí)別出,希望繼續(xù)識(shí)別從推出的串。

若A→?B對(duì)活前綴有效,則B→?對(duì)活前綴也有效。*RR5.項(xiàng)目的有效性(1)對(duì)于項(xiàng)目A→?,如果有因?yàn)镾’AB則,設(shè)’,有

S’ABB’’即S’B’’所以,B→?對(duì)也有效。*RRR***RRRRRR*

若A→?B對(duì)活前綴有效,則B→?對(duì)活前綴也有效。因?yàn)镾’AB*RRR***RRRRRR*(2)有效項(xiàng)目集:對(duì)活前綴有效的項(xiàng)目的集合稱(chēng)為對(duì)的有效項(xiàng)目集。

(3)LR(0)項(xiàng)目集規(guī)范族:文法G的所有有效項(xiàng)目集組成的集合。

(2)有效項(xiàng)目集:對(duì)活前綴有效的項(xiàng)目的集合稱(chēng)為對(duì)內(nèi)容回顧

LR分析法輸入串分析??偪爻绦騆R分析表活前綴規(guī)范句型+不含句柄之后任何符號(hào)LR(0)項(xiàng)目歸約項(xiàng)目:形如A→?移進(jìn)項(xiàng)目:形如A→?a,aVT待約項(xiàng)目:形如A→?B,BVN接受項(xiàng)目:形如S→?,S為開(kāi)始符狀態(tài)轉(zhuǎn)換圖S→BBB→aB內(nèi)容回顧LR分析法輸入串活前綴規(guī)范句型+不含句柄之后任何符*RR

(1)對(duì)于項(xiàng)目A→?,如果有

SA則稱(chēng)A→?對(duì)活前綴有效。

(2)若A→?B對(duì)活前綴有效,則B→?對(duì)活前綴也有效。有效項(xiàng)目集LR(0)項(xiàng)目集規(guī)范族有效項(xiàng)目*RR(1)對(duì)于項(xiàng)目A→?,如果有(2)若A→?6.閉包函數(shù)closure(I)設(shè)I是文法G的一個(gè)LR(0)項(xiàng)目集(1)對(duì)任何iI,都有iclosure(I);(2)若項(xiàng)目ABclosure(I),且B為文法G的一個(gè)產(chǎn)生式,則Bclosure(I);(3)重復(fù)(2)直至closure不再增大。

6.閉包函數(shù)closure(I)設(shè)I是文法G的一個(gè)LR(0)例:S→BBB→aBB→bS'→?SS'→S?S→?BBS→B?BS→BB?B→?aBB→a?BB→aB?B→?bB→b?S'→SS→BBB→aBB→b拓廣這個(gè)文法的項(xiàng)目有:

closure({S'?S})Closure(S'→S?)Closure(S→B?B)={S'→S?}={S→B?B,B→?aB,B→?b}={S'→?S,S→?BB,B→?aB,B→?b}={S→B?B,B→?aB,B→?b}例:S'→?SS'→S拓廣這個(gè)文法的項(xiàng)目有:closure7.轉(zhuǎn)換函數(shù)Go(I,X)設(shè)XVTVNgo(I,X)=closure(J)J:{任何形如AX的項(xiàng)目|AXI}AX項(xiàng)目集IXAXClosure(AX)Go(I,X)

7.轉(zhuǎn)換函數(shù)Go(I,X)設(shè)XVTVNAX項(xiàng)目集S'→?SS'→S?S→?BBS→B?BS→BB?B→?aBB→a?BB→aB?B→?bB→b?

I0=closure({S'?S})={S'→?S,S→?BB,B→?aB,B→?b}I1=Go(I0,S)=Closure(S→S?)={S→S?}I2=Go(I0,B)=Closure(S→B?B)={S→B?B,B→?aB,B→?b}I3=Go(I0,a)=Closure(S→a?B)={S→a?B,B→?aB,B→?b}I4=Go(I0,b)=Closure(B→?b)={B→b?}S'→?SI0=closure({S'?S})={S'→8.LR(0)項(xiàng)目集規(guī)范族的構(gòu)造beginC:={closure({S’→S})};repeatforC中每一項(xiàng)目集I和文法符號(hào)Xdoifgo(I,X)不空且go(I,X)Cthen

把go(I,X)加入C中

untilC不再增大end;

I2={S→?BB,B→?aB,B→?b}go(I2,S)為空8.LR(0)項(xiàng)目集規(guī)范族的構(gòu)造beginI2={S→?

I0=closure({S'?S})I1=go(I0,S)I2=go(I0,B)I3=go(I0,a)I4=go(I0,b)I5=go(I2,B)I6=go(I3,B)={S'→?S,S→?BB,B→?aB,B→?b}={S'→S?}={S→B?B,B→?aB,B→?b}={B→a?B,B→?aB,B→?b}={B→b?}go(I2,a)=go(I2,b)=={S→BB?}go(I3,a)=I3,go(I3,b)=I4={B→aB?},I3I4SBBb1234560abbaBS'→?SS'→S?S→?BBS→B?BS→BB?B→?aBB→a?BB→aB?B→?bB→b?例子I0=closure({S'?S})I1=go(I0,S三.LR(0)分析表的構(gòu)造(1)C={I0,I1,…,In},Ii對(duì)應(yīng)狀態(tài)i,I0=closure({S’S})為唯一初態(tài);(2)對(duì)每個(gè)Ii,若AaIi,且go(Ii,a)=Ij,則action[i,a]=sj;若AIi,A為第j個(gè)產(chǎn)生式,

則bVT{#},action[i,b]=rj;若S’SIi,則action[i,#]=acc;(3)若go(Ii,A)=Ij,則goto[i,A]=j;(4)凡不能用規(guī)則(2)、(3)登記的表項(xiàng)均為“錯(cuò)誤”

三.LR(0)分析表的構(gòu)造(1)C={I0,I1,…,In狀態(tài)Actiongotoab#SB0s3S4121acc2s3s453s3s464r3r3r35r1r1r16r2r2r2I0=closure({S'?S})I2=go(I0,B)I3=go(I0,a)I4=go(I0,b)I5=go(I2,B)I6=go(I3,B)={S'→?S,S→?BB,B→?aB,B→?b}={S'→S?}={S→B?B,B→?aB,B→?b}={B→b?}go(I2,a)=go(I2,b)=={S→BB?}go(I3,a)=I3go(I3,b)=I4={B→aB?}I1=go(I0,S)I3I4={B→a?B,B→?aB,B→?b}(0)S'→S(1)S→BB(2)B→aB(3)B→b

狀A(yù)ctiongotoab#SB0s3S4121acc2s3內(nèi)容回顧

LR(0)分析表的構(gòu)造1.擴(kuò)廣文法2.確定所有項(xiàng)目3.構(gòu)造LR(0)項(xiàng)目規(guī)范族閉包函數(shù)closure(I)轉(zhuǎn)換函數(shù)Go(I,X)ABclosure(I)且B為文法G的一個(gè)產(chǎn)生式

I:AXGo(I,X)=Closure(AX)則Bclosure(I)C={I0}={Closure(S’S)}對(duì)C中每一個(gè)項(xiàng)目集I和每一個(gè)文法符合Xgo(I,X)不空且go(I,X)C把go(I,X)加入C中內(nèi)容回顧LR(0)分析表的構(gòu)造1.擴(kuò)廣文法2.確定所有內(nèi)容回顧

4.構(gòu)造LR(0)分析表C={I0,I1,…,In}若AaIi且go(Ii,a)=Ij則action[i,a]=Sj若AIi

A為第j個(gè)產(chǎn)生式則bVT{#}action[i,b]=rj若S’SIiaction[i,#]=acc若ABIi且go(Ii,B)=IjGoto[Ii,B]=Ij內(nèi)容回顧4.構(gòu)造LR(0)分析表C={I0,I1,…,In例G0(E)(0)S’→E(1)E→E+T(2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→i

例G0(E)I0=closure({S’→S})S’EEE+TET,TT*FTF,F(E)FiI1=go(I0,E)S’EEE+TI2=go(I0,T)ETTT*FI3=go(I0,F)TFS’→EE→E+T│TT→T*F│FF→(E)│i

I4=go(I0,()F(E)EE+TETTT*FTFF(E)FiI6=go(I1,+)EE+TTT*FTFF(E)FiI5=go(I0,i)FiI7=go(I2,*)TT*FF(E),FiI8=go(I4,E)F(E)EE+TI9=go(I6,T)EE+T,TT*FI10=go(I7,F)TT*FI11=go(I8,))F(E)I0=closure({S’→S})S’→EI4=go(I0=closure({S’→E})S’EEE+TET,TT*FTF,F(E)FiI1=go(I0,E)S’EEE+TI2=go(I0,T)ETTT*FI3=go(I0,F)TF

I4=go(I0,()F(E)EE+TETTT*FTFF(E)FiI6=go(I1,+)EE+TTT*FTFF(E)FiI5=go(I0,i)Fi(0)S’→E(1)E→E+T(2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→iI0=closure({S’→E})I4=go(I0,(

I7=go(I2,*)TT*FF(E),FiI8=go(I4,E)F(E)EE+TI9=go(I6,T)EE+T,TT*FI10=go(I7,F)TT*FI11=go(I8,))F(E)go(I4,T)=I2go(I4,F)=I3go(I4,()=I4go(I4,i)=I5go(I6,F)=I3go(I6,()=I4go(I6,i)=I5go(I7,()=I4go(I7,i)=I5go(I8,+)=I6go(I9,*)=I7(0)S’→E(1)E→E+T(2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→iI7=go(I2,*)I8=go(I4,E)I9=go(I

LR(0)分析表狀態(tài)01234567891011actiongotoi+*()#ETFs5s4123r0accr2s7r2r2r4r4r4r4s5s4823r6r6r6r6s5s493s5s410s6s11r1s7/r1r1r1r3r3r3r3r5r5r5r5r2r2r4r4r6r6r1r1r3r3r5r5r0r0s6r0//r2LR(0)分析表狀01234567891011action

I2=go(I0,T)ETTT*FI1=go(I0,E)S’EEE+TI9=go(I6,T)EE+TTT*F移進(jìn)-規(guī)約沖突該文法不是一個(gè)LR(0)文法I2=go(I0,T)I1=go(I0,E)I9=go(I

假定一個(gè)LR(0)項(xiàng)目集規(guī)范族有一個(gè)項(xiàng)目集I={X?b,A?,B?}四.SLR(1)分析表的構(gòu)造X?bA?移進(jìn)-規(guī)約沖突B?規(guī)約-規(guī)約沖突假定一個(gè)LR(0)項(xiàng)目集規(guī)范族有一個(gè)項(xiàng)目集四.SLR(1

通過(guò)考察有關(guān)非終結(jié)符的FOLLOW集來(lái)解決移進(jìn)-歸約和歸約-歸約沖突,以此構(gòu)造出來(lái)的LR分析表,叫做SLR(1)分析表當(dāng)狀態(tài)I面臨任何輸入符號(hào)a時(shí),可采用如下策略:若a=b,則移進(jìn)若aFOLLOW(A),則用產(chǎn)生式A歸約若aFOLLOW(B),則用產(chǎn)生式B歸約此外,報(bào)錯(cuò)。I={X?b,A?,B?} 通過(guò)考察有關(guān)非終結(jié)符的FOLLOW集來(lái)解決移進(jìn)-歸約和歸

一般的解決辦法設(shè)一個(gè)LR(0)項(xiàng)目集規(guī)范族有一個(gè)項(xiàng)目集I:I={A1?a11,

A2?a22,…,Am?amm,

B1?,B2?,…,Bn?}若滿(mǎn)足{a1,a2,…,am}FOLLOW(Bi)=,i=1,2,…,nFOLLOW(Bi)FOLLOW(Bj)=,i,j=1,2…,n,且ij,則可以通過(guò)判斷當(dāng)前的輸入符號(hào)a屬于哪一個(gè)集合來(lái)解決沖突。則按如下策略構(gòu)造SLR(1)分析表:若a=ai(i=1,2,…,n),則移進(jìn)ai;aFOLLOW(Bi)(i=1,2…,n),則用Bi歸約;此外,按“出錯(cuò)”處理;一般的解決辦法設(shè)一個(gè)LR(0)項(xiàng)目集規(guī)范族有一個(gè)項(xiàng)目集I:SLR(1)分析表的構(gòu)造(1)C={I0,I1,…,In},Ii對(duì)應(yīng)狀態(tài)i,I0=closure({S’S})為唯一初態(tài);(2)對(duì)每個(gè)Ii,若AaIi,且go(Ii,a)=Ij,則action[i,a]=sj;若AIi,A為第j個(gè)產(chǎn)生式,

則bFOLLOW(A),action[i,b]=rj;若S’SIi,則action[i,#]=acc;(3)若go(Ii,A)=Ij,則goto[i,A]=j;(4)凡不能用規(guī)則(2)、(3)登記的表項(xiàng)均為“錯(cuò)誤”

SLR(1)分析表的構(gòu)造(1)C={I0,I1,…,In}例G0(E)(0)S’→E(1)E→E+T(2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→i

FOLLOW(S’)={#}FOLLOW(E)={+,),#}FOLLOW(T)={+,),#,*}FOLLOW(F)={+,),#,*}例G0(E)FOLLOW(S’)={

I1=go(I0,E)S’EEE+TI9=go(I6,T)EE+TTT*FI2=go(I0,T)ETTT*FI6=go(I1,+)s6(0)S’→EFOLLOW(S’)={#}accI7=go(I2,*)s7FOLLOW(E)={+,),#}(2)E→Tr2go(I9,*)=I7s7FOLLOW(E)={+,),#}(1)E→E+Tr1I1=go(I0,E)I9=go(I6,T)I2=go(ISLR(1)分析表狀態(tài)01234567891011actiongotoi+*()#ETFs5s4123s6accr2s7r2r2r4r4r4r4r4s5s4823r6r6r6r6s5s493s5s410s6s11r1s7r1r1r3r3r3r3r5r5r5r5

SLR(1)分析表狀01234567891011action

SLR分析表構(gòu)造步驟1.擴(kuò)展文法2.列出擴(kuò)展文法的LR(0)所有項(xiàng)目(0)S’一>S(4)E—>Aa(1)S—>E(5)A—>cA(2)E—>Aa(6)A—>d(3)E—>bB(7)B—>cB(8)B—>dS->EE->Aa|bBA->cA|dB->cB|d1.S’—>·S2.S'一>S.3.S一>.E4.S一>E.5.E一>.Aa6.E一>A.a7.E一>Aa.8.E一>.bB9.E一>b.B10.E一>bB.……1.移進(jìn)項(xiàng)目2.待約項(xiàng)目3.歸約項(xiàng)目4.接收項(xiàng)目SLR分析表構(gòu)造步驟1.擴(kuò)展文法2.列出擴(kuò)展文法的LR(0

S->EE->Aa|bBA->cA|dB->cB|d3.構(gòu)造LR(0)項(xiàng)目規(guī)范族I0=closure({S’→S})S’一>S,S—>E,E—>Aa,E—>bB,A—>cA,A—>dI1=go(I0,S)S’一>S

I2=go(I0,E)S—>EI3=go(I0,A)E—>AaI4=go(I0,b)E—>bB,B—>cB,B—>dI5=go(I0,c)A—>cA,A—>cA,A—>dI6=go(I0,d)A—>d

I7=go(I3,a)E—>Aa

I8=go(I4,B)E—>bBI9=go(I4,c)B—>cBB—>cB,B—>dI10=go(I4,d)B—>d

I11=go(I5,A)A—>cAI12=go(I9,B)B—>cBS->EE->Aa|bB3.構(gòu)造LR(0

4.構(gòu)造LR(0)分析表(1)I0=closure({S’S})為唯一初態(tài);(2)對(duì)每個(gè)Ii,若Aa…Ii,且go(Ii,a)=Ij,則action[i,a]=sj;若AA…Ii,go(Ii,A)=Ij,則goto[i,A]=j;若AIi,A為第j個(gè)產(chǎn)生式,則bVT{#},action[i,b]=rj;若S’SIi,則action[i,#]=acc;4.構(gòu)造LR(0)分析表(1)I0=closure({S

I0:S’一>S,S—>E,E—>Aa,E—>bB,A—>cA,A—>dI1=go(I0,S):S’一>SI2=go(I0,E):S—>EI3=go(I0,A):E—>AaI4=go(I0,b):E—>bB,B—>cB,B—>dI5=go(I0,c):A—>cA,A—>cA,A—>dI6=go(I0,d):A—>dI7=go(I3,a):E—>Aa

I8=go(I4,B):E—>bBI9=go(I4,c):B—>cBB—>cB,B—>dI10=go(I4,d):B—>d

I11=go(I5,A):A—>cAI12=go(I9,B):B—>cB(0)S’一>S(1)S—>E(2)E—>Aa(3)E—>bB(4)E—>Aa(5)A—>cA(6)A—>d(7)B—>cB(8)B—>dI5=go(I5,c)I6=go(I5,d)I9=go(I9,c)I10=go(I9,d)I0:S’一>S,S—>E,E—>Aa,E—>bLR(0)分析表狀態(tài)01234567891011actiongotoabcd#EABs5s6123s4accr1r1s7s10s98s5s6r611s9r8r8r8r5r5r5

Sr1r1r1r6r6r6r6r2r2r2r2r2r3r3r3r3r3s101212r8r8r5r5r7LR(0)分析表狀01234567891011actiongS->EE->Aa|bBA->cA|dB->cB|dLR(0)文法1.歸約—?dú)w約沖突2.移進(jìn)—?dú)w約沖突無(wú){X?b,A?}{A?,B?}SLR(1)分析表若AIi,A為第j個(gè)產(chǎn)生式,

則bFOLLOW(A),action[i,b]=rj;

S->ELR(0)文法1.歸約—?dú)w約沖突2.移進(jìn)—?dú)w約S’->SS->EE->Aa|bBA->cA|dB->cB|dFollow(S’)=Follow(S)=Follow(E)={#}Follow(A)={a}Follow(B)={#}I2=go(I0,E):S—>EI2:#:r1I6=go(I0,d):A—>dI6:a:r6I7=go(I3,a):E—>AaI7:#:r2

I8=go(I4,B):E—>bBI8:#:r3I10=go(I4,d):B—>dI10:#:r8

I11=go(I5,A):A—>cAI11:a:r5I12=go(I9,B):B—>cBI12:#:r7

S’->SFollow(S’)=Follow(S)=FollSLR(1)分析表狀態(tài)01234567891011actiongotoabcd#EABs5s6123s4accr1s7s10s98s5s6r611s9r8

Sr2r3s101212r5r7SLR(1)分析表狀01234567891011action文法:G(E)E→E+E|E*E|(E)|I(1)確定文法LR(0)項(xiàng)目規(guī)范族(2)構(gòu)造LR(0)分析表(3)構(gòu)造SLR(1)分析表(4)判斷是不是LR(0)文法(5)判斷是不是SLR(1)文法文法:G(E)E→E+E|E*E|(E)|I(0)S’→E(1)E→E+E(2)E→E*E(3)E→(E)(4)E→iI0=closure({S’→E})S’E,EE+E,EE*E,E(E),EiI1=go(I0,E)S’E,EE+E,EE*E移進(jìn)-歸約沖突I2=go(I0,()E(E),EE+E,EE*E,E(E),EiI3=go(I0,i)EiI4=go(I1,+)

EE+E,EE+E,EE*E,E(E),EiI5=go(I1,*)EE*E,EE+E,EE*E,E(E),EI(0)S’→EI0=closure({S’→E})I6=go(I2,E)E(E),EE+E,EE*EI7=go(I4,E)EE+E,EE+E,EE*E移進(jìn)-歸約沖突I8=go(I5,E)EE*E,EE+E,EE*E移進(jìn)-歸約沖突I9=go(I6,))E(E)I6=go(I2,E)

作業(yè)10.1,10.3,10.4,10.5,10.7作業(yè)10.1,10.3,10.4,10.5,10.7第8章自下而上的語(yǔ)法分析第一節(jié)引言自下而上分析:從輸入串出發(fā),歸約,直至開(kāi)始符方法:采用棧,在移進(jìn)的過(guò)程中,觀察棧頂是否形成某個(gè)產(chǎn)生式的一個(gè)候選

第8章自下而上的語(yǔ)法分析第一節(jié)引言自下而上分析:從輸入串G(S):

SSASSbAccAAa看輸入串bccab的歸約過(guò)程一.分析樹(shù)bScSccSaccSAccSASbASSASS符號(hào)棧

G(S):一.分析樹(shù)bSccaAAbSS符號(hào)棧SSSAbccAbaSbAcAacAaSb輸入串bccab分析樹(shù)的形成

SSSAbccAbaSbAcAacAaSb輸入串bccab分分析樹(shù)的剪枝過(guò)程SSSAbccAbaSSSAccAbaSSSAccAbSSSAccAbSSSAbSSSA

分析樹(shù)的剪枝過(guò)程SSSAbccAbaSSSAccAbaSSS

關(guān)鍵問(wèn)題:如何判斷棧頂符號(hào)串是否形

成可歸約串、如何歸約?當(dāng)對(duì)不同的歸約串進(jìn)行歸約,即形成了

不同的自下而上語(yǔ)法分析方法。

關(guān)鍵問(wèn)題:如何判斷棧頂符號(hào)串是否形

設(shè)有文法G,S是開(kāi)始符號(hào),設(shè)是G的一個(gè)句型,若有

S且A

則稱(chēng)是句型關(guān)于A的短語(yǔ);++在上面定義中,如果A直接推出,即A,則稱(chēng)是句型關(guān)于A的直接短語(yǔ);一個(gè)句型的最左直接短語(yǔ)稱(chēng)為句柄;二.回顧幾個(gè)核心概念短語(yǔ)直接短語(yǔ)句柄設(shè)有文法G,S是開(kāi)始符號(hào),設(shè)是G的一個(gè)句型,若有+EET+TTFFi*

G(E)E→E+T|TT→T*F|FF→(E)|i求T*F+i的短語(yǔ)、直接短語(yǔ)、句柄利用推導(dǎo)樹(shù)判斷句型的短語(yǔ)

EET+TTFFi*G(E)E→E

素短語(yǔ):文法G某句型的一個(gè)短語(yǔ)是素短語(yǔ),當(dāng)且僅當(dāng)它至少含有一個(gè)終結(jié)符,且除它自身之外不再含更小的素短語(yǔ);最左素短語(yǔ):在具有多個(gè)素短語(yǔ)的句型中處于最左邊的那個(gè)素短語(yǔ);E1E2+T2T1T3*F2F1i1F3i2素短語(yǔ):文法G某句型的一個(gè)短語(yǔ)是素短語(yǔ),當(dāng)且僅當(dāng)它至SSSAbccAbaSSSAccAbaSSSAccAbSSSAccAbSSSAbSSSA

SSSAbccAbaSSSAccAbaSSSAccAbSSS假定是文法G的一個(gè)句子,序列n,n-1,…,0滿(mǎn)足下述條件時(shí)稱(chēng)為規(guī)范歸約。(1)n=α;(2)0為文法的開(kāi)始符,即0=S;(3)對(duì)i,0<in,i-1是從i經(jīng)把句柄替換為相應(yīng)產(chǎn)生式的左部符號(hào)而得到的。三.規(guī)范歸約(最左歸約)

假定是文法G的一個(gè)句子,序列n,n-1,…,0EET+FTii*FTiFi+i*iF+i*iT+i*iE+i*iE+F*iE+T*iE+T*FE+TE例:G(E)E→E+T│TT→T*F│FF→(E)│ii+i*i的分析過(guò)程

EET+FTii*FTiFi+i*iF+i*iT+i*iE+例:G(S)S→aAcBeA→Ab|bB→dabbcde的分析過(guò)程SaAcBe

AbdbabbcdeaAbcdeaAcdeaAcBeS

例:G(S)S→aAcBeSaA內(nèi)容回顧

語(yǔ)法分析自上而下自上而下1.規(guī)范規(guī)約內(nèi)容回顧語(yǔ)法分析自上而下自上而下1.規(guī)范規(guī)約1.算符文法上下文無(wú)關(guān)文法G,沒(méi)有形如P→ε或P→...QR...的產(chǎn)生式,則稱(chēng)G為算符文法。第二節(jié)算符優(yōu)先分析法一.算符優(yōu)先文法

1.算符文法第二節(jié)算符優(yōu)先分析法一.算符優(yōu)先文法對(duì)算符文法G,a,bVT

定義2.終結(jié)符之間的優(yōu)先關(guān)系

(1)a=b:G中有P→...ab...或P→...aQb...++(2)a<b:G中有P→...aQ...且Qb…或QRb...++(3)a>b:G中有P→...Qb...且Q...a或Q…aR對(duì)算符文法G,a,bVT定義2.終結(jié)符之間的優(yōu)先若算符文法G的任何終結(jié)符a,b之間的優(yōu)先關(guān)系至多有=、>、<中的一個(gè),則G為一算符優(yōu)先文法。

據(jù)定義,構(gòu)造下述文法G的優(yōu)先關(guān)系表G(E):E→E+T|TT→T*F|FF→(E)|i3.算符優(yōu)先文法

若算符文法G的任何終結(jié)符a,b之間的優(yōu)先關(guān)系至3.算符優(yōu)先++**ii(())##>>><><<<<>>><<<<<<<<>>>>>>>>==算符優(yōu)先關(guān)系表

++**ii(())##>>><><<<<>>><<<<<<從上表可知:(1)相同終結(jié)符之間的優(yōu)先關(guān)系未必是=(2)有a<b,未必有b>a(3)a、b之間未必一定有優(yōu)先關(guān)系故=、<、>不同于關(guān)系運(yùn)算符“等于”、“小于”、“大于”

從上表可知:初始化:#棧讀一符號(hào)ba=b=#a<b或a=ba>b歸約最左素短語(yǔ),最左素短語(yǔ)出棧,左部符號(hào)入棧結(jié)束b入棧出錯(cuò)YNYYNN二.算符優(yōu)先分析算法a為棧頂終結(jié)符初始化:#棧讀一符號(hào)ba=b=#a<b或a=ba>b歸這是一種結(jié)構(gòu)歸約,處于棧頂待歸約的最左素短語(yǔ)與對(duì)應(yīng)的產(chǎn)生式在結(jié)構(gòu)上應(yīng)一致,即長(zhǎng)度一致,對(duì)應(yīng)的終結(jié)符一致,而非終結(jié)符可以不一致。歸約最左素短語(yǔ)的方法

E→E+TE+E這是一種結(jié)構(gòu)歸約,處于棧頂待歸約的最左素短語(yǔ)與對(duì)應(yīng)的產(chǎn)

算法優(yōu)先分析法的實(shí)現(xiàn):使用一個(gè)分析棧,當(dāng)其棧頂形成最左素短語(yǔ)時(shí),就進(jìn)行歸約。分析算法k:=1;S[k]=‘#’;repeatb:=下一輸入符號(hào);ifS[k]VTthenj:=kelsej:=k-1;whileS[j]>bdobeginrepeatQ:=S[j];ifS[j-1]VTth

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論