實(shí)驗(yàn)一詞法分析報(bào)告_第1頁(yè)
實(shí)驗(yàn)一詞法分析報(bào)告_第2頁(yè)
實(shí)驗(yàn)一詞法分析報(bào)告_第3頁(yè)
實(shí)驗(yàn)一詞法分析報(bào)告_第4頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、.實(shí)驗(yàn)一詞法分析1 實(shí)驗(yàn)要求(1 )從源程序文件中讀取有效字符并將其轉(zhuǎn)換成二元組內(nèi)部表示形式輸出。( 2 )掌握詞法分析的實(shí)現(xiàn)方法 。( 3)實(shí)驗(yàn)時(shí)間 4 學(xué)時(shí) 。( 4 )實(shí)驗(yàn)完成后 ,要提交實(shí)驗(yàn)報(bào)告 (包括源程序清單 )。2 實(shí)驗(yàn)內(nèi)容2.1 主程序設(shè)計(jì)考慮:主程序的說(shuō)明部分為各種表格和變量安排空間(關(guān)鍵字和特殊符號(hào)表)。id 和 ci 數(shù)組分別存放標(biāo)識(shí)符和常數(shù);還有一些為造表填表設(shè)置的變量。主程序的工作部分建議設(shè)計(jì)成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個(gè)循環(huán)處理一個(gè)單詞;調(diào)用詞法分析過(guò)程 ;輸出每個(gè)單詞的內(nèi)部碼(種別編碼 ,屬性值 )。 建議從文件中讀取要分析的符號(hào)串 。2.2 詞法分析過(guò)程考慮該過(guò)程根

2、據(jù)輸入單詞的第一個(gè)有效字符(有時(shí)還需讀第二個(gè)字符), 判斷單詞種別,產(chǎn)生種別編碼。對(duì)于標(biāo)識(shí)符和常數(shù),需分別與標(biāo)識(shí)符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記錄其在表中的位置,如未出現(xiàn)過(guò),將標(biāo)識(shí)符按順序填入數(shù)組id中,將常數(shù)存入數(shù)組中ci 中,并記錄其在表中的位置。編號(hào)12345678910名字intcharfloatvoidconstifelsedowhilescanf編號(hào)11121314151617181920.專業(yè) .專注. .名字printfreturnmain. .read+*/%=編號(hào)21222324252627282930名字= =><! =>=<

3、;=&&|!<>編號(hào)31323334353637383940名字();,“+-三:主流程圖如下 :常數(shù)分析程序入口開工操作讀源程序字符是字母?YNY是數(shù)字?N其它單詞關(guān)鍵字和標(biāo)識(shí)符分析程序分析程序輸出單詞的內(nèi)部表示Y是有字符?N出口.專業(yè) .專注.四:實(shí)驗(yàn)思路( 1)我首先把這個(gè)單詞的種類分成了五類 ,包括:關(guān)鍵字、標(biāo)識(shí)符、常數(shù)、算符、界符。然后利用狀態(tài)轉(zhuǎn)換圖進(jìn)行單詞的識(shí)別( 2)對(duì)于關(guān)鍵字 、算符、界符 。因?yàn)檫@些單詞的個(gè)數(shù)有限 。所以我單獨(dú)給每個(gè)單詞一個(gè)種別編碼 。 能夠做到每個(gè)單詞的種別編碼是不一樣的 。 而對(duì)于常數(shù)和標(biāo)識(shí)符 ,我先把它們分別單獨(dú)的作為一類,然

4、后定義一個(gè)二維數(shù)組,分別存放這個(gè)單詞的名稱和編碼。而這個(gè)編碼就是這個(gè)單詞在這個(gè)二維數(shù)組中的位置;當(dāng)遇到新的標(biāo)識(shí)符或常數(shù),就把這個(gè)單詞放入到相應(yīng)的數(shù)組中。( 3)然后構(gòu)造一個(gè)狀態(tài)轉(zhuǎn)換圖的程序。把每次得到的單詞先暫時(shí)存放在temp二維數(shù)組中 。然后用這個(gè)臨時(shí)的二維數(shù)組去確定這個(gè)單詞是何種類別五:實(shí)驗(yàn)代碼usingSystem;usingusingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingusing.專業(yè) .專注.namespaceWordpubl

