版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上LR分析器一、 目的和要求通過設(shè)計(jì)、編制、調(diào)試一個典型的語法分析程序,實(shí)現(xiàn)對詞法分析程序所提供的單詞序列進(jìn)行語法檢查和結(jié)構(gòu)分析,進(jìn)一步掌握常用的語法分析方法。1、選擇最有代表性的語法分析方法,如LL(1) 語法分析程序、算符優(yōu)先分析程序和LR分析分析程序,并至少完成兩個題目。2、選擇對各種常見程序語言都用的語法結(jié)構(gòu),如賦值語句(尤指表達(dá)式)作為分析對象,并且與所選語法分析方法要比較貼切。 實(shí)驗(yàn)前的準(zhǔn)備按實(shí)驗(yàn)的目的和要求,編寫語法分析程序,同時考慮相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。 調(diào)試調(diào)試?yán)討?yīng)包括符合語法規(guī)則的算術(shù)表達(dá)式,以及分析程序能夠判別的若干錯例。 輸出對于所輸入的算術(shù)表達(dá)式,
2、不論對錯,都應(yīng)有明確的信息告訴外界。 擴(kuò)充有余力的同學(xué),可適當(dāng)擴(kuò)大分析對象。譬如: 算術(shù)表達(dá)式中變量名可以是一般標(biāo)識符,還可含一般常數(shù)、數(shù)組元素、函數(shù)調(diào)用等等。 除算術(shù)表達(dá)式外,還可擴(kuò)充分析布爾、字符、位等不同類型的各種表達(dá)式。加強(qiáng)語法檢查,盡量多和確切地指出各種錯誤。 編寫上機(jī)實(shí)習(xí)報(bào)告。二、背景知識 自下而上分析技術(shù)LR(K)方法LR(K)方法是一種自下而上的語法分析方法,是當(dāng)前最廣義的無回溯的“移進(jìn)- 歸約”方法。它根據(jù)棧中的符號串和向前查看的k(k³0)個輸入符號,就能唯一確定分析器的動作是移進(jìn)還是歸約,以及用哪個產(chǎn)生式進(jìn)行歸約。優(yōu)點(diǎn):文法適用范圍廣;識別效率高;查錯能力強(qiáng);可
3、自動構(gòu)造。邏輯組成:總控程序LR分析表LR分析器的結(jié)構(gòu):一個LR分析器實(shí)際是一個帶先進(jìn)后出存儲器(棧)的確定下推自動機(jī),它由一個輸入串、一個下推棧和一個帶有分析表的總控程序組成。棧中存放著由“歷史”和“展望”材料抽象而來的各種“狀態(tài)”。任何時候,棧頂?shù)臓顟B(tài)都代表了整個的歷史和已推測出的展望。為了有助于明確歸約手續(xù),我們把已歸約出的文法符號串也同時放進(jìn)棧里。LR分析器的每一動作都由棧頂狀態(tài)和當(dāng)前輸入符號所唯一確定。 LR分析器模型圖分析器的任何一次移動都是根據(jù)棧頂狀態(tài)Sm和當(dāng)前輸入符號ai,去查看ACTION表并執(zhí)行ACTION( Sm,ai)規(guī)定的動作,直至分析成功或失敗。LR分析表有兩個部分
4、:動作部分ACTION和狀態(tài)轉(zhuǎn)換部分GOTO。ACTIONS,a表明當(dāng)前狀態(tài)S面臨輸入符號a時應(yīng)該采取的動作:1、移入:將S,y的下一個狀態(tài)S以及當(dāng)前符號入棧。2、歸約:對棧頂?shù)姆柎凑漳硞€規(guī)則進(jìn)行歸約。3、接受:宣布輸入符號串為一個句子。4、報(bào)錯:宣布輸入符號串不是句子。GOTOS,U表示當(dāng)前狀態(tài)S和非終結(jié)符號匹配的時候所轉(zhuǎn)換到的下一個狀態(tài)。LR總控程序:LR總控程序示意圖LR分析器的工作過程是由總控程序根據(jù)分析表,使得分析器構(gòu)型從一種構(gòu)型向另一種構(gòu)型變化的過程。初始構(gòu)型:(S0,a1a2an $), S0為分析器的初態(tài),$為輸入串的括號。分析過程的每步結(jié)果可表示為:(S0X1S1XmSm
5、,aiai+1an$)。分析器的下一次動作是由棧頂狀態(tài)Sm和當(dāng)前輸入符號ai所唯一確定的,即:執(zhí)行ACTIONSm,ai規(guī)定的動作。經(jīng)執(zhí)行各種可能的動作后,分析器的構(gòu)型可如下變化:1、若ACTION(Sm,ai)=“移進(jìn)S”,則分析器構(gòu)型變?yōu)椋⊿0X1S1XmSmaiS,ai+1an$)。 2、若ACTION(Sm,ai)=“歸約A ”,則分析器構(gòu)型變?yōu)椋⊿0X1S1Xm-rSm-rAS,aiai+1an$),其中SGOTO(Sm-r,A),|=r 。 3、若ACTION(Sm,ai)=“接受”,則分析成功,正常停止。4、若ACTION(Sm,ai)=“ERROR”,語法出錯,進(jìn)行出錯處理。L
6、R分析表的構(gòu)造:LR(0)項(xiàng)目的定義:文法的每一個產(chǎn)生式的右部添加一個圓點(diǎn)(·),則構(gòu)成文法的一個LR(0)項(xiàng)目。設(shè)I是文法G的任一項(xiàng)目集,則定義和構(gòu)造CLOSURE(I)的規(guī)則如下:1、屬于I的任何項(xiàng)目也屬于CLOSURE(I);2、若A ·B 屬于CLOSURE(I),那么,對于任何關(guān)于B的產(chǎn)生式B ,項(xiàng)目B· 也屬于CLOSURE(I);3、重復(fù)執(zhí)行以上兩步,直到CLOSURE(I)不再增大為止。構(gòu)成識別一個文法活前綴的DFA的項(xiàng)目集(狀態(tài))的全體稱為這個文法的LR(0) 項(xiàng)目集規(guī)范族。構(gòu)成過程如下:1、文法拓廣;2、構(gòu)造拓廣文法的LR(0)項(xiàng)目集規(guī)范族3、
7、由初始項(xiàng)目出發(fā),利用CLOSURE和goto函數(shù);4、將LR(0)項(xiàng)目集規(guī)范族中的每個項(xiàng)目集作為FA的狀態(tài),將goto函數(shù)作為狀態(tài)轉(zhuǎn)換函數(shù),構(gòu)造出的FA即為所求。項(xiàng)目集I的閉包CLOSURE(I):設(shè)I是文法G的任一項(xiàng)目集,則定義和構(gòu)造CLOSURE(I)的規(guī)則如下:1、屬于I的任何項(xiàng)目也屬于CLOSURE(I);2、若A .B 屬于CLOSURE(I),那么,對于任何關(guān)于B的產(chǎn)生式B ,項(xiàng)目B . 也屬于CLOSURE(I);3、重復(fù)執(zhí)行以上兩步,直到CLOSURE(I)不再增大為止。LR(0) 文法的判定:如果文法G的項(xiàng)目集規(guī)范族的每個項(xiàng)目集中不存在下述沖突項(xiàng)目:1、移進(jìn)項(xiàng)目和歸約項(xiàng)目并存
8、,2、多個歸約項(xiàng)目并存,則稱文法G為LR(0)文法。只有對于LR(0)文法,才能構(gòu)造它的LR(0)分析表。構(gòu)造LR(0)分析表的步驟如下:1、若項(xiàng)目A.a Ii且goto(Ii,a)=Ij,其中a為終結(jié)符,置ACTIONi,a=“把狀態(tài)j和符號a移進(jìn)棧”,簡記為“sj”;2、若項(xiàng)目A. Ii ,則對于任何輸入符a或結(jié)束符$,置ACTIONi,a=“用產(chǎn)生式 A進(jìn)行歸約”,簡記為“rj”(假定A是文法G的第j條產(chǎn)生式);3、若項(xiàng)目SS. Ii ,則置ACTIONi,$=“接收”,簡記為acc;4、若goto(I,A)=Ij,A 為非終結(jié)符,則置GOTO(i,A)=j5、分析表中凡不能用規(guī)則1 4
9、添入信息的元素均置上ERROR。三、實(shí)驗(yàn)內(nèi)容要求:給定分析對象的LR分析表和一個分析對象的句子,輸出該句子分析的結(jié)果。否否是是否是0,#分別入狀態(tài)棧和符號棧置ip指向w#的第一個符號令s是狀態(tài)棧棧頂,a是ip所指向的符號actions,a=Ssactions,a=reduce A->把a(bǔ)和s分別推入符號棧和狀態(tài)棧;使ip前進(jìn)到下一個字符分別從棧頂彈出|個符號,令s是當(dāng)前棧頂狀態(tài),把a(bǔ)和gotos,A先后推入棧中,輸出產(chǎn)生式A->ActionA,a=accept結(jié)束出錯處理程序輸入/輸出示例:對下列文法,用LR(1)分析法對任意輸入的符號串進(jìn)行分析:(1)E->E+T (2)E
10、->ET (3)T->T*F(4)T->T/F(5)F->(E)(6)F->i輸出的格式如下:(1)輸入一以#結(jié)束的符號串(包括+*/()i#):在此位置輸入符號串(2)輸出過程如下:步驟 狀態(tài)棧 符號棧 剩余輸入串動作10#i+i*i#移進(jìn)(3)輸入符號串為非法符號串(或者為合法符號串)備注:(1)在“所用產(chǎn)生式”一列中如果對應(yīng)有推導(dǎo)則寫出所用產(chǎn)生式;如果為匹配終結(jié)符則寫明匹配的終結(jié)符;如分析異常出錯則寫為“分析出錯”;若成功結(jié)束則寫為“分析成功”。(2) 在此位置輸入符號串為用戶自行輸入的符號串。注意:1.表達(dá)式中允許使用運(yùn)算符(+-*/)、分割符(括號)、字
11、符i,結(jié)束符#;2.如果遇到錯誤的表達(dá)式,應(yīng)輸出錯誤提示信息(該信息越詳細(xì)越好);3.對學(xué)有余力的同學(xué),測試用的表達(dá)式事先放在文本文件中,一行存放一個表達(dá)式,同時以分號分割。同時將預(yù)期的輸出結(jié)果寫在另一個文本文件中,以便和輸出進(jìn)行對照;四、設(shè)計(jì)思路模塊結(jié)構(gòu):(1)定義部分:定義常量、變量、數(shù)據(jù)結(jié)構(gòu)。(2)初始化:設(shè)立LR(1)分析表、初始化變量空間(包括堆棧、結(jié)構(gòu)體、數(shù)組、臨時變量等);(3)控制部分:從鍵盤輸入一個表達(dá)式符號串;(4)利用LR(1)分析算法進(jìn)行表達(dá)式處理:根據(jù)LR(1)分析表對表達(dá)式符號串進(jìn)行堆棧(或其他)操作,輸出分析結(jié)果,如果遇到錯誤則顯示錯誤信息。五、相關(guān)代碼
12、;#include<stdio.h> #include<string.h> char *action103="S3#","S4#",NULL, NULL,NULL,"acc", "S6#","S7#",NULL, "S3#","S4#",NULL, "r3#","r3#&qu
13、ot;,NULL, NULL,NULL,"r1#", "S6#","S7#",NULL, NULL,NULL,"r3#", "r2#","r2#",NULL, NULL,NULL,"r2#" int goto1102=1,2, 0,0,
14、 0,5, 0,8, 0,0, 0,0, 0,9, 0,0, 0,0,
15、160; 0,0; char vt3='a','b','#' /*存放非終結(jié)符*/ char vn2='S','B'
16、0; char *LR4="E->S#","S->BB#","B->aB#","B->b#"/*存放產(chǎn)生式*/ int a10; char b10,c10,c1; int top1,top2,top3
17、,top,m,n; void main() int g,h,i,j,k,l,p,y,z,count; char x,copy10,copy110; top1=0;top2=0;top3=0;top=0; a0=0;y=a0;b0='#' count=0;z=0; printf("請輸入表達(dá)式n"); do scanf("%c
18、",&c1); ctop3=c1; top3=top3+1; while(c1!='#'); printf("步驟t狀態(tài)棧tt符號棧tt輸入串ttACTIONtGOTOn"); do y=z;m=0;n=0; &
19、#160; /*y,z指向狀態(tài)棧棧頂*/ g=top;j=0;k=0; x=ctop; count+; printf("%dt",count); while(m<=top1)
20、160; /*輸出狀態(tài)棧*/ printf("%d",am); m=m+1; printf("tt"); while(n<=top2)
21、; /*輸出符號棧*/ printf("%c",bn); n=n+1; printf("tt"); &
22、#160;while(g<=top3) /*輸出輸入串*/ printf("%c",cg); g=g+1;
23、60; printf("tt"); while(x!=vtj&&j<=2) j+; if(j=2&&x!=vtj) printf("errorn"); return; if(actionyj=NULL)
24、;printf("errorn"); return; else strcpy(copy,actionyj); if(copy0='S')
25、160; /*處理移進(jìn)*/ z=copy1-'0' top1=top1+1; top2=top2+1; atop1=z; btop2=x; top=top+1;
26、60;i=0; while(copyi!='#') printf("%c",copyi); i+; printf("n"); if(copy0='r') /*處理
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件項(xiàng)目質(zhì)量管理
- 心理咨詢和輔導(dǎo)
- 2025年智能垃圾桶清潔十年技術(shù)報(bào)告
- 2026年文化娛樂產(chǎn)業(yè)虛擬現(xiàn)實(shí)報(bào)告
- 2026年及未來5年中國車廂底板市場運(yùn)行態(tài)勢及行業(yè)發(fā)展前景預(yù)測報(bào)告
- 小學(xué)道德與法治教學(xué)中生命教育的實(shí)施路徑課題報(bào)告教學(xué)研究課題報(bào)告
- 藝術(shù)研究院試題及答案
- 幼兒園預(yù)防接種培訓(xùn)課件
- 中國人民銀行清算總中心直屬企業(yè)銀清科技有限公司2026年度公開招聘備考題庫及答案詳解一套
- 2025-2030中國溫泉特色酒店行業(yè)市場發(fā)展分析及競爭格局與投資前景研究報(bào)告
- 2025年事業(yè)單位招聘考試綜合類專業(yè)知識試題(體育)
- 安全生產(chǎn)責(zé)任保險(xiǎn)培訓(xùn)課件
- 機(jī)械工程的奧秘之旅-揭秘機(jī)械工程的魅力與價(jià)值
- 《益生菌與藥食同源植物成分協(xié)同作用評價(jià)》-編制說明 征求意見稿
- 送貨單回簽管理辦法
- 魯科版高中化學(xué)必修第一冊全冊教案
- 原發(fā)性高血壓患者糖代謝異常:現(xiàn)狀、關(guān)聯(lián)與防治探索
- 2025年存算一體芯片能效比:近內(nèi)存計(jì)算架構(gòu)突破與邊緣AI設(shè)備部署成本
- 國有企業(yè)服務(wù)采購操作規(guī)范TCFLP 0054-2022
- 2025年獸醫(yī)公共衛(wèi)生學(xué)考試試題(附答案)
- 熱電材料研究進(jìn)展匯報(bào)
評論
0/150
提交評論