




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)一詞法分析設(shè)計(jì)實(shí)驗(yàn)學(xué)時(shí):4實(shí)驗(yàn)類型:綜合實(shí)驗(yàn)要求:必修一、實(shí)驗(yàn)?zāi)康耐ㄟ^本實(shí)驗(yàn)的編程實(shí)踐,使學(xué)生了解詞法分析的任務(wù),掌握詞法分析程序設(shè) 計(jì)的原理和構(gòu)造方法,使學(xué)生對編譯的基本概念、原理和方法有完整的和清楚的 理解,并能正確地、熟練地運(yùn)用。二、實(shí)驗(yàn)內(nèi)容用VC+/VB/JAVA語言實(shí)現(xiàn)對C語言子集的源程序進(jìn)行詞法分析。通過輸 入源程序從左到右對字符串進(jìn)行掃描和分解,依次輸出各個單詞的內(nèi)部編碼及單 詞符號自身值;若遇到錯誤則顯示“Error ”,然后跳過錯誤部分繼續(xù)顯示時(shí)進(jìn)行標(biāo)識符登記符號表的管理。以下是實(shí)現(xiàn)詞法分析設(shè)計(jì)的主要工作:(1)從源程序文件中讀入字符。(2)統(tǒng)計(jì)行數(shù)和列數(shù)用于錯誤單詞的定
2、位。(3)刪除空格類字符,包括回車、制表符空格。(4)按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。(屬性值一一token的機(jī)內(nèi) 表示)(5)如果發(fā)現(xiàn)錯誤則報(bào)告出錯(6)根據(jù)需要是否填寫標(biāo)識符表供以后各階段使用 。單詞的基本分類:關(guān)鍵字:由程序語言定義的具有固定意義的標(biāo)識符。也稱為保留字例如if、for、while、printf ;單詞種別碼為 1。標(biāo)識符:用以表示各種名字,如變量名、數(shù)組名、函數(shù)名;常數(shù): 任何數(shù)值常數(shù)。如 125, 1,0.5,3.1416 ;運(yùn)算符:+、-、*、/;關(guān)系運(yùn)算符:、=、=、=、 "分界符:;、,、(、)、;三、實(shí)驗(yàn)要求1、編程時(shí)注意編程風(fēng)格:空行的使用
3、、注釋的使用、縮進(jìn)的使用等。2、將標(biāo)識符填寫的相應(yīng)符號表須提供給編譯程序的以后各階段使用。3、根據(jù)測試數(shù)據(jù)進(jìn)行測試。測試實(shí)例應(yīng)包括以下三個部分 :全部合法的輸入。各種組合的非法輸入。由記號組成的句子。4、詞法分析程序設(shè)計(jì)要求輸出形式:例:輸入VC+語言的實(shí)例程序:If i=0 thenn+;a< = 3b %);輸出形式為:單詞二元序列類型位置(行,列)(單詞種別,單詞屬性)for(1,for )關(guān)鍵字(1,1)i(6,i )標(biāo)識符(1, 2)=(4,=)關(guān)系運(yùn)算符(1, 3)0(5, 0 )常數(shù)(1 , 4)then(1 , then)關(guān)鍵字(1, 5)n(6,n )標(biāo)識符(1 , 6
4、)+ErrorError(1, 7);(2,;)分界符(1, 8)a(6,a )標(biāo)識符(2, 1)< =(4,<二)關(guān)系運(yùn)算符(2, 23bErrorError(2, 4)%ErrorError(2, 4)(2,)分界符(2, 5);(2,;)分界符(2, 6)實(shí)驗(yàn)報(bào)告正文:功能描述:該程序具有詞法分析功能,即面對一段程序源代碼,通過該程序,能檢查出源代碼是否由詞法錯誤。三、詞法分析實(shí)驗(yàn)設(shè)計(jì)思想及算法:首先構(gòu)造六個表,key="auto","break","case","catch","cha
5、r","class","const","continue"," default","delete","do","double","else","enum","float","for","if","int","lo ng","new","private","pr
6、otected","public","register","return","short","st atic","struct","switch","this","void","while","then" 關(guān)鍵字表,單詞種別 碼1;Delimiter="","(",")","","
7、;",",",".","",""分界符表單詞種別碼 2Operator="+","-","*","/"算術(shù)運(yùn)算符表單詞種別碼3R_operators="<","<=","=",">",">=",關(guān)鍵字表,單詞種別碼 1;string Number100; 常數(shù)表單詞種別碼5;string Identifi
8、er100; 標(biāo)示符表單詞種別碼6;構(gòu)造關(guān)鍵字判斷函數(shù)Iskey(),字母判斷函數(shù)Isletter(),數(shù)字判斷函數(shù)Isnumber();構(gòu)造標(biāo)示符判別函數(shù)InsertId(),若輸入的標(biāo)示符在標(biāo)示符數(shù)組Identifier 中, 返回其下標(biāo),若不在,將該標(biāo)示符插到數(shù)組末尾。構(gòu)造標(biāo)示符判別函數(shù)InsertNumber(),若輸入的數(shù)字在數(shù)字?jǐn)?shù)組Number口中, 返回其下標(biāo),若不在,將該數(shù)字插到數(shù)組末尾。具體分析函數(shù)analyse。具體實(shí)現(xiàn)輸入源代碼的識別anaiyse()構(gòu)造思路,程序設(shè)計(jì)圖:(knpclnteO生成關(guān)鍵字表和分碗奏當(dāng)前的首字符是什么?造人標(biāo)識將表形成(Lpuinteij形成
9、(c,pointer)薇成值pointer)摘出單洞眄擔(dān),屬性)詞法分析了程序的簡化框圖綜合以上分析,畫出整個程序的運(yùn)行分析程序圖,如下:11回退打開源文件初始化文件指針M識別指針內(nèi)容將字符加 入字符數(shù) 組 Word口是指向下一字符跳過該字符是字母惑數(shù)字. 嗎/否輸出word將word與關(guān)鍵 字表key進(jìn)行匹輸出word為 普通標(biāo)示符為關(guān)鍵字識別指針內(nèi)容.是數(shù)字嗎)輸出word 為常數(shù)將字符 加入字 符數(shù)組 Word口將字符加入字符數(shù) 組 Word口將字符 加入字 符數(shù)組 Word口輸出word為界符指向下一字符輸出Word 內(nèi)容為不 可識別/整個程序的運(yùn)行分析程序圖軟件的測試方法和測試結(jié)果:
10、 首先,將要分析的源代碼寫入一個文本,存于磁盤中,然后運(yùn)行程序,輸入源代碼文件存放的路徑,若輸入路徑正確,程序?qū)⒆詣臃治鲈创a,若輸入路徑不正確,程序?qū)@示,路徑錯誤,請重新輸入的提示。下面為具體的運(yùn)行實(shí)例:源代碼為:If i=0 thenn+;a< = 3b %)Source運(yùn)算符thenthen>Errorcont inue關(guān)系運(yùn)算符Error Error關(guān)鍵字 標(biāo)識符E*l*nr人源方性名(包括蹬 路建稽的請輸大濾輸出滿足要求實(shí)驗(yàn)總結(jié)(設(shè)計(jì)的特點(diǎn)、不足、收獲與體會):通過此次實(shí)驗(yàn),讓我了解到如何設(shè)計(jì)、編制并調(diào)試詞法分析程序,熟悉了構(gòu)造詞法分析程序的手工方式的相關(guān)原理,加深了對
11、編譯原理詞法分析的理解,本次使用C+語言直接編寫此法分析程序,也讓我重新熟悉了 C+語言的相關(guān)內(nèi)容,加深了對C+語言的用途的理解。本程序的數(shù)據(jù)輸入采取直接從文件中讀取,而不是由鍵盤輸入,因此在測試過程中,輸入得到大大簡化,但是本程序的關(guān)鍵 字表只初始化了一部分關(guān)鍵字,還可繼續(xù)擴(kuò)充(只需擴(kuò)大數(shù)組,向其中補(bǔ)充要添 加的關(guān)鍵字),而且程序的測試數(shù)據(jù)存在不足,程序可能存在未發(fā)現(xiàn)的漏洞,以 上兩點(diǎn)有待改善。附錄該程序的源代碼:#include <iostream>#include<string>using namespace std;/數(shù)據(jù)定義#define MAX 33char
12、 ch =''static int line=1,row=0;int NumberCount=0,IdCount=0;stringkey="auto","break","case","catch","cha r","class","const","continue","default","de lete","do","double", &qu
13、ot;else","enum","float","for","if","int","long" ,"new","private","protected","public","reg ister","return","short","static", "struct","switc
14、h","this","void","while","then"/關(guān)鍵字表單詞種別硝stringDelimiter="","(",")","","",",",".","",""/分界符表單詞種別52string Operator="+","-","*","/&q
15、uot;/算術(shù)運(yùn)算符表單詞種別53stringR_operators="<","<=","=",">",">="/關(guān)系運(yùn)算符表單詞種別54string Number100;而數(shù)表單詞種另1J碼 string Identfier100;晰示符表單詞種別碼6/數(shù)據(jù)分析int Iskey(string c)關(guān)鍵字判斷int i;for(i=0;i<MAX;i+) if(pare(c)=0) return 1;return 0;/判斷是否為字母int IsL
16、etter(char c) if(c<='z')&&(c>='a')|(c<=Z)&&(c>='A') if(ch<='Z')&&(ch>='A')ch=ch+32;冰專換成小寫return 1;else return 0;int IsNumber(char c)/ 判斷是否為數(shù)字if(c>='0'&&c<='9') return 1;else return 0;/將arr
17、中的標(biāo)示符插入符號蓑且返回符 號表的指針int InsertId(string s)for(int i=0;i<IdCount;i+)if(Identifieri=s) return i;break;else if(IdCount=i+1) IdentifierIdCount=s; return IdCount;IdCount+;/將arr中的常實(shí)數(shù)插入常數(shù)M且返回常 數(shù)表的指針int InsertNumber(string s)for(int i=0;i<NumberCount;i+)if(Numberi=s) return i;break;else if(NumberCount
18、=i+1) NumberNumberCount=s; return NumberCount;NumberCount+;void analyse(FILE *fpin)/arr相當(dāng)于課本中般rToken string arr=""while(ch=fgetc(fpin)!=EOF)判斷是否讀取到文件末尾或者讀取出錯arr="";if(ch=' '|ch='t'|ch='n')刪除空格類字符,包括回車、制表符空格if(ch='n') line+; row=0;else if(IsLetter(c
19、h)while(IsLetter(ch)|IsNumber(ch) arr=arr+ch;ch=fgetc(fpin);fseek(fpin,-1L,SEEK_CUR)伊指針回移一個位置if (Iskey(arr)row+; 識別出一個字符,列增加一cout<<arr<<"tt( 1,"<<arr<<")"<<"tt 關(guān)鍵字,<<"tt("<<line<<","<<row<<"
20、)"<<endl;elserow+; /識另 U 出一個字符,列增加一InsertId(arr);cout<<arr<<"tt( 6,"<<arr<<")"<<"tt標(biāo)識符"<<"tt("<<line<<","<<row<<")"<<endl;)/處理常數(shù)else if(IsNumber(ch)(while(IsNumber
21、(ch)/11ch='.'&&IsNum ber(fgetc(fpin)(arr=arr+ch;ch=fgetc(fpin);)if(IsLetter(ch)(while(IsLetter(ch)|IsNumber(ch)(arr=arr+ch;ch=fgetc(fpin);)fseek(fpin,-1L,SEEK_CUR);row+;cout<<arr<<"ttError"<<"ttError"<<"tt("<<line<<&qu
22、ot;,"<<row<<")"<<endl;)elseInsertNumber(arr);row+; 識另 U出一個字符,列增加一cout<<arr<<"tt( 5,"<<arr<<")"<<"tt 常數(shù)"<<"tt("<<line<<","<<row<<")"<<en dl;/處
23、理算符 elserow+;arr=ch;switch(ch)case'+':ch=fgetc(fpin);if(ch='('|IsNumber(ch)|IsLetter(ch) )fseek(fpin,-1L,SEEK_CUR);cout<<"+"<<"tt( 3,+ )”<<"tt 算術(shù) 運(yùn)算符"<<"tt("<<line<<","<<row<<")"<
24、;<en dl; elsecout<<arr+ch<<"ttError"<<"ttError" <<"tt("<<line<<","<<row<<")"<<endl ;break;case'-' :ch=fgetc(fpin);if(ch='('|IsNumber(ch)|IsLetter(ch)fseek(fpin,-1L,SEEK_CUR);cou
25、t<<"- <<"tt( 3,- )"<<"tt 算術(shù)運(yùn)算符 "<<"tt("<<line<<","<<row<<")"<<en dl;elsecout<<arr+ch<<"ttError"<<"ttEr ror"<<"tt("<<line<<&qu
26、ot;,"<<row<<")"<< endl;break;case'*' :cout<<"-"<<"tt( 3,*)"<<"tt 算術(shù)運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<en dl;case'=' :ch=fgetc(fpin);if(ch=
27、'=')cout<<"="<<"tt( 4,= )"<<"tt 關(guān)系 運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<endl;elsefseek(fpin,-1L,SEEK_CUR);cout<<"="<<"tt( 4,=)"<<"tt 關(guān)系運(yùn)算符
28、 "<<"t("<<line<<","<<row<<")"<<endl;break;case'/' :cout<<ch<<"tt( 3,"<<ch<<")"<<"tt算術(shù)運(yùn)算符"<<"tt("<<line<<","<<row<&
29、lt;")"<<en dl;break;case'(':case')':case'':case'':case'':case'.':case',':case'':case'' :cout<<ch<<"tt( 2,"<<ch<<")"<<"tt分界符"<<"tt("<&
30、lt;line<<","<<row<<")"<<en dl;break;case'>' :ch=fgetc(fpin);if(ch='=')cout<<">="<<"tt( 4,>=)"<<"tt關(guān)系運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<en dl;elsecout<<">"<<"tt( 4,> )"<<"tt 關(guān)系運(yùn)算符"<<"tt("<<line<<","<<row<<")"<<en dl;fseek(fpin,-1L,SEEK_CUR);break;case'<' :ch=fgetc(fpin);if(ch='=
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 高質(zhì)量融合的內(nèi)涵與意義探討
- 2025至2030中國雞疫苗行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報(bào)告
- 殘疾人就業(yè)促進(jìn)與職業(yè)發(fā)展支持協(xié)議書
- 低碳經(jīng)濟(jì)背景下綠色金融支持新能源產(chǎn)業(yè)發(fā)展研究
- 直播帶貨在火山口的新機(jī)遇挑戰(zhàn)與機(jī)遇并存
- 2025至2030土豆行業(yè)發(fā)展趨勢分析與未來投資戰(zhàn)略咨詢研究報(bào)告
- 行業(yè)視角下的虛擬禮物碳積分體系建設(shè)方案
- 2025至2030中國羽毛服裝行業(yè)運(yùn)營態(tài)勢與投資前景調(diào)查研究報(bào)告
- 浙江大學(xué)科研培訓(xùn)心得體會
- 2025至2030中國自行車壓路機(jī)行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢及投資規(guī)劃深度研究報(bào)告
- 2024年河北省張家口市“三支一扶”招聘130人(高頻重點(diǎn)復(fù)習(xí)提升訓(xùn)練)共500題附帶答案詳解
- 2023年遂寧市船山區(qū)選調(diào)教師考試真題
- CJJT259-2016 城鎮(zhèn)燃?xì)庾詣踊到y(tǒng)技術(shù)規(guī)范
- 合伙人散伙分家協(xié)議書范文
- 園林綠化移樹合同
- 醫(yī)療機(jī)構(gòu)保潔人員培訓(xùn)
- 企業(yè)員工健康促進(jìn)計(jì)劃的設(shè)計(jì)與實(shí)施
- 助理工程師答辯演示
- 成人失禁相關(guān)性皮炎的預(yù)防與護(hù)理-護(hù)理團(tuán)標(biāo)
- 裝載機(jī)的基礎(chǔ)知識-裝載機(jī)的結(jié)構(gòu)及儀表
- 現(xiàn)代低壓電器技術(shù) 課件 2. 常見低壓電器
評論
0/150
提交評論