




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 實驗一 詞法分析1實驗要求(1)從源程序文件中讀取有效字符并將其轉(zhuǎn)換成二元組內(nèi)部表示形式輸出。(2)掌握詞法分析的實現(xiàn)方法。(3)實驗時間4學(xué)時。(4)實驗完成后,要提交實驗報告(包括源程序清單)。2實驗內(nèi)容2.1主程序設(shè)計考慮:主程序的說明部分為各種表格和變量安排空間(關(guān)鍵字和特殊符號表)。id 和ci 數(shù)組分別存放標識符和常數(shù);還有一些為造表填表設(shè)置的變量。主程序的工作部分建議設(shè)計成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個循環(huán)處理一個單詞;調(diào)用詞法分析過程;輸出每個單詞的內(nèi)部碼(種別編碼,屬性值)。建議從文件中讀取要分析的符號串。2.2詞法分析過程考慮該過程根據(jù)輸入單詞的第一個有效字符(有時還需讀第二個
2、字符),判斷單詞種別,產(chǎn)生種別編碼。對于標識符和常數(shù),需分別與標識符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記錄其在表中的位置,如未出現(xiàn)過,將標識符按順序填入數(shù)組 id 中,將常數(shù)存入數(shù)組中 ci 中,并記錄其在表中的位置。編號12345678910名字intcharfloatvoidconstifelsedowhilescanf編號11121314151617181920名字printfreturnmainread+*/%=編號21222324252627282930名字= =><!=>=<=&&|!<>編號3132333435
3、3637383940名字();,“+-三:主流程圖如下: 四:實驗思路(1) 我首先把這個單詞的種類分成了五類,包括:關(guān)鍵字、標識符、常數(shù)、算符、界符。然后利用狀態(tài)轉(zhuǎn)換圖進行單詞的識別(2) 對于關(guān)鍵字、算符、界符。因為這些單詞的個數(shù)有限。所以我單獨給每個單詞一個種別編碼。能夠做到每個單詞的種別編碼是不一樣的。而對于常數(shù)和標識符,我先把它們分別單獨的作為一類,然后定義一個二維數(shù)組,分別存放這個單詞的名稱和編碼。而這個編碼就是這個單詞在這個二維數(shù)組中的位置;當遇到新的標識符或常數(shù),就把這個單詞放入到相應(yīng)的數(shù)組中。(3) 然后構(gòu)造一個狀態(tài)轉(zhuǎn)換圖的程序。把每次得到的單詞先暫時存放在temp二維數(shù)組中
4、。然后用這個臨時的二維數(shù)組去確定這個單詞是何種類別五:實驗代碼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"類型" = "標識符
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"類型" = "運算符" 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; /標識符 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年湖南省航空發(fā)展有限公司招聘考試必刷試題(含答案)
- 教學(xué)一體機操作培訓(xùn)課件
- 花茶教學(xué)課件
- 人口容量教學(xué)課件
- 古對今教學(xué)課件
- 敬業(yè)的德育課件
- 敬業(yè)與樂業(yè)課件
- 認識教學(xué)課件圖片
- 光影教學(xué)課件
- 【青島】2025年國家稅務(wù)總局青島市稅務(wù)系統(tǒng)招聘事業(yè)單位工作人員14人筆試歷年典型考題及考點剖析附帶答案詳解
- 2025年育嬰師職業(yè)資格考試試題及答案
- 2023年三種人試題附答案
- 哇哈哈品牌管理制度
- 2025年第十屆“學(xué)憲法、講憲法”網(wǎng)絡(luò)知識競賽題庫(含答案)
- 北師大版四年級下冊數(shù)學(xué)計算題每日一練帶答案(共30天)
- HIV實驗室風險評估-
- 計價格(2002)10號文
- 從銷售員到銷售總監(jiān)的六門必修課
- 《云南省建筑工程資料管理規(guī)程應(yīng)用指南)(上下冊)
- 工程更改控制程序DFCPQEOMS-06
- 送電線路工程跨越河流架線施工專項方案
評論
0/150
提交評論