語義分析及中間代碼生成程序設(shè)計原理與實現(xiàn)技術(shù)--實驗_第1頁
語義分析及中間代碼生成程序設(shè)計原理與實現(xiàn)技術(shù)--實驗_第2頁
語義分析及中間代碼生成程序設(shè)計原理與實現(xiàn)技術(shù)--實驗_第3頁
語義分析及中間代碼生成程序設(shè)計原理與實現(xiàn)技術(shù)--實驗_第4頁
語義分析及中間代碼生成程序設(shè)計原理與實現(xiàn)技術(shù)--實驗_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、語義分析及中間代碼生成程序設(shè)計原理與實現(xiàn)技術(shù)xxx 1028xxx2 計科 1xxx 班1. 程序功能描述完成以下描述賦值語句和算術(shù)表達式文法的語法制導(dǎo)生成中間代碼四元式的過程。ga:a->v:=ee-e+t | e-t |t-*t*f | t/f | ff- (e) | iv->i說明:終結(jié)符號i為用戶定義的簡單變量,即標識符的定義。2. 設(shè)計要求(1)給出每一產(chǎn)生式對應(yīng)的語義動作;(2)設(shè)計中間代碼四元式的結(jié)構(gòu)(暫不與符號 表有關(guān))。(3)輸入串應(yīng)是詞法分析的輸出二元式序列,即某算術(shù)表達式“實驗項目一” 的輸出結(jié)果。輸出為輸入串的四元式序列中間文件。(4)設(shè)計兩個測試用例(盡可

2、能完備), 并給出程序執(zhí)行結(jié)果四元式序列。3. 主要數(shù)據(jù)結(jié)構(gòu)描述:本程序采用的是算符優(yōu)先文法,文法以及算符優(yōu)先矩陣是根據(jù)笫四次實驗來修改 的,所以主要的數(shù)據(jù)結(jié)構(gòu)也跟第四次差不多,主要為文法的表示,firstvt集和lastvt 集以及算符優(yōu)先矩陣:struct infochar left;vector<string> right;vector<char> first;vector<char> last;算符優(yōu)先矩陣采用二維字符數(shù)組表示的:char mtr9 9; /算符優(yōu)先矩陣4. 程序結(jié)構(gòu)描述:本程序一共有8功能函數(shù):void get () ;/獲取文法v

3、oid print 0 ;/打印文法void fun() ;/求 firstvt 和 lastvtvoid matrix (); /求算符優(yōu)先矩陣void test ();/測試文法int cmp (char a, char b);比較兩個運算符的優(yōu)先級1 0 tvoid out (char now, int avgl, int avg2) ; /打e卩四元式int ope (char op, int a, int b) ;/定義四元式計算方法5. 實驗代碼詳見附件6. 程序測試6. 1功能測試程序運行顯示如下功能菜單:d:?visual studio 2012programlb6debugl

4、b6.exex x xxx k x xx xx x kx xx x xx xx mx xxxwx xx xxx xx xx法法rs先試按心 文文fi優(yōu)測請mm 取矍造法束卄 文結(jié)“按 請 si tut按 as請l陣 禾巨系按 請請tu關(guān)請123450選擇打卬文法:d:§jrvisual studio 2012programlb6debuglb6.exe11rstuif las 陣請tu按t集請按123450x )c )c 其 x xh k k k耳n h耳耳x e > e >e > e > t ->t > t >f > f >.n

5、ne* e- t1 t* t/ f <e1ttff>hh其x其興x 選擇構(gòu)造firstvt集和lastvt集:d:jvisual studio 2012programlb6debuglb6.exelasttut:e:+-i*/>x12 3 4 5 0詩主冃w?系按 請請tu關(guān)請 - 法法rs先試按 文文fi優(yōu)測請 取黑造法束*firstut:e:*-i*/<t:*/<if:<i選擇構(gòu)造算符優(yōu)先矩陣:d:§jrvisual studio 2012programlb6debuglb6.exe12 3 4按主月t 二 tu按 乂 as請 工 l陣 “ 禾

