




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)報(bào)告班級(jí):2011211314姓名:oneseven學(xué)號(hào):一題目:語義分析程序的設(shè)計(jì)與實(shí)現(xiàn)。二實(shí)驗(yàn)內(nèi)容:編寫語義分析程序,實(shí)現(xiàn)對(duì)算術(shù)表達(dá)式的類型檢查和求值。要求所分析算術(shù)表達(dá)式由如下的文法產(chǎn)生。E->E+T|E-T|T T->T*F|T/F|F F->num.num|(E)|num 三實(shí)驗(yàn)要求:用自底向上的語法制導(dǎo)翻譯技術(shù)實(shí)現(xiàn)對(duì)表達(dá)式的分析和翻譯。(1)寫出滿足要求的語法制導(dǎo)定義或翻譯方案。(2)編寫分析程序,實(shí)現(xiàn)對(duì)表達(dá)式的類型進(jìn)行檢查和求值,并輸出:1.分析過程中所有產(chǎn)生式。2.識(shí)別出的表達(dá)式的類型。3.識(shí)別出的表達(dá)式的值。(3)實(shí)驗(yàn)方法:可以選用以下兩種方法之一。1.
2、自己編寫分析程序。2.利用YACC自動(dòng)生成工具。四實(shí)驗(yàn)分析: 1.步驟:(1)根據(jù)題目所給出的文法構(gòu)造相應(yīng)的拓廣文法,并求出該文法各非終結(jié)符的FIRST、FOLLOW集合;(2)構(gòu)造拓廣文法的項(xiàng)目集規(guī)范族,并構(gòu)造出識(shí)別所有前綴的DFA;(3)構(gòu)造文法的LR分析表;(4)由此構(gòu)造LR分析程序。(5)寫出滿足要求的翻譯方案。(6)實(shí)現(xiàn)對(duì)表達(dá)式的類型進(jìn)行檢查和求值,并輸出。2.實(shí)現(xiàn)方法:1.輸入緩沖區(qū)為一個(gè)字符型數(shù)組,讀入輸入的算術(shù)表達(dá)式并保存在此,以$結(jié)束;2.定義兩個(gè)二維整形數(shù)組,goto和action,其值大于零代表移進(jìn)操作,小于零代表規(guī)約操作,引進(jìn)的狀態(tài)或規(guī)約用到的產(chǎn)生式又絕對(duì)值表示。等于零
3、代表出現(xiàn)錯(cuò)誤。等于特殊值-10代表acc.狀態(tài)。3.處理輸入表達(dá)式中代表id和num的子串,分別將它們轉(zhuǎn)化為'i'和'n'進(jìn)行分析;4.根據(jù)分析表,相應(yīng)進(jìn)行語法分析,移近或規(guī)約,按算法4.3的步驟完成過程。5.由于要求進(jìn)行類型檢查和求值,所以可以定義兩個(gè)綜合屬性,一個(gè)記錄值一個(gè)記錄類型,存放在結(jié)構(gòu)中,一并傳入傳出。輸出的產(chǎn)生式可以作為虛擬綜合屬性,在產(chǎn)生式的最后打印出來。將類型檢查和求值歸于一次掃描,把類型和值賦給相應(yīng)的表達(dá)式。由于只具有綜合屬性,故可以用S屬性的自底向上翻譯實(shí)現(xiàn),利用LR分析程序來實(shí)現(xiàn),只需擴(kuò)充分析站和改造分析程序。本次實(shí)驗(yàn)是基于語法分析方法3
4、,因此相關(guān)的代碼和文檔類似于上次實(shí)驗(yàn)。3.翻譯方案:E->E+T E.val=E.val+T.valif(E.type=real|T.type=real) E.type=real; else E.type=integer;E->E-T E.val=E.val-T.valif(E.type=real|T.type=real) E.type=real; else E.type=integer;E -> T E.val= T.val E.type=T.typeT->T*F T.val=T.val*F.valif(T.type=real|F.type=real) T.type=
5、real; else T.type=integer;T->T/F T.val=T.val/F.valif(T.type=real|F.type=real) T.type=real; else T.type=integer;T -> F T.val=F.val T.type=F.typeF -> num.num F.val=num.num.val F.type=realF -> (E) F.val=E.val F.type=E.typeF -> num F.val=num.val F.type=integer3.計(jì)算過程:文法對(duì)應(yīng)的拓廣文法為:(0)E->E
6、(1) E -> E+T (2)E -> E-T (3) E -> T (4)T -> T*F (5)T -> T/F(6)T -> F (7)F -> num.num (8)F -> (E) (9)F -> num求的各個(gè)非終結(jié)符的FIRST、FOLLOW集合為:ETFFIRST(, num(, num (, numFOLLOW$, ), +, -$, ), +, -, *, /$, ), +, -, *, /4.SLR(1)分析表為: 狀態(tài)+-*/().Num$ETF0S5S41231S6S7acc2R3R3S8S9R3R33R6R6R
7、6R6R6R64R9R9R9R9R9S10R95S5S411236S5S41237S5S41338S5S4149S5S41510S1611S6S7S1712R1R1S9S10R1R113R2R2S9S10R2R214R4R4R4R4R4R415R5R5R5R5R5R516R7R7R7R7R7R717R8R8R8rR8R8R85.主程序說明:void Get_str(void) /獲取待分析輸入表達(dá)式int Judge_num(char ch) /判斷字符是否為構(gòu)成num的數(shù)字int Get_ternum(char ch) /返回終結(jié)符在終結(jié)符表中的下標(biāo)int Get_unternum(char
8、 ch) /返回非終結(jié)符在非終結(jié)符表中的下標(biāo)int Judge_ter(char ch) /判斷字符是否為終結(jié)符int Judge_unter(char ch) /判斷字符是否為非終結(jié)符void fanyi(int chioce) /翻譯方案void Analyse_output(void) /使用LR語法預(yù)測(cè)分析表分析輸入的表達(dá)式并輸出分析結(jié)果五代碼。#include<iostream>#include<iomanip>#include<math.h>using namespace std;char terminal9='+','-
9、','*','/','(',')','.','n','$' /終結(jié)符表 char unterminal3='E','T','F' /非終結(jié)符表 char grammar1010= /輸出產(chǎn)生式 "SE","EE+T","EE-T","ET","TT*F", "TT/F","TF","
10、;Fn.n","F(E)","Fn" ;int Goto183= /LR()語法預(yù)測(cè)分析表 1,2,3,0,0,0,0,0,0,0,0,0, 0,0,0,11,2,3,0,12,3,0,13,3, 0,0,14,0,0,15,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0 ;int Action189= 0,0,0,0,5,0,0,4,0, 6,7,0,0,0,0,0,0,-10, -3,-3,8,9,0,-3,0,0,-3, -6,-6,-6,-6,0,-6,0,0,-6, -9,-9,-9
11、,-9,0,-9,10,0,-9, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,5,0,0,4,0, 0,0,0,0,0,0,0,16,0, 6,7,0,0,0,17,0,0,0, -1,-1,8,9,0,-1,0,0,-1, -2,-2,8,9,0,-2,0,0,-2, -4,-4,-4,-4,0,-4,0,0,-4, -5,-5,-5,-5,0,-5,0,0,-5, -7,-7,-7,-7,0,-7,0,0,-7, -8,-8,-8,-8,0,-8,0,0,-8, ;
12、char str40; /待分析的輸入表達(dá)式float value40; /產(chǎn)生式的值int top=0,state40,type40; /狀態(tài),棧頂 ,產(chǎn)生式的類型 void Get_str(void) /獲取待分析輸入表達(dá)式 int len; printf("請(qǐng)輸入待分析的表達(dá)式:"); scanf("%s",&str); for(len=0;strlen!='0'len+); strlen='$' strlen+1='0' len+; statetop=0; int Judge_num(cha
13、r ch) /判斷字符是否為構(gòu)成num的數(shù)字 if(ch>='0'&&ch<='9') return 1; else return 0; int Get_ternum(char ch) /返回終結(jié)符在終結(jié)符表中的下標(biāo) int i; for(i=0;i<9;i+) if(ch=terminali) return i; return -1; int Get_unternum(char ch) /返回非終結(jié)符在非終結(jié)符表中的下標(biāo) int i; for(i=0;i<3;i+) if(ch=unterminali) return i
14、; return -1; int Judge_ter(char ch) /判斷字符是否為終結(jié)符 if(ch='+'|ch='-'|ch='*'|ch='/'|ch='('|ch=')'|ch='.'|ch='n'|ch='$') return 1; else return 0; int Judge_unter(char ch) /判斷字符是否為非終結(jié)符 if(ch='E'|ch='P'|ch='T') r
15、eturn 1; else return 0; void fanyi(int chioce) /翻譯方案 int i; float j; switch(chioce) case 1: valuetop-2=valuetop-2+valuetop; if(typetop=2|typetop-2=2) typetop-2=2; else typetop-2=1; break; case 2: valuetop-2=valuetop-2-valuetop; if(typetop=2|typetop-2=2) typetop-2=2; else typetop-2=1; break; case 3:
16、valuetop=valuetop; typetop=typetop; break; case 4: valuetop-2=valuetop-2*valuetop; if(typetop=2|typetop-2=2) typetop-2=2; else typetop-2=1; break; case 5: if(typetop=2|typetop-2=2|(int)valuetop-2%(int)valuetop!=0) typetop-2=2; else typetop-2=1; valuetop-2=valuetop-2/valuetop; break; case 6: valuetop
17、=valuetop; typetop=typetop; break; case 7: j=valuetop; for(i=0;j>=1;i+) j=j/10; valuetop-2=valuetop-2+valuetop*pow(0.1,i); typetop-2=2; break; case 8: valuetop-2=valuetop-1; typetop-2=typetop-1; break; case 9: valuetop=valuetop; typetop=1; break; default: break; void Analyse_output(void) /使用LR()語
18、法預(yù)測(cè)分析表分析輸入的表達(dá)式并輸出分析結(jié)果 int i,j,m; int S,step=0,ip=0,length=0; char a; cout<<"分析過程產(chǎn)生式:n" do S=statetop; /獲取棧頂符號(hào) a=strip; /獲取輸入串中將要進(jìn)行分析的符號(hào) if(a='+'|a='-'|a='*'|a='/'|a='('|a=')'|a='.'|a='$') length=1; else j=ip; length=0; i
19、=0; while(Judge_num(a) i=i*10+a-'0' length+; j+; a=strj; a='n' m=Get_ternum(a); if(ActionSm>0) /移進(jìn) top+; if(a='n') valuetop=i; statetop=ActionSm; ip+=length; else if(ActionSm<0&&ActionSm!=-10) /規(guī)約 i=0-ActionSm; fanyi(i); for(j=1;grammarij!='0'j+) top-; m=statetop; j=Get_unternum(grammari0); top+; statetop=Gotomj; step+; cout<<"("<<step<<") "<<grammari0<<"" for(j=1;grammarij!='0
溫馨提示
- 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. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 梳理計(jì)算機(jī)基礎(chǔ)知識(shí)的試題及答案
- 2025年計(jì)算機(jī)基礎(chǔ)知識(shí)重點(diǎn)復(fù)習(xí)試題及答案
- 計(jì)算機(jī)一級(jí)wps考試應(yīng)對(duì)策略試題及答案
- 2025年MySQL性能測(cè)試工具試題及答案
- Msoffice成績(jī)合格的試題與答案集
- 計(jì)算機(jī)二級(jí)Msoffice課程脈絡(luò)探索試題及答案
- 計(jì)算機(jī)二級(jí)Python考試常見錯(cuò)誤及試題及答案
- 財(cái)務(wù)管理中的邏輯評(píng)估方法試題及答案
- 二級(jí)Msoffice成就夢(mèng)想的試題與答案優(yōu)化
- 財(cái)務(wù)成本管理關(guān)注主題試題及答案
- MOOC 地學(xué)景觀探秘·審美·文化-重慶大學(xué) 中國(guó)大學(xué)慕課答案
- 安全生產(chǎn)事故報(bào)告處理制度范本
- (高清版)WST 311-2023 醫(yī)院隔離技術(shù)標(biāo)準(zhǔn)
- 2024年電梯安裝與維修工理論考試題庫(kù)及答案(通用版)
- 天耀中華合唱簡(jiǎn)譜大劇院版
- 【《我國(guó)互聯(lián)網(wǎng)企業(yè)價(jià)值評(píng)估現(xiàn)狀與問題探析11000字》(論文)】
- 智慧農(nóng)業(yè)的無人機(jī)技術(shù)應(yīng)用
- 建筑裝飾裝修工程消耗量定額
- 北京市2023年中考備考語文專題復(fù)習(xí) 名著閱讀題(解析)
- 招聘需求分析報(bào)告
- 黃太吉融資商業(yè)計(jì)劃書
評(píng)論
0/150
提交評(píng)論