5、icpartialclass Form1: FormpublicForm1()InitializeComponent();charreceive;/ 從輸入得到的源程序charch;/ 這是從源程序讀取的一個(gè)字符stringcache;/ 暫存的單詞intindex;/ 記錄取到哪個(gè)位置了key_wordtemp;/ 用來(lái)臨時(shí)存放得到這個(gè)單詞structkey_wordpublicstringkey_name;publicintnumber;structnum_wordpublicstringnum_name;publicintnumber;.專業(yè) .專注.structID_wordpubli

6、cstringID_name;publicintnumber;publicintnum_index;publicintID_index;DataTabledt;privatevoidbutton1_Click(objectsender,EventArgse)dt= newDataTable();助記符 ");外部編碼 ");內(nèi)部編碼 ");類型 ");receive=index= 0;num_index=0;ID_index=0;.專業(yè) .專注.while(index<receive.Length)cache = null;Get_Word();i

7、f (temp.number=1)inti = 0;intflag=0;if (num_index=0)Numnum_index.num_name=temp.key_name;Numnum_index.number= num_index;num_index+;elsefor(i =0; i <num_index;i+)if(Numi.num_name=temp.key_name)flag=i;.專業(yè) .專注.break;if (i >=num_index)Numnum_index.num_name= temp.key_name;Numnum_index.number=num_ind

8、ex;flag= num_index;num_index+;DataRowdr= dt.NewRow();dr" 助記符 " =temp.key_name;dr" 外部編碼 "= temp.number;dr" 內(nèi)部編碼 "= +Numflag.number;dr" 類型 " ="常數(shù) "else if (temp.number=0)inti = 0;intflag=0;.專業(yè) .專注.if (ID_index=0)IDID_index.ID_name= temp.key_name;IDID_i

9、ndex.number=ID_index;ID_index+;elsefor(i =0; i <ID_index;i+)if(IDi.ID_name=temp.key_name)flag=i;break;if (i >=ID_index)IDID_index.ID_name= temp.key_name;IDID_index.number=ID_index;flag= ID_index;ID_index+;.專業(yè) .專注.DataRowdr= dt.NewRow();dr" 助記符 " =temp.key_name;dr" 外部編碼 "= t

10、emp.number;dr" 內(nèi)部編碼 "= IDflag.number;dr" 類型 " ="標(biāo)識(shí)符 "elseDataRowdr= dt.NewRow();dr" 助記符 " =temp.key_name;dr" 外部編碼 "= temp.number;if (temp.number>=15 &&temp.number<=30)dr" 類型 "= "運(yùn)算符 "else if(temp.number>=31 &&

11、amp;temp.number<=40)dr" 類型 "= "界符 ".專業(yè) .專注.elsedr" 類型 "= "關(guān)鍵字 "= dt;key_wordKey;num_wordNum;ID_wordID;privatevoidForm1_Load(objectsender,EventArgse)index= 0;Key = newkey_word41;Key0.key_name="$ID"Key0.number=0;/ 標(biāo)識(shí)符Key1.key_name="$INT"Ke

12、y1.number=1;/ 數(shù)Key2.key_name="int"Key2.number=2; Key3.key_name= "float"Key3.number= 3;Key4.key_name="void"Key4.number= 4; Key5.key_name= "con.專業(yè) .專注.st" Key5.number= 5; Key6.key_name="if"Key6.number= 6; Key7.key_name= "else"Key7.number= 7;K

13、ey8.key_name="do"Key8.number= 8; Key9.key_name= "while"Key9.number= 9; Key10.key_name= "scanf"Key10.number= 10; Key11.key_name= "printf"Key11.number=11;Key12.key_name= "return"Key12.number=12; Key13.key_name="main"Key13.number= 13; Key14.ke

14、y_name= "read"Key14.number= 14;Key15.key_name= "+"Key15.number=15;Key16.key_name= "-"Key16.number=16; Key17.key_name= "*"Key17.number= 17; Key18.key_name= "/"Key18.number=18; Key19.key_name= "%"Key19.number= 19;Key20.key_name="="K