6、巨 二 wr" 請請tu關(guān)請沙 法法rs先試按沙 文文f1優(yōu)測請沖 取黑造法束“】(6. 2文法測試測試 1:1+2*3xd:?visual studio 2012programlb6debuglb6.exe2*32 3 4 5 0tu按 as請l陣 龍系按 諳tu關(guān)請 法rs先試按 文fi優(yōu)測請 矍造法束.2 .3 ,66 ,7x x x m x xx mm x x x m m m x x m x m x x m x m x x mm x mx x mx mx mm,7 .0 ,7測試 2:2+3+4柘 + (6/2)d:?§jvisual studio 2012prog

7、ramlb6debuglb6.exetu按as請l陣 請請tu關(guān)請 法法l's先試按 文文fi優(yōu)測請 取矍造法束 s8512 3 4 5 0請輸入算術(shù)表達式:2*3+4 拓 x6/2miooofxmmxxxxxxmxiooocxxmlooofxxmxxxxxxmxxx.2 .3 ,5xxx xxx xxx.4 .5 ,20-25 ,3 ,28* w x)x)()(x)o<>o)()()(x)(x)cm )()(x m1_6 ,2 j.3減 xtf.x.f.x.wx.x.x.x.x.x.x.x.w.x.x.x.x.x.x.x.k.x.x.f.x.'t.x.x.x.x.

8、x.x.,28 ,0 ,28請請tu關(guān) 法法rs先 文文fi 取矍造和lastut集請按12347. 學(xué)習(xí)總結(jié)本次實驗完成了語義及中間代碼生成的設(shè)計原理與實現(xiàn),所采用的方法為算符優(yōu)先 分析方法,首先根據(jù)文法求出此文法的firstvt集和lastvt集,然后根據(jù)他們求出此 文法的算符優(yōu)先矩陣。由于此文法和第四次文法基本相同,只是多了一條賦值語句,所 以采用的規(guī)則和第四次基本相同。在分析階段,每當遇到有規(guī)約的項目,判斷一下,打' 印出此部運算的四元式,這樣一步一步分析,知道輸入的算術(shù)表達式計算分析完畢。由于本次實驗部分代碼和笫四次實驗的代碼比較相似,只礙增加一點四元式的分析計算打印過程,就

9、能夠順利完成本次實驗。通過這次實驗,我對語義分析以及中間代碼部分有了一定的提鬲,對以后的學(xué)習(xí)有了一定程度上的幫助。/ lb6.cpp :定義控制臺應(yīng)用程序的入口點。/include "stdafx. h#include <ios #include <string>#include <vector>include <stack> using namespace std;struct infochar left;vector<string> right;vector<char> first;vector<char&g

10、t; last;vector<info> lang;char mtr9 9; /算符優(yōu)先矩陣stack<char> sta;void get () ;/獲取文法void print () ;/打印文法void fun () ;/求 firstvt 和 lastvtvoid matrix () ; /求算符優(yōu)先矩陣void test () ;/測試文法int cmp(char a, char b);/比較兩個運算符的優(yōu)先級10 -1void out (char now, int avgl, int avg2) ;/打e卩四元式int ope (char op, int a

11、, int b) ;/定義四元式計算方法int main() int choose;不苓不芳不不不不不不不不不芳不芳不芳不芳不芳不芳不芳不卒不卒不芳不卒不平不平不平while (1)cout « "獲取文法請按1<< endl;cout <<打印文法請按2<< endl;cout << "構(gòu)造firstvt集和lastvt集請按3<< endl;cout << "構(gòu)造優(yōu)先關(guān)系矩陣請按4<< endl;cout << "文法測試請按5<<

12、endl;cout « "結(jié)束請按0<< endl;cout <<丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"丄"<< endl;cout<< endl;cout « endl;cin >> choose;i f (choose = 0)break;switch(choose)case1:g

13、et ();break;case2:print ();break;case3:fun ();break;case4:matrix ();break;case5:test ();break;default:break;return 0;void get () info temp, tempi, tomp2;temp, left = ' e'temp, right. push_back("e+t"); temp, right, push back("e-t");temp, right, push back(t); temp right. pu

