版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、上海電力學(xué)院編譯原理課程實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)名稱:實(shí)驗(yàn)三自下而上語法分析及語義分析院系:計(jì)算機(jī)科學(xué)和技術(shù)學(xué)院專業(yè)年級(jí):學(xué)生姓名:學(xué)號(hào):指導(dǎo)老師:實(shí)驗(yàn)日期:實(shí)驗(yàn)三自上而下的語法分析一、實(shí)驗(yàn)?zāi)康模和ㄟ^本實(shí)驗(yàn)掌握LR分析器的構(gòu)造過程,并根據(jù)語法制導(dǎo)翻譯,掌握屬性文法的自下而上計(jì)算的過程。二、實(shí)驗(yàn)學(xué)時(shí):4學(xué)時(shí)。三、實(shí)驗(yàn)內(nèi)容根據(jù)給出的簡(jiǎn)單表達(dá)式的語法構(gòu)成規(guī)則(見五),編制LR分析程序,要求能對(duì)用給定的語法規(guī)則書寫的源程序進(jìn)行語法分析和語義分析。對(duì)于正確的表達(dá)式,給出表達(dá)式的值。對(duì)于錯(cuò)誤的表達(dá)式,給出出錯(cuò)位置。四、實(shí)驗(yàn)方法采用 LR分析法。首先給出 S- 屬性文法的定義(為簡(jiǎn)便起見,每個(gè)文法符號(hào)只設(shè)置一個(gè)綜合屬性
2、,即該文法符號(hào)所代表的表達(dá)式的值。屬性文法的定義可參照書137頁表 6.1 ),并將其改造成用LR分析實(shí)現(xiàn)時(shí)的語義分析動(dòng)作(可參照書145頁表 6.5 )。接下來給出 LR分析表。然后程序的具體實(shí)現(xiàn):LR分析表可用二維數(shù)組(或其他)實(shí)現(xiàn)。添加一個(gè) val 棧作為語義分析實(shí)現(xiàn)的工具。編寫總控程序,實(shí)現(xiàn)語法分析和語義分析的過程。注:對(duì)于整數(shù)的識(shí)別可以借助實(shí)驗(yàn)1。五、文法定義簡(jiǎn)單的表達(dá)式文法如下:(1)E->E+T(2)E->E-T(3)E->T(4)T->T*F(5)T->T/F(6)T->F(7)F->(E)(8)F->i狀態(tài)ACTION (動(dòng)作)
3、GOTO (轉(zhuǎn)換)i+-*/()#ETF0S5S41231S6S12acc2R3R3S7S13R3R33R6R6R6R6R6R64S5S48235R8R8R8R8R8R86S5S4937S5S4108S6R12S119R1R1S7S13R1R110R4R4R4R4R4R411R7R7R7R7R7R712S5S414313S5S41514R2R2S7S13R2R215R5R5R5R5R5R5五、處理程序例和處理結(jié)果例示例 1:20133191*(20133191+3191)+ 3191#六、源代碼【 cifa.h】/cifa.h#include<string>using namesp
4、ace std;/單詞結(jié)構(gòu)定義struct WordTypeint code;string pro;/函數(shù)聲明WordType get_w();void getch();void getBC();bool isLetter();bool isDigit();void retract();int Reserve(string str);string concat(string str);【 Table.action.h】/table_action.hclass Table_actionint row_num,line_num;int lineName8;string tableData168;p
5、ublic:Table_action()row_num=16;line_num=8;lineName0=30;lineName1=7;lineName2=13;lineName3=8;lineName4=14;lineName5=1;lineName6=2;lineName7=15;lineName8=0;for(int m=0;m<row_num;m+)for(int n=0;n<line_num;n+)tableDatamn=""tableData00="S5"tableData05="S4"tableData11=&
6、quot;S6"tableData12="S12"tableData17="acc"tableData21="R3"tableData22="R3"tableData23="S7"tableData24="S13"tableData26="R3"tableData27="R3"tableData31="R6"tableData32="R6"tableData33="R6&quo
7、t;tableData34="R6"tableData36="R6"tableData37="R6"tableData40="S5"tableData45="S4"tableData51="R8"tableData52="R8"tableData53="R8"tableData54="R8"tableData56="R8"tableData57="R8"tableData60=
8、"S5"tableData65="S4"tableData70="S5"tableData75="S4"tableData81="S6"tableData82="S12"tableData86="S11"tableData91="R1"tableData92="R1"tableData93="S7"tableData94="S13"tableData96="R1&qu
9、ot;tableData97="R1"tableData101="R4"tableData102="R4"tableData103="R4"tableData104="R4"tableData106="R4"tableData107="R4"tableData111="R7"tableData112="R7"tableData113="R7"tableData114="R7"t
10、ableData116="R7"tableData117="R7"tableData120="S5"tableData125="S4"tableData130="S5"tableData135="S4"tableData141="R2"tableData142="R2"tableData143="S7"tableData144="S13"tableData146="R2"tab
11、leData147="R2"tableData151="R5"tableData152="R5"tableData153="R5"tableData154="R5"tableData155="R5"tableData156="R5"tableData157="R5"string getCell(int rowN,int lineN)int row=rowN;int line=getLineNumber(lineN);if(row>
12、=0&&row<row_num&&line>=0&&line<=line_num)return tableDatarowline;elsereturn""int getLineNumber(int lineN)for(int i=0;i<line_num;i+)if(lineNamei=lineN)return i;return -1;【 Table_go.h】/table_go.hclass Table_goint row_num,line_num;/ 行數(shù)、列數(shù)string lineName3;in
13、t tableData163;public:Table_go()row_num=16;line_num=3;lineName0="E"lineName1="T"lineName2="F"for(int m=0;m<row_num;m+)for(int n=0;n<line_num;n+)tableDatamn=0;tableData00=1;tableData01=2;tableData02=3;tableData40=8;tableData41=2;tableData42=3;tableData61=9;tableDat
14、a62=3;tableData72=10;tableData121=14;tableData122=3;tableData132=15;int getCell(int rowN,string lineNa)int row=rowN;int line=getLineNumber(lineNa);if(row>=0&&row<row_num&&line<=line_num)return tableDatarowline;elsereturn -1;int getLineNumber(string lineNa)for(int i=0;i<li
15、ne_num;i+)if(lineNamei=lineNa)return i;return -1;【 Stack_num.h】class Stack_numint i;/ 棧頂標(biāo)記int *data;/ 棧結(jié)構(gòu)public:Stack_num()/ 構(gòu)造函數(shù)data=new int100;i=-1;int push(int m)/進(jìn)棧操作i+;datai=m;return i;int pop()/ 出棧操作i-;return datai+1;int getTop()/返回棧頂return datai;Stack_num()/析構(gòu)函數(shù)delete data;int topNumber()retu
16、rn i;void outStack()for(int m=0;m<=i;m+)cout<<datam;【 Stack_str.h】class Stack_strint i;string *data;/ 棧頂標(biāo)記/棧結(jié)構(gòu)public:Stack_str()/ 構(gòu)造函數(shù)data=new string50;i=-1;int push(string m)/進(jìn)棧操作i+;datai=m;return i;int pop()/ 出棧操作datai=""i-;return i;string getTop()/返回棧頂return datai;Stack_str()/析
17、構(gòu)函數(shù)delete data;int topNumber()return i;void outStack()for(int m=0;m<=i;m+)cout<<datam;【 cifa.cpp】/cifa.cpp#include<iostream>#include<string>#include"cifa.h"using namespace std;/關(guān)鍵字表和對(duì)應(yīng)的編碼string codestring10="main","int","if","then&quo
18、t;,"else","return","void","cout","endl" int codebook10=26,21,22,23,24,25,27,28,29;/全局變量char ch;int flag=0;/*/ 主函數(shù)int main()WordType word;cout<<"請(qǐng)輸入源程序序列 :"word=get_w();while(!="#")/# 為自己設(shè)置的結(jié)束標(biāo)志cout<<"(&quo
19、t;<<word.code<<" ,"<<" “"<<<<" ”"<<")"<<endl; word=get_w();return 0;*/WordType get_w()string str=""int code;WordType wordtmp;getch();/讀一個(gè)字符getBC();/去掉空白符if(isLetter()/ 以字母開頭while(isLetter()|isDigit()s
20、tr=concat(str);getch();retract();code=Reserve(str);if(code=-1)wordtmp.code=0;=str;/ 不是關(guān)鍵字elsewordtmp.code=code;=str;/是關(guān)鍵字else if(isDigit()/以數(shù)字開頭while(isDigit()str=concat(str);getch();retract();wordtmp.code=30;=str;else if(ch='(') wordtmp.code=1;=&q
21、uot;(" else if(ch=')') wordtmp.code=2;=")" else if(ch='') wordtmp.code=3;="" else if(ch='') wordtmp.code=4;="" else if(ch='') wordtmp.code=5;="" else if(ch='=') wordtmp.co
22、de=6;="=" else if(ch='+') wordtmp.code=7;="+" else if(ch='*') wordtmp.code=8;="*" else if(ch='>') wordtmp.code=9;=">" else if(ch='<') wordtmp.code=10;="<&qu
23、ot; else if(ch=',') wordtmp.code=11;="," else if(ch=''') wordtmp.code=12;="'" else if(ch='-') wordtmp.code=13;="-" else if(ch='/') wordtmp.code=14;="/" else if(ch='#')
24、wordtmp.code=15;="#" else if(ch='|') wordtmp.code=16;="|"elsereturn wordtmp;wordtmp.code=100;=ch;void getch()if(flag=0)/沒有回退的字符ch=getchar();else/有回退字符,用回退字符,并設(shè)置標(biāo)志flag=0;void getBC()while(ch=' '|ch='t'|ch='n')ch=getc
25、har();bool isLetter()if(ch>='a'&&ch<='z'|ch>='A'&&ch<='Z')return true;elsereturn false;bool isDigit()if(ch>='0'&&ch<='9')return true;elsereturn false;string concat(string str)return str+ch;void retract()flag=1;
26、int Reserve(string str)int i;for(i=0;i<=8;i+)if(codestringi=str) /是某個(gè)關(guān)鍵字,返回對(duì)應(yīng)的編碼 return codebooki;if(i=9)/不是關(guān)鍵字return -1;【 LR.cpp】#include<iostream>#include<string>#include<cstdlib>#include"cifa.h"#include"stack_num.h"#include"stack_str.h"#include&q
27、uot;table_action.h"#include"table_go.h"using namespace std;void process()int stepNum=1;int topStat;Stack_num statusSTK; Stack_str symbolSTK;/狀態(tài)棧/符號(hào)棧Stack_num valueSTK;/值棧WordType word;Table_action actionTAB; Table_go goTAB;/行為表/ 轉(zhuǎn)向表cout<<"請(qǐng)輸入源程序,以 #結(jié)束: "word=get_w();/總
28、控程序初始化操作symbolSTK.push("#");statusSTK.push(0);valueSTK.push(0);cout<<"步驟 t 狀態(tài)棧 t 符號(hào)棧 t 值棧 t 當(dāng)前詞 t 動(dòng)作 t 轉(zhuǎn)向 "<<endl; /分析while(1)topStat=statusSTK.getTop();/ 當(dāng)前狀態(tài)棧頂string act=actionTAB.getCell(topStat,word.code);/根據(jù)狀態(tài)棧頂和當(dāng)前單詞查到的動(dòng)作/輸出cout<<stepNum+<<"t&quo
29、t;statusSTK.outStack();cout<<"t"symbolSTK.outStack();cout<<"t"valueSTK.outStack();cout<<"t"cout<<<<"t"/行為為“ acc”,且當(dāng)前處理的單詞為#,且狀態(tài)棧里就兩個(gè)狀態(tài)/說明正常分析結(jié)束if(act="acc"&&="#"&&statusSTK.topNu
30、mber()=1)cout<<act<<endl;cout<<"分析成功! "<<endl;cout<<"結(jié)果為: "<<valueSTK.getTop()<<endl;return;/讀到 act 表里標(biāo)記為錯(cuò)誤的單元格else if(act="")cout<<endl<<"不是文法的句子! "<<endl;cout<<"錯(cuò)誤的位置為單詞 "<<wor
31、<<" 附近。 " return;/移進(jìn)動(dòng)作else if(act0='S')int newstat=atoi(act.substr(1).c_str();statusSTK.push(newstat);symbolSTK.push();if(word.code=30)/ 整數(shù),壓入其值valueSTK.push(atoi(.c_str();else/其他單詞,壓入0 占位valueSTK.push(0);/輸出word=get_w();cout<<act<<endl;/規(guī)約動(dòng)作e
32、lse if(act0='R')cout<<act<<'t'string sn=act.substr(1);/產(chǎn)生式編號(hào)/根據(jù)規(guī)約使用的產(chǎn)生式更新各個(gè)棧if(sn="1")/E->E+TstatusSTK.pop();statusSTK.pop();statusSTK.pop(); symbolSTK.pop();symbolSTK.pop();symbolSTK.pop(); symbolSTK.push("E");int right_digit=valueSTK.pop();valueST
33、K.pop();int left_digit=valueSTK.pop();int new_value=left_digit+right_digit;valueSTK.push(new_value);else if(sn="2")/E->E-TstatusSTK.pop();statusSTK.pop();statusSTK.pop(); symbolSTK.pop();symbolSTK.pop();symbolSTK.pop(); symbolSTK.push("E");int right_digit=valueSTK.pop();valueS
34、TK.pop();int left_digit=valueSTK.pop();int new_value=left_digit-right_digit;valueSTK.push(new_value);else if(sn="4")/T->T*FstatusSTK.pop();statusSTK.pop();statusSTK.pop(); symbolSTK.pop();symbolSTK.pop();symbolSTK.pop(); symbolSTK.push("T");int right_digit=valueSTK.pop();valueSTK.pop();int left_digit=valueSTK.pop();int new_value=left_digit*right_digit;valueSTK.push(new_value);else if(sn="5")/T->T/FstatusSTK.pop();statusSTK.pop();statusSTK.pop(); symbolSTK.pop();symbolSTK.
溫馨提示
- 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í)數(shù)學(xué)(簡(jiǎn)便運(yùn)算)計(jì)算題專項(xiàng)練習(xí)與答案
- 2024年商品買賣協(xié)議模板2
- 2024年工程監(jiān)理外部合作協(xié)議
- 2024年專業(yè)有機(jī)肥購(gòu)銷協(xié)議詳細(xì)樣本
- 2024年真石漆外墻施工協(xié)議
- 2024公司工程承包協(xié)議樣本
- 2024年裝修美縫施工協(xié)議模板
- 2024年房產(chǎn)出租協(xié)議樣本
- 北京地區(qū)二手房買賣協(xié)議規(guī)范樣本
- 湖南郴州市中考生物真題試題(含解析)
- 北京市道德與法治初一上學(xué)期期中試卷及答案指導(dǎo)(2024年)
- 高校實(shí)驗(yàn)室安全基礎(chǔ)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 四川省綿陽市高中2025屆高三一診考試物理試卷含解析
- 渣土車輛駕駛員管理制度
- 德力西系列變頻器說明書
- 后疫情時(shí)代探索家校共育新模式維護(hù)學(xué)生心理健康
- 小學(xué)美術(shù)11-身邊的伙伴ppt課件
- 鐵合金生產(chǎn)工藝
- 焦化廠生產(chǎn)工序及工藝流程圖
- 汽車排放控制系統(tǒng)的檢修
- 《新能源》題庫(kù)(試題及答案29個(gè))
評(píng)論
0/150
提交評(píng)論