15、ey20.number= 20; Key21.key_name="="Key21.number= 21; Key22.key_name= ">" Key22.number= 22; Key23.key_name ="<"Key23.number=23;Key24.key_name="!="Key24.number= 24; Key25.key_name=">="Key25.number= 25; Key26.key_name= "<="Key26.nu

16、mber= 26; Key27.key_name= "&&"Key27.number=27;Key28.key_name="|"Key28.number=28; Key29.key_name="!"Key29.number=29; Key30.key_name ="<>"Key30.number=30;Key31.key_name="("Key31.number=31;Key32.key_name=")"Key32.number=32; Key33

17、.key_name="".專業(yè) .專注.Key33.number= 33;Key34.key_name=""Key34.number=34;Key35.key_name=""Key35.number= 35;Key36.key_name=","Key36.number=36;Key37.key_name=""" Key37.number= 37; Key38.key_name = "'" Key38.number = 38; Key39.key_name =

18、 "+" Key39.number=39;Key40.key_name="-"Key40.number=40;Num=newnum_word1024;ID = newID_word1024;publicvoidGetChar()/ 得到一個(gè)字符if (index<receive.Length)ch =receiveindex;index+;elsech ='0'.專業(yè) .專注.publicvoidGetNotKong()/ 得到一個(gè)不是空的字符while(index<receive.Length)ch=receiveindex

19、;index+;if(ch!= ' ' && ch != 'r' && ch != '0' && ch != 'n')break;publicvoidConCat()/ 連接cache+=ch;publicboolIsLetter()/ 判斷是不是字母if (ch >='A' &&ch <='Z' | ch >='a'&&ch <='z').專業(yè) .專注.retur

20、ntrue;elsereturnfalse;publicboolIsDigit()/ 判斷是不是數(shù)字if (ch >='0' &&ch <='9')returntrue;elsereturnfalse;publicintGet_Number()/ 得到這個(gè)單詞的編碼for(inti =0; i < 41; i+).專業(yè) .專注.if (string.Equals(cache,Keyi.key_name)returnKeyi.number;return0;publicvoidretrace()/ 退回一個(gè)單詞if (ch !=&#

21、39;0')index-;privatevoidGet_Word()intcount;GetNotKong();if (ch >='A'&&ch <='Z' | ch >='a'&&ch <='z').專業(yè) .專注.ConCat();GetChar();while(IsLetter()| IsDigit()ConCat();GetChar();retrace();count= Get_Number();temp.key_name= cache;if (count=0)

22、temp.number=0;elsetemp.number=Keycount.number;.專業(yè) .專注.else if (ch >='0'&&ch <='9')ConCat();GetChar();while(IsDigit()ConCat();GetChar();retrace();temp.key_name= cache;temp.number= 1;else if (ch ='+')ConCat();GetChar();if (ch ='+')ConCat();temp.key_name= c

23、ache;.專業(yè) .專注.temp.number=39;elseretrace();temp.key_name= cache;temp.number=Get_Number();else if (ch ='-')ConCat();GetChar();if (ch ='-')ConCat();temp.key_name= cache;temp.number=40;elseretrace();.專業(yè) .專注.temp.key_name= cache;temp.number=Get_Number();else if (ch ='<')ConCat(

24、);GetChar();if (ch ='=')ConCat();temp.key_name= cache;temp.number=26;elseretrace();temp.key_name= cache;temp.number=Get_Number();else if (ch ='>').專業(yè) .專注.ConCat();GetChar();if (ch ='=')ConCat();temp.key_name= cache;temp.number=25;elseretrace();temp.key_name= cache;temp.num

25、ber=Get_Number();else if (ch ='=')ConCat();GetChar();if (ch ='=').專業(yè) .專注.ConCat();temp.key_name= cache;temp.number=21;elseretrace();temp.key_name= cache;temp.number=Get_Number();else if (ch ='!')ConCat();GetChar();if (ch ='=')ConCat();temp.key_name= cache;temp.number=24;else.專業(yè) .專注.retrac

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論