14、sh_back("i); tempi, left 二t ;tempi, right, push back("t*f"); tempi, right, push back (/zt/f,z); temp1 right push_back(f);temp2. left 二'f ;temp2. right, push back("(e)");temp2 right push back co ;lang, push back (temp);lang. push_back(tempi);lang. push_back(temp2);彳、/ 

15、9; 、<< endl;cout « 文法獲取完成<< endl;cout不苓不芳不不不不不不不不不芳不芳不芳不芳不芳不芳不芳不卒不卒不芳不卒不平不平不平<< endl;cout « endl;voidprinto cout/ / /c v /*! 1、f-* 1 1(1for (int i = 0; i < lang. sizeo ; i +) for (int j = 0; j < langi. right, size() ; j +) cout << langi. left << " -

16、> “;cout « langi. rightj « endl;!1cout << ”* << endl ;cout << endl;void fun() int i, j, sign = 0, signl = 0;for (i = 0; i < lsng. size () ; i +) for(j 二 0; j < langi. right. size() ; j +) string temp = langi. rightj:/獲取右部if (temp 0 > ' z' | | temp0 <

17、; ' a') /終結(jié)符 langi. first.push back(temptoj);else if (temp, length () >= 2) /終結(jié)符 if (temp 1 > ' z' | | templ < 'a') langi. first. push_back(temp1);; for (i = 0; i < lang, size () ; i +) for (j = 0; j < langi. right. sizeo ; j +) string temp = langi. rightj;/獲取右

18、部if (temp0 > ' z' | | temp0 <,a') && temp, length () = 1) /終結(jié)符langi. last. push back(tempo);else if (temp, length () >= 3) /終結(jié)符if (temp 1 > ' z' | | templ ' a')langi. last. push_back(temp 1 );else if (temp 2 > ' z' | | temp2 <,a') /終結(jié)

19、符iangi. last, push back(temp2);!1while (sign = 0) /迭代 firstvtsign = 1;for (i = 0; i < lang. size() ; i +) for (j = 0; j < langi. right. size() ; j +) string temp = langi. righttj:/獲取右部if (temp. 1 ength () = 1 && (temp0 <= ' z' && temp0 >='a')/可以迭代for(int k

20、 = 0;k < lang. size() ;k +) if (langk. left = temp0) /找到了,添加元素 for(int p = 0;p < langk. first. sizeo ;p +) signl = 0;char ch = langk. firstp;for(int q = 0;q < langi. first, size() ;q +)if (langeil. first q = ch) 包含signl = 1;if(signl = 0)langi. first, push back(ch);sign = 0;!1;!1sign = 0;whi

21、 1 e (sign = 0) /迭代 lastvtsign 二 1;for (i = 0;i < lang. sizeo ; i +) for (j = 0; j < langi. right. sizeo ; j +) string temp = langi rightj;/獲取右部i f (temp, length () = 1 && (temp0 <= ' z' && temp0 >= 'a')/可以迭代for(int k = 0;k < lang. sizeo ;k +) if (langk

22、. left = temp0) /找到了,添加元素 for (int p = 0;p < iangk. last, size () ;p +) signl 二 0;char ch = langk. lastp;for (int q = 0;q < langi 1 ast. sizeo ;q +)if (langi. last q = ch) /包含了signl 二 1;if(signl = 0)iangi. last. push back(ch); sign = 0;cout «"* end 1;cout <<"firstvt:"

23、 << endl;for (i =0;i < lang> sizeo ; i +) cout << langi. left «for(j = 0; j < langi. first. size() ; j +) cout « langi. firstj « "“;cout << endl;cout « endl;cout « "lasttvt:" « endl;for (i = 0;i lang. size() ; i +) cout <<

24、 langi. left << : “;for(j = 0; j < langi. last. sizeo ; j 卄)cout « langi. lastj << "”;cout << endl;cout * << endl ;cout « endl;void matrix () int i, j;for (i = 0; i < 9; i +) /初始化for(j = 0;j < 9;j +) mtrij = 'n'string temp = +-*/() i#"for(

25、i = l;i < 9;i +) mtri0 = tempi - 1;mtr0i = tempi - 1;vector<string> str;for (i = 0;i lang. size() ; i +) /au a < firstvt(u)for (j 二 0; j < langi. right. sizeo ; j +) string ss = langi. right j;string ok = “";if (ss. length() > 2) if(ss0 > 'z' | | ss0,a') &&a

