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

下載本文檔

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

文檔簡介

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

2、字符),判斷單詞種別,產(chǎn)生種別編碼。對于標(biāo)識符和常數(shù),需分別與標(biāo)識符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記錄其在表中的位置,如未出現(xiàn)過,將標(biāo)識符按順序填入數(shù)組 id 中,將常數(shù)存入數(shù)組中 ci 中,并記錄其在表中的位置。編號12345678910名字intcharfloatvoidconstifelsedowhilescanf編號11121314151617181920名字printfreturnmainread+*/%=編號21222324252627282930名字= =><!=>=<=&&|!<>編號3132333435

3、3637383940名字();,“+-三:主流程圖如下: 四:實(shí)驗(yàn)思路(1) 我首先把這個單詞的種類分成了五類,包括:關(guān)鍵字、標(biāo)識符、常數(shù)、算符、界符。然后利用狀態(tài)轉(zhuǎn)換圖進(jìn)行單詞的識別(2) 對于關(guān)鍵字、算符、界符。因?yàn)檫@些單詞的個數(shù)有限。所以我單獨(dú)給每個單詞一個種別編碼。能夠做到每個單詞的種別編碼是不一樣的。而對于常數(shù)和標(biāo)識符,我先把它們分別單獨(dú)的作為一類,然后定義一個二維數(shù)組,分別存放這個單詞的名稱和編碼。而這個編碼就是這個單詞在這個二維數(shù)組中的位置;當(dāng)遇到新的標(biāo)識符或常數(shù),就把這個單詞放入到相應(yīng)的數(shù)組中。(3) 然后構(gòu)造一個狀態(tài)轉(zhuǎn)換圖的程序。把每次得到的單詞先暫時存放在temp二維數(shù)組中

4、。然后用這個臨時的二維數(shù)組去確定這個單詞是何種類別五:實(shí)驗(yàn)代碼using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace Word public partial class Form1 : Form public Form1()

5、InitializeComponent(); char receive; /從輸入得到的源程序 char ch; /這是從源程序讀取的一個字符 string cache; /暫存的單詞 int index; /記錄取到哪個位置了 key_word temp; /用來臨時存放得到這個單詞 struct key_word public string key_name; public int number; struct num_word public string num_name; public int number; struct ID_word public string ID_name;

6、public int number; public int num_index; public int ID_index; DataTable dt; private void button1_Click(object sender, EventArgs e) dt = new DataTable(); dt.Columns.Add("助記符"); dt.Columns.Add("外部編碼"); dt.Columns.Add("內(nèi)部編碼"); dt.Columns.Add("類型"); receive = text

7、Box1.Text.ToCharArray(); index = 0; num_index = 0; ID_index = 0; while (index < receive.Length) cache = null; Get_Word(); if (temp.number = 1) int i = 0; int flag = 0; if (num_index = 0) Numnum_index.num_name = temp.key_name; Numnum_index.number = num_index; num_index+; else for (i = 0; i < nu

8、m_index; i+) if (Numi.num_name = temp.key_name) flag = i; break; if (i >= num_index) Numnum_index.num_name = temp.key_name; Numnum_index.number = num_index; flag = num_index; num_index+; DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr"助記符" = temp.key_name; dr"外部編碼" = temp.number

9、; dr"內(nèi)部編碼" = +Numflag.number; dr"類型" = "常數(shù)" else if (temp.number = 0) int i = 0; int flag = 0; if (ID_index = 0) IDID_index.ID_name = temp.key_name; IDID_index.number = ID_index; ID_index+; else for (i = 0; i < ID_index; i+) if (IDi.ID_name = temp.key_name) flag = i;

10、 break; if (i >= ID_index) IDID_index.ID_name = temp.key_name; IDID_index.number = ID_index; flag = ID_index; ID_index+; DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr"助記符" = temp.key_name; dr"外部編碼" = temp.number; dr"內(nèi)部編碼" = IDflag.number; dr"類型" = "標(biāo)識符

