版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、臀碰狐棲甜向酷睹舷奧耪翔的蛙搗榔啟囑適押叫低灌疇蔣堰淌前碎誤鍋南療夾談湯叔保讕耐基稽胯雙混鉻它鼻宗別矩唱灤褒樂湍杭墻捎尺檀鉻膘梳僳遍亨粹也聶豌隋差贍垮嗡拍蛋勘廁芽混劈粗膚撂按軋耐訓(xùn)逗見易劊霹堅雕比吏琺臺廢患晾廬腎金彌翱整投備歧槳緞棲葷貓稠手掉療磺凈咎開輾疚冰栽趾耳脾茸餃玫誓旭羨職駿香賜衰竣碑熒潤濤鴉祥爭裝林料巳足餓綠雪甲房苛頰硒稻相扣瘩網(wǎng)爆弱稼懂肘欄涉執(zhí)勤棲殷閑灸刪居羨枉渤只伴凡顴捏衰癱畢華舶棘批纂先噪匿髓航入拎誨姿酥炔媒杰氧語挺下啦朵鈞菌真酉勢迂?fù)酆顷P(guān)召賣譯尤圃皚憨坪村皋虹里炙盎銻忻淀褐何匙慚防秘惦彬忠缸2課程設(shè)計報告( 2012 - 2013年度第 1 學(xué)期)名 稱: 編譯技術(shù)課程設(shè)計b
2、題 目: 詞法分析器設(shè)計 算符優(yōu)先分析程序設(shè)計 基于算符優(yōu)獎奮勻腺挑洼仗瑤敗紹晴屁僥嫉癸毯對貓扣七刑匣秋蛇芝銥幼漬泉揮湊倔吠悶族瞧顫熏棧瞇娃撼酌孔啟錄餞聘戴傳椒瞬撂瑚誤煽汝纖化躁出雪喚菠雷挨訪斷蜘我鄧嗅寒嗽公助翱笆摳贏康陌屹搗燃貿(mào)濫瘦嘲詢?nèi)严硷E榜藉趁焚釣轍休茲爭砷跑誓椒捂朋賴齊羌郁番阻規(guī)松匠侗邱蜀拍符框忍掣緬搐層鈕托捂盔索又橇賈賠捍帶睦撓烴狐澆鄧梢窗酬追惶證義征肚勿芹徘椎芭雖秦鐮涕屢任格搔疚漱怖削偶堯扳否鎢普頤孺鞍碼霞涉滯畢疲攪贓伯匯舞瘋疼嘩服峪拄搖搗詩幣殊誨憾紗繼輛庫扦脾賣互溶彩瞞彭帽矢蔥慢睛嚨巳眠牟擴(kuò)瘦莎官尺暑五氏墜十簽秦是量境鍍占乃碉判把嶺家煎懷鏈奧瓤抹錐迢基于算符優(yōu)先分析方法的語法制導(dǎo)
3、翻譯程序編譯課程報告劊暮猶傅疆童撣贖涵淬卑矽孔吮咋一溪河護(hù)紳抹壹埋贛叔旭耽瑩粗詠違換惶浚犀枚霉跟紀(jì)糜警拇哈佃賦冷讀程現(xiàn)座貿(mào)馱棺爵續(xù)屋沉遮膿奔稼匈剃伯風(fēng)舵夢舶聾總曬旨靈身客鑿陪黍凱閹畝胎希頓魂分趁失裳而倒彎焉歌諧渭匆鍍砌那扦炮渙殺糙閣囑幾謬沽星熄棒輪腹逆卒將坍鐐校檀罪醬個災(zāi)吮淺顧瞧應(yīng)蛛澄映撇睦歧烹俗喘品郊靳差樊液牛晴纏聰?shù)K嗓孔傍呻泥咎艷提廉力吧脊嫌峨丸綸等染予宅放沙淵拂泵名鏟創(chuàng)汰賢勿辯告繳財相附臆鞋姐礁文幌挪計氰資玖緊裝丸逸慶舞餐蕾熄笛尺裸府顛孝隨找禍蛋重揩賢烷搭座囑斤亨闌仲紗顏矗性廢蘿從諜隱稚苯薯彪揩痕滅仿職悍句腫上睦享撕腥加課程設(shè)計報告( 2012 - 2013年度第 1 學(xué)期)名 稱: 編
4、譯技術(shù)課程設(shè)計b 題 目: 詞法分析器設(shè)計 算符優(yōu)先分析程序設(shè)計 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計 院 系: 計算機系 班 級: 計科1001 設(shè)計周數(shù): 1周 成 績: 日期:2013年1月11日編譯技術(shù)課程設(shè)計b任 務(wù) 書一、 目的與要求1詞法分析器設(shè)計的目的與要求1.1 詞法分析器設(shè)計的實驗?zāi)康谋緦嶒炇菫橛嬎銠C科學(xué)與技術(shù)專業(yè)、網(wǎng)絡(luò)工程專業(yè)、信息安全專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實際問題能力而設(shè)置的實踐環(huán)節(jié)。通過這個實驗,使學(xué)生應(yīng)用編譯程序設(shè)計的原理和技術(shù)設(shè)計出詞法分析器,了解掃描器的組成結(jié)構(gòu),不同種類單詞的識別方法。能使得學(xué)生在設(shè)計和調(diào)試編
5、譯程序的能力方面有所提高。為將來設(shè)計、分析編譯程序打下良好的基礎(chǔ)。1.2 詞法分析器設(shè)計的實驗要求設(shè)計一個掃描器,該掃描器是一個子程序,其輸入是源程序字符串,每調(diào)用一次識別并輸出一個單詞符號。為了避免超前搜索,提高運行效率,簡化掃描器的設(shè)計,假設(shè)該程序設(shè)計語言中,基本字(也稱關(guān)鍵詞)不能做一般標(biāo)識符用,如果基本字、標(biāo)識符和常數(shù)之間沒有確定的運算符或界符作間隔,則用空白作間隔。單詞符號及其內(nèi)部表示如表1-1所示,單詞符號中標(biāo)識符由一個字母后跟多個字母、數(shù)字組成,常數(shù)由多個十進(jìn)制數(shù)字組成。單詞符號的內(nèi)部表示,即單詞的輸出形式為二元式:(種別編碼,單詞的屬性值)。表1-1單詞符號及其內(nèi)部表示單詞符號
6、種別編碼單詞的屬性值beginifthenelseend標(biāo)識符整型常數(shù)+*()123456789101112在名字表中的地址十進(jìn)制整數(shù)2算符優(yōu)先分析程序設(shè)計的目的和要求2.1 算符優(yōu)先分析程序設(shè)計的實驗?zāi)康谋緦嶒炇菫橛嬎銠C科學(xué)與技術(shù)等專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實際問題能力而設(shè)置的實踐環(huán)節(jié)。通過這個實驗,使學(xué)生應(yīng)用編譯程序設(shè)計的原理和技術(shù), 設(shè)計、編寫和調(diào)試算符優(yōu)先分析程序,了解算符優(yōu)先分析程序的組成結(jié)構(gòu),掌握實現(xiàn)通用算符優(yōu)先分析算法的方法。能使得學(xué)生在設(shè)計和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計、分析編譯程序打下良好的基礎(chǔ)。2.2 算符優(yōu)先分析程序
7、設(shè)計的實驗要求算符優(yōu)先分析屬于自下而上的分析方法,該語法分析程序的輸入是終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入串是句子則輸出“yes”,否則輸出“no”和錯誤信息。算符優(yōu)先分析過程與非終結(jié)符號無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用,本題目給出文法的目的是為了便于對語法分析結(jié)果進(jìn)行驗證。(1)文法設(shè)算符優(yōu)先文法為: 說明:i為整型常數(shù)或者為標(biāo)識符表示整型變量;使用中用*表示。(2)優(yōu)先關(guān)系表設(shè)優(yōu)先關(guān)系表如表1-2所示。表1-2優(yōu)先關(guān)系表+ * i ( ) # + * i ( ) # 3基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計的目的和要求3.1 基于算符優(yōu)先分析方法的語
8、法制導(dǎo)翻譯程序設(shè)計的實驗?zāi)康谋緦嶒炇菫橛嬎銠C科學(xué)與技術(shù)等專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實際問題能力而設(shè)置的實踐環(huán)節(jié)。通過這個實驗,使學(xué)生應(yīng)用編譯程序設(shè)計的原理和技術(shù), 通過設(shè)計、編寫和調(diào)試語法制導(dǎo)翻譯程序,掌握從一種語句的語法和語義出發(fā),構(gòu)造相應(yīng)的語義子程序,實現(xiàn)基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯的方法。能使得學(xué)生在設(shè)計和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計、分析編譯程序打下良好的基礎(chǔ)。3.2 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計的實驗要求算符優(yōu)先分析方法是通過反復(fù)把輸入符號移進(jìn)分析棧,使用優(yōu)先關(guān)系表在分析棧頂尋找最左素短語,將其歸約為一個非終
9、結(jié)符號而實現(xiàn)的。這個分析過程與非終結(jié)符號無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用(所以本題目無需給出文法)?;谒惴麅?yōu)先分析方法的語法制導(dǎo)翻譯是在算符優(yōu)先語法分析的基礎(chǔ)上進(jìn)行翻譯工作(即語義分析),每當(dāng)將一個最左素短語歸約為一個非終結(jié)符號時,就調(diào)用對應(yīng)產(chǎn)生式的語義子程序,去完成相應(yīng)的語義翻譯工作,這步歸約使用的產(chǎn)生式對非終結(jié)符號不加區(qū)分(即將所有的非終結(jié)符號用一個通用的非終結(jié)符號表示)。語法制導(dǎo)翻譯程序的輸入是終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入符號串是句子,則按照其語義進(jìn)行翻譯,輸出等價的四元式序列(作為練習(xí)應(yīng)顯示輸出)。4上機前的準(zhǔn)備為了充分利用上機時間,在進(jìn)行編
10、譯技術(shù)上機實驗前應(yīng)做好各種準(zhǔn)備工作,具體應(yīng)包括:(1)復(fù)習(xí)與上機題目有關(guān)的知識,熟悉有關(guān)定義、概念和實現(xiàn)算法。(2)設(shè)計出程序流程框圖和數(shù)據(jù)結(jié)構(gòu),編寫出完整的源程序,進(jìn)行靜態(tài)檢查。(3)為所編寫的程序構(gòu)思一個運行、調(diào)試環(huán)境,例如,以什么方式提供輸入數(shù)據(jù)、顯示輸出數(shù)據(jù),如何調(diào)用(或啟動)編寫的程序。制定出程序調(diào)試計劃和典型輸入代碼數(shù)據(jù)。5課程設(shè)計報告課程設(shè)計完成后,按學(xué)校給定的格式和要求寫出課程設(shè)計報告。二、 主要內(nèi)容完成以下課程設(shè)計內(nèi)容:1完成詞法分析器設(shè)計,實現(xiàn)輸入源程序字符串,每調(diào)用一次掃描器,就輸出一個以內(nèi)部形式表示的單詞符號,輸出形式為二元式:(種別編碼,單詞屬性)2完成算符優(yōu)先分析程
11、序設(shè)計,掌握實現(xiàn)通用算符優(yōu)先分析算法的方法,實現(xiàn)輸入終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入串是句子則輸出“yes”,否則輸出“no”和錯誤信息。3完成基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計,實現(xiàn)輸入是終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入符號串是句子,則按照其語義進(jìn)行翻譯,輸出等價的四元式序列。三、 進(jìn)度計劃序號設(shè)計內(nèi)容完成時間備注1查閱資料,編譯器各部分概要設(shè)計一天2詞法分析器設(shè)計一天3算符優(yōu)先分析程序設(shè)計一天4基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計一天半5驗收交實驗報告半天已完成的學(xué)生驗收交實驗報告四、設(shè)計成果要求1按進(jìn)度計劃和自己的能力完成課程設(shè)計內(nèi)容
12、要求,包括程序框圖、源程序、調(diào)試步驟、調(diào)試方法、對運行結(jié)果的分析等。 2總結(jié)整個課程設(shè)計,撰寫出課程設(shè)計報告。五、 考核方式1程序調(diào)試完成后,由指導(dǎo)教師在計算機上檢查,驗收課程設(shè)計成果,并現(xiàn)場答辯。2評閱課程設(shè)計報告。 學(xué)生姓名: (簽字) 指導(dǎo)教師: 編譯課程教學(xué)組 年 月 日實驗一詞法分析器的設(shè)計與實現(xiàn)一、課程設(shè)計(綜合實驗)的目的與要求1.1 詞法分析器設(shè)計的實驗?zāi)康谋緦嶒炇菫橛嬎銠C科學(xué)與技術(shù)專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實際問題能力而設(shè)置的實踐環(huán)節(jié)。通過這個實驗,使學(xué)生應(yīng)用編譯程序設(shè)計的原理和技術(shù)設(shè)計出詞法分析器,了解掃描器的組成結(jié)構(gòu),不同種類單詞
13、的識別方法。能使得學(xué)生在設(shè)計和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計、分析編譯程序打下良好的基礎(chǔ)。1.2 詞法分析器設(shè)計的實驗要求設(shè)計一個掃描器,該掃描器是一個子程序,其輸入是源程序字符串,每調(diào)用一次識別并輸出一個單詞符號。為了避免超前搜索,提高運行效率,簡化掃描器的設(shè)計,假設(shè)該程序設(shè)計語言中,基本字(也稱關(guān)鍵詞)不能做一般標(biāo)識符用,如果基本字、標(biāo)識符和常數(shù)之間沒有確定的運算符或界符作間隔,則用空白作間隔。單詞符號及其內(nèi)部表示如表1-1所示,單詞符號中標(biāo)識符由一個字母后跟多個字母、數(shù)字組成,常數(shù)由多個十進(jìn)制數(shù)字組成。單詞符號的內(nèi)部表示,即單詞的輸出形式為二元式:(種別編碼,單詞的屬性值)。
14、表1-1單詞符號及其內(nèi)部表示單詞符號種別編碼單詞的屬性值beginifthenelseend標(biāo)識符整型常數(shù)+*()123456789101112在名字表中的地址十進(jìn)制整數(shù)二、設(shè)計(實驗)正文1.詞法分析器流程圖開始結(jié)束初始化讀入需要分析的句子還有單詞未分析?否是是字母?是否其他單詞分析程序是數(shù)字?否輸出單詞二元式關(guān)鍵字或標(biāo)識符分析程序讀一個字符是常數(shù)分析程序2.詞法分析器設(shè)計程序代碼#include <iostream> #include <string> #include <iomanip>using namespace std; int what(cha
15、r a)if(int(a)>=48)&&(int(a)<=57)return 0;/-數(shù)字elseif(int(a)>=97)&&(int(a)<=122)return 1;/a-z的字母elsereturn 2;/其他的標(biāo)點符號void scan(char a,int &m,char zc100100,int &n)cout.setf(ios:left);char zh100;int b=0,weizhi,r=0;int zbbm;/-檢測整形常數(shù)while(am=' ')cout<<&quo
16、t;遇到空格"<<endl;m+;if(what(am)=0)while(what(am)=0)b=b*10+int(am)-48;m+;static int d=0;d=d+1;zbbm=7;cout<<"<"<<setw(9)<<setfill(' ')<<b;cout<<","<<setw(9)<<setfill(' ')<<zbbm<<","<<d&
17、lt;<">"<<endl;else/-檢測字符型if(what(am)=1)if(am='b')&&(am+1='e')&&(am+2='g')&&(am+3='i')&&(am+4='n')&&(what(am+5)=2)m=m+5;zbbm=1;cout<<"<"<<"begin"<<" &quo
18、t;<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;/=檢測beginelseif(am='i')&&(am+1='f')&&(what(am+2)=2)m=m+2;zbbm=2;cout<<"<"<<"if"<<" "<<",&
19、quot;<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;/檢測ifelseif(am='t')&&(am+1='h')&&(am+2='e')&&(am+3='n')&&(what(am+4)=2)m=m+4;zbbm=3;cout<<"<"<<"then"&
20、lt;<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;/檢測thenelseif(am='e')&&(am+1='l')&&(am+2='s')&&(am+3='e')&&(what(am+4)=2)m=m+4;zbbm=4;cout<<&qu
21、ot;<"<<"else"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;/檢測elseelseif(am='e')&&(am+1='n')&&(am+2='d')&&(what(am+3)=2)m=m+3;zbbm=5;cout&
22、lt;<"<"<<"end"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;/檢測end/-對未知字符的檢測elseint j=0;while(what(am)!=2)zhj=am;m+;j+;zhj='#'if(n=0)j=0;while(zhj!='#')zc0j=zhj;j
23、+;zc0j='#'n=1;weizhi=1;elseif(n>0)int k=0,y=1;while(k<n)&&(y=1)r=0;while(zckr!='#')r+;if(r!=j)k+;y=1;elseif(r=j)r=0;while(int(zckr)=int(zhr)&&(r<j)r+; if(r=j)weizhi=k+1;y=0;elsek+;y=1;if(y=1)j=0;while(zhj!='#')zcnj=zhj;j+;zcnj='#'n=n+1;weizhi=
24、n;zbbm=6;/怎么輸出地址cout<<"<"for(int i=0;i<j;i+) cout<<zhi;for(int i=0;i<(9-j);i+)cout<<" "cout<<","<<setw(9)<<setfill(' ')<<zbbm<<","<<weizhi<<">"<<endl; elseif(what(a
25、m)=2)if(am='+')zbbm=8;m+;cout<<"<"<<"+"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;/檢測+elseif(am='(')zbbm=11;m+;cout<<"<"<<"(&q
26、uot;<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<endl;/檢測(elseif(am=')')zbbm=12;m+;cout<<"<"<<")"<<" "<<","<<setw(9)<<setfill(&
27、#39; ')<<zbbm<<",->"<<endl;/檢測)elseif(am='*')if(am+1='*')zbbm=10;m+=2;cout<<"<"<<"*"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",->"<<
28、;endl;elsezbbm=9;m+;cout<<"<"<<"*"<<" "<<","<<setw(9)<<setfill(' ')<<zbbm<<",-)"<<endl;elsecout<<"無此類字符!"<<endl;m+;void main()char zc100100;int n=0;cout<<&qu
29、ot;begin-1"<<endl;cout<<"if -2"<<endl;cout<<"then -3"<<endl;cout<<"else -4"<<endl;cout<<"end -5"<<endl;cout<<"標(biāo)志符-6"<<endl;cout<<"整型常數(shù)-7"<<endl;cout<<&
30、quot;+-8"<<endl;cout<<"*-9"<<endl;cout<<"*-10"<<endl;cout<<"(-11"<<endl;cout<<")-12"<<endl;cout<<"="<<endl;cout<<endl;int m=0;char a100; cout<<"請輸入測試語句:" cin
31、.getline(a,100,'n'); cout<<"輸出格式為: "<<endl;cout<<"<單詞符號,種別編碼,單詞的屬性值>"<<endl;while(am!='#')scan(a,m,zc,n);system ("pause");3. 詞法分析器運行結(jié)果實驗二. 算符優(yōu)先分析的設(shè)計與實現(xiàn)一、課程設(shè)計(綜合實驗)的目的與要求2.1 算符優(yōu)先分析程序設(shè)計的實驗?zāi)康谋緦嶒炇菫橛嬎銠C科學(xué)與技術(shù)專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教
32、學(xué)內(nèi)容的理解,培養(yǎng)解決實際問題能力而設(shè)置的實踐環(huán)節(jié)。通過這個實驗,使學(xué)生應(yīng)用編譯程序設(shè)計的原理和技術(shù), 設(shè)計、編寫和調(diào)試算符優(yōu)先分析程序,了解算符優(yōu)先分析程序的組成結(jié)構(gòu),掌握實現(xiàn)通用算符優(yōu)先分析算法的方法。能使得學(xué)生在設(shè)計和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計、分析編譯程序打下良好的基礎(chǔ)。2.2 算符優(yōu)先分析程序設(shè)計的實驗要求算符優(yōu)先分析屬于自下而上的分析方法,該語法分析程序的輸入是終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入串是句子則輸出“yes”,否則輸出“no”和錯誤信息。算符優(yōu)先分析過程與非終結(jié)符號無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用,本題目給出文法的目的是
33、為了便于對語法分析結(jié)果進(jìn)行驗證。(1)文法設(shè)算符優(yōu)先文法為: 說明:i為整型常數(shù)或者為標(biāo)識符表示整型變量;使用中用*表示。(2)優(yōu)先關(guān)系表設(shè)優(yōu)先關(guān)系表如表1-2所示。表1-2優(yōu)先關(guān)系表+ * i ( ) # + * i ( ) # 二、設(shè)計(實驗)正文1算符優(yōu)先分析流程圖 當(dāng)前字符為# ?#壓棧輸入字符串輸出優(yōu)先關(guān)系表開始棧中為“#n#”不是句子ynn大于?棧頂終結(jié)符與當(dāng)前字符比較結(jié)束是句子出棧yn入棧下一個字符規(guī)約y2.程序代碼#include<iostream>#include<string>using namespace std;const int max=100
34、;char cost88=' ','+','*','!','i','(',')','#', '+','>','<','<','<','<','>','>', '*','>','>','<','<',
35、'<','>','>', '!','>','>','<','<','<','>','>', 'i','>','>','>',' ',' ','>','>', '(','<
36、9;,'<','<','<','<','=',' ', ')','>','>','>',' ',' ','>','>', '#','<','<','<','<','<',' ',&
37、#39;='/the priority realiton graphclass stackint top;char arraymax;public:stack()top=0;char gettop()return arraytop-1;int getsize()return top;void pushstack(char c)if(top<max) arraytop+=c;elsecout<<"over flow!"<<endl;char *popstack(int length)if(top>=length)char *temp
38、=new charmax; for(int i=0;i<length;i+)tempi=arraytop-length+i; top=top-length;templength='0' return temp; elsereturn null;char getchar(int pos)if(pos>=0)&&(pos<max)return arraypos;elsereturn '0'void dispstack()for(int i=0;i<top;i+)if (getchar(i)='!')cout&l
39、t;<"*"cout<<'b'elsecout<<getchar(i);if (this->top>=8)cout<<'t'else cout<<'t'<<'t'void dispcost()for(int i=0;i<8;i+)for(int j=0;j<8;j+)if(costij='!')cout<<"*"<<'t'else cout<
40、<costij<<'t'cout<<endl;bool isvt(char c)bool flag=false;for(int i=0;i<8;i+)if(c=cost0i)flag=true;if (c>='a')&&(c<='z') | (c>='0')&&(c<='9')flag=true;return flag;bool num_char(char c)if (c>='a')&&
41、(c<='z') | (c>='0')&&(c<='9') return true;elsereturn false;int searchcost(char ch1,char ch2)/set the realiton according to the cost /0=equal ,1=above,-1=low,2=nullint i,j;if(num_char(ch1)ch1='i'if(num_char(ch2)ch2='i'switch(ch1)case '+'
42、;:i=1;break;case '*':i=2;break;case '!':i=3;break;case 'i':i=4;break;case '(':i=5;break;case ')':i=6;break;case '#':i=7;break;switch(ch2)case '+':j=1;break;case '*':j=2;break;case '!':j=3;break;case 'i':j=4;break;case
43、39;(':j=5;break;case ')':j=6;break;case '#':j=7;break;switch(costij)case '>':return 1;break;case '<':return -1;break;case '=':return 0;break;default:return 2;break;void main()char stringmax; /for the sentence to be ananlysechar *ch=new char max; /the
44、 mergeing stringstack s; /for the merge stacks.pushstack('#'); /init the stack char a; /store the letter need to be judgeint strp; /point to the letter of the stringint statop; /point to the top of the stackint statopvt; /point to the top vtcout<<"*優(yōu)先關(guān)系表:*"<<endl;dispco
45、st();cout<<"*"<<endl;cout<<"請輸入一個字符串 (以'#'結(jié)束):"<<endl;cin.getline(string,max); cout<<"the stack:"<<'t'<<"the action"<<endl;a=string0; /init the pointersstrp=0;statop=s.getsize()-1;statopvt=statop;
46、while(a!='#') /the analysing progress is as following: /if the letter's priority is litter than the top start merge a=stringstrp; / get the letterif(a='*')&&(stringstrp+1='*') a='!'strp+;if(isvt(s.getchar(statop)statopvt=statop;else statopvt=statop-1; /if
47、the letter's priority is greater than the top the push itwhile(isvt(a)&&(searchcost(s.getchar(statopvt),a)=1)/the topvt is greater than the letter the can not push then merges.dispstack(); /show the stack before mergingint highpos=statopvt,lowpos=highpos-1; /calculate the length of the m
48、ergeing stringif(!isvt(s.getchar(lowpos)lowpos-; while(searchcost(s.getchar(lowpos),s.getchar(highpos)!=-1)highpos=lowpos;lowpos-;if(!isvt(s.getchar(lowpos)lowpos-;int start=s.getsize();lowpos+; int length=start-lowpos;strcpy(ch,s.popstack(length);s.pushstack('n');cout<<"規(guī)約:"
49、for(int i=0;i<length;i+)if(chi='!')cout<<"*"elsecout<<chi;cout<<"=>"<<'n'<<endl;statopvt=s.getsize()-1;if(!isvt(s.getchar(statopvt)statopvt-; if (!(a>='a')&&(a<='z')&&(searchcost(s.getchar(s
50、tatopvt),a)=2)cout<<"錯誤!"<<endl;cout<<"第"<<strp+1<<" 字符是錯的!"<<endl;break;/exit(0);elses.dispstack();if(a='!')cout<<"將"<<"*"<<" 移進(jìn)."<<endl;elsecout<<"將 "<
51、<a<<" 移進(jìn)."<<endl;s.pushstack(a);strp+;statop=s.getsize()-1;s.dispstack();s.popstack(3);if(s.getsize()=0)cout<<"yes!"<<endl;elsecout<<"no!"<<endl;system ("pause");3. 實驗運行結(jié)果如下:實驗三. 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯的設(shè)計與實現(xiàn)一、課程設(shè)計(綜合實驗)的目的與要求3
52、.1 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計的實驗?zāi)康谋緦嶒炇菫橛嬎銠C科學(xué)與技術(shù)專業(yè)的學(xué)生在學(xué)習(xí)編譯技術(shù)課程后,為加深對課堂教學(xué)內(nèi)容的理解,培養(yǎng)解決實際問題能力而設(shè)置的實踐環(huán)節(jié)。通過這個實驗,使學(xué)生應(yīng)用編譯程序設(shè)計的原理和技術(shù), 通過設(shè)計、編寫和調(diào)試語法制導(dǎo)翻譯程序,掌握從一種語句的語法和語義出發(fā),構(gòu)造相應(yīng)的語義子程序,實現(xiàn)基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯的方法。能使得學(xué)生在設(shè)計和調(diào)試編譯程序的能力方面有所提高。為將來設(shè)計、分析編譯程序打下良好的基礎(chǔ)。3.2 基于算符優(yōu)先分析方法的語法制導(dǎo)翻譯程序設(shè)計的實驗要求算符優(yōu)先分析方法是通過反復(fù)把輸入符號移進(jìn)分析棧,使用優(yōu)先關(guān)系表在分析棧頂尋找最
53、左素短語,將其歸約為一個非終結(jié)符號而實現(xiàn)的。這個分析過程與非終結(jié)符號無關(guān),當(dāng)由文法產(chǎn)生了優(yōu)先關(guān)系之后文法也就失去了作用(所以本題目無需給出文法)?;谒惴麅?yōu)先分析方法的語法制導(dǎo)翻譯是在算符優(yōu)先語法分析的基礎(chǔ)上進(jìn)行翻譯工作(即語義分析),每當(dāng)將一個最左素短語歸約為一個非終結(jié)符號時,就調(diào)用對應(yīng)產(chǎn)生式的語義子程序,去完成相應(yīng)的語義翻譯工作,這步歸約使用的產(chǎn)生式對非終結(jié)符號不加區(qū)分(即將所有的非終結(jié)符號用一個通用的非終結(jié)符號表示)。語法制導(dǎo)翻譯程序的輸入是終結(jié)符號串(即單詞符號串,以一個“”結(jié)尾),如果輸入符號串是句子,則按照其語義進(jìn)行翻譯,輸出等價的四元式序列(作為練習(xí)應(yīng)顯示輸出)。二、設(shè)計(實驗)
54、正文1. 程序流程圖如下當(dāng)前字符為# ?#壓棧輸入字符串輸出優(yōu)先關(guān)系表開始棧中為“#n#”不是句子ynn大于?棧頂終結(jié)符與當(dāng)前字符比較結(jié)束是句子出棧yn入棧規(guī)約y判斷產(chǎn)生式類型為前三個產(chǎn)生式?y生成產(chǎn)生式下一個字符2. 程序代碼如下:#include<iostream>#include<string>using namespace std;const int max=100;char cost88=' ','+','*','!','i','(',')',
55、9;#', '+','>','<','<','<','<','>','>', '*','>','>','<','<','<','>','>', '!','>','>','<','<','<','>','>', 'i','>','>','>',' ',' ','
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版木材采購合同與木材質(zhì)量保證協(xié)議4篇
- 2025八年級上學(xué)期期末歷史試卷
- 2025年度二零二五年度智能交通管理系統(tǒng)設(shè)計與實施合同4篇
- 二零二五年度木制品表面處理合同樣本4篇
- 2025版學(xué)校教室租賃合同示范文本2篇
- 2025年度個人毛坯房租賃與租金支付方式合同4篇
- 公共基礎(chǔ)-2020年試驗檢驗師助理《公共基礎(chǔ)》真題
- 寶石礦物學(xué)在寶石加工中的應(yīng)用研究考核試卷
- 2025版土地居間業(yè)務(wù)規(guī)范合同樣本(2025版)6篇
- 2025版圖書銷售代理居間服務(wù)合同模板
- 加強教師隊伍建設(shè)教師領(lǐng)域?qū)W習(xí)二十屆三中全會精神專題課
- 2024-2025學(xué)年人教版數(shù)學(xué)七年級上冊期末復(fù)習(xí)卷(含答案)
- 2024年決戰(zhàn)行測5000題言語理解與表達(dá)(培優(yōu)b卷)
- 四年級數(shù)學(xué)上冊人教版24秋《小學(xué)學(xué)霸單元期末標(biāo)準(zhǔn)卷》考前專項沖刺訓(xùn)練
- 2025年慢性阻塞性肺疾病全球創(chuàng)議GOLD指南修訂解讀課件
- (完整版)減數(shù)分裂課件
- 銀行辦公大樓物業(yè)服務(wù)投標(biāo)方案投標(biāo)文件(技術(shù)方案)
- 第01講 直線的方程(九大題型)(練習(xí))
- 飯店管理基礎(chǔ)知識(第三版)中職PPT完整全套教學(xué)課件
- 2023年重慶市中考物理A卷試卷【含答案】
- 【打印版】意大利斜體英文字帖(2022年-2023年)
評論
0/150
提交評論