26、mp; (ssl <= 'z' && ssl >= 'a') /auok =;ok += ss0;ok += ssl;str.push back(ok);if(ssl > 'z' | | ssl a') && (ss2 <=&& ss2 >= '") /auok =;ok += ssl;ok += ss2;str.pushback(ok);!1for (i = 0; i < str. size() ; i +) for(j = 1;j &

27、lt; 9;j +) if(mtrj0 = stri0) /find a then find firstvt(u)for(int k = 0;k < lang. size() ;k +) if(langtk. left = stri1) /find ufor(int p = 0;p < langk. first. size() ;p +) for (int q = 1;q < 9;q 十+) if(mtrq0 = 1angk. firstp)mtrj q='str. clear ();/ua lastvt(u) > afor (i = 0; i < lan

28、g, size () ; i +) for (j = 0; j < langi. right. size() ; j +) string ss = langirightj;string ok = “;if (ss. length() > 2) if(ssl > 'z' | | ssl a') && (ss0 <=&& ss0 >= '") /uaok =;ok += ss0;ok +二 ssl;str.pushback(ok);if(ss2'z' | | ss2,a'

29、) && (ssl <= ' z' && ssl >= 'a') /uaok =;ok +二 ss 1;ok += ss2;str.push_back(ok);!1for (i = 0; i < str. size() ; i +) for(j = 1;j < 9;j +)if(mtr0j = stri1) /find a then find lastvt(u)for(int k = 0;k < lang, size() ;k +) if(langk. left = stri0) /find ufor

30、 (int p = 0;p < langk. last. size() ;p +) for(int q = l;q 9;q +)if(mtroq = langkj. lastp)mtrq j二'str. clear ();for (i = 0; i < lang, size() ; i +) /ab aub a = bfor (j = 0; j < langi. right. size() ; j +) string ss = langi. rightj;string ok = “";if (ss. length() > 2) if(ssl >

31、y 7: | ssl < 'a') && (ss0 >'z' | ss0 a') /aaok =;ok +二 ss0;ok += ss 1;str. push_back (ok);!if(ss2 >'z' | ss2a') && (ssl > ' z' | | sslo) /aaok =;ok += ssl;ok +二 ss2;str.push_back(ok);if(ss2z' | ss2 < 'a') && (

32、ss0 > ' z' | | ss0<'a,) /auaok 二 ;ok +二 ss0;ok += ss2;str. push back (ok);!1for (i = 0; i < str. size() ; i +) for(j = 1;j < 9;j +)if(stri0 = mtrj0) for(int k = 1;k < 9;k +) if(mtr0k=stril)mtrj k二'二'1!for (i = 0;i < lang0. first. size() ; i +) /#for(j = 1;j <

33、 9;j +) if (lang0. firsti = mtr0 j) mtr8 j二,<'for(i = 0;i < lang0.first.size();i +) /#for(j = 1;j < 9;j +) if(lango.firsti = mtrj0)mtr8 8十/ /""f 111 i xt%>7%v7% tx7%endl;for(i 二 0;i 9;i +) for(j = 0;j < 9;j +) if(mtri j != 'f)cout « mtrij « "elsecout &

34、lt;< "cout << endl;cout/ / " " 1% #7tx t% xj%t%>7% <t%v7% tx7% #ys 7% #r% x|%endl;cout« endl;voidtest () coutendl;/ / " " 1% #7t% tx t% xt%t%>7%|x7% #y% 7% #t% x|%t%cout« 請輸入算術(shù)表達式: « endl;string str;cin >> str;str + 二屮;int i, j, k; stac

35、k<int> data; stack<char> op;op. push ('#');char now二,n' ; /記錄當前棧頂操作符int sign = 0;for (i = 0; i < str. length() ; i +) sign 二 0;if (stri >= 'o' && stri <= ' 9') /操作數(shù)int temp = stri - ' 0 ;data, push (temp);else /運算符op. push(stri);sign 二 1;if (now != 'n' && sign = 1)( 有可比性,并且操作符棧有更新i f (! op. empty () char top = op. top();/

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論