11、" else DataRow dr = dt.NewRow(); dt.Rows.Add(dr); dr"助記符" = temp.key_name; dr"外部編碼" = temp.number; if (temp.number >= 15 && temp.number <= 30) dr"類型" = "運(yùn)算符" else if (temp.number >= 31 && temp.number <= 40) dr"類型" = &

12、quot;界符" else dr"類型" = "關(guān)鍵字" this.dataGridView1.DataSource = dt; key_word Key; num_word Num; ID_word ID; private void Form1_Load(object sender, EventArgs e) index = 0; Key = new key_word41; Key0.key_name = "$ID" Key0.number = 0; /標(biāo)識符 Key1.key_name = "$INT"

13、; Key1.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 = "const" Key5.number = 5; Key6.key_name = "if" Key6.number = 6; Key7.key_name = "else&qu

14、ot; Key7.number = 7; Key8.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 =

15、 "main" Key13.number = 13; Key14.key_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_

16、name = "%" Key19.number = 19; Key20.key_name = "=" Key20.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; Key

17、25.key_name = ">=" Key25.number = 25; Key26.key_name = "<=" Key26.number = 26; Key27.key_name = "&&" Key27.number = 27; Key28.key_name = "|" Key28.number = 28; Key29.key_name = "!" Key29.number = 29; Key30.key_name = "<>"

18、;Key30.number = 30; Key31.key_name = "(" Key31.number = 31; Key32.key_name = ")" Key32.number = 32; Key33.key_name = "" Key33.number = 33; Key34.key_name = "" Key34.number = 34; Key35.key_name = "" Key35.number = 35; Key36.key_name = "," Ke

19、y36.number = 36; Key37.key_name = """ Key37.number = 37; Key38.key_name = "'" Key38.number = 38; Key39.key_name = "+" Key39.number = 39; Key40.key_name = "-" Key40.number = 40; Num = new num_word1024; ID = new ID_word1024; public void GetChar() /得到一個字

20、符 if (index < receive.Length) ch = receiveindex; index+; else ch = '0' public void GetNotKong() /得到一個不是空的字符 while (index < receive.Length) ch = receiveindex; index+; if (ch != ' ' && ch != 'r' && ch != '0' && ch != 'n') break; pub

21、lic void ConCat() /連接 cache += ch; public bool IsLetter() /判斷是不是字母 if (ch >= 'A' && ch <= 'Z' | ch >= 'a' && ch <= 'z') return true; else return false; public bool IsDigit() /判斷是不是數(shù)字 if (ch >= '0' && ch <= '9')

22、 return true; else return false; public int Get_Number() /得到這個單詞的編碼 for (int i = 0; i < 41; i+) if (string.Equals(cache, Keyi.key_name) return Keyi.number; return 0; public void retrace() /退回一個單詞 if (ch != '0') index-; private void Get_Word() int count; GetNotKong(); if (ch >= 'A&#

23、39; && ch <= 'Z' | ch >= 'a' && ch <= 'z') ConCat(); GetChar(); while (IsLetter() | IsDigit() ConCat(); GetChar(); retrace(); count = Get_Number(); temp.key_name = cache; if (count = 0) temp.number = 0; else temp.number = Keycount.number; else if (ch

24、>= '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 = cache; temp.number = 39; else retrace(); te

25、mp.key_name = cache; temp.number = Get_Number(); else if (ch = '-') ConCat(); GetChar(); if (ch = '-') ConCat(); temp.key_name = cache; temp.number = 40; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '<') ConCat(); GetChar(); if (ch = 

26、9;=') ConCat(); temp.key_name = cache; temp.number = 26; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '>') ConCat(); GetChar(); if (ch = '=') ConCat(); temp.key_name = cache; temp.number = 25; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '=') ConCat(); GetChar(); if (ch = '=') ConCat(); temp.key_name = cache; temp.number = 21; else retrace(); temp.key_name = cache; temp.number = Get_Number(); else if (ch = '!') ConCat(); GetChar(); if (ch = '=') Co

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論