




版權(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)時(shí)間4學(xué)時(shí)。(4)實(shí)驗(yàn)完成后,要提交實(shí)驗(yàn)報(bào)告(包括源程序清單)。2實(shí)驗(yàn)內(nèi)容2.1主程序設(shè)計(jì)考慮:主程序的說明部分為各種表格和變量安排空間(關(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)用詞法分析過程;輸出每個(gè)單詞的內(nèi)部碼(種別編碼,屬性值)。建議從文件中讀取要分析的符號(hào)串。2.2詞法分析過程考慮該過程根據(jù)輸入單詞的第一個(gè)有效字符(有時(shí)還需讀第二個(gè)
2、字符),判斷單詞種別,產(chǎn)生種別編碼。對于標(biāo)識(shí)符和常數(shù),需分別與標(biāo)識(shí)符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記錄其在表中的位置,如未出現(xiàn)過,將標(biāo)識(shí)符按順序填入數(shù)組 id 中,將常數(shù)存入數(shù)組中 ci 中,并記錄其在表中的位置。編號(hào)12345678910名字intcharfloatvoidconstifelsedowhilescanf編號(hào)11121314151617181920名字printfreturnmainread+*/%=編號(hào)21222324252627282930名字= =><!=>=<=&&|!<>編號(hào)3132333435
3、3637383940名字();,“+-三:主流程圖如下: 四:實(shí)驗(yàn)思路(1) 我首先把這個(gè)單詞的種類分成了五類,包括:關(guān)鍵字、標(biāo)識(shí)符、常數(shù)、算符、界符。然后利用狀態(tài)轉(zhuǎn)換圖進(jìn)行單詞的識(shí)別(2) 對于關(guān)鍵字、算符、界符。因?yàn)檫@些單詞的個(gè)數(shù)有限。所以我單獨(dú)給每個(gè)單詞一個(gè)種別編碼。能夠做到每個(gè)單詞的種別編碼是不一樣的。而對于常數(shù)和標(biāo)識(shí)符,我先把它們分別單獨(dú)的作為一類,然后定義一個(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ù)組中
4、。然后用這個(gè)臨時(shí)的二維數(shù)組去確定這個(gè)單詞是何種類別五:實(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; /這是從源程序讀取的一個(gè)字符 string cache; /暫存的單詞 int index; /記錄取到哪個(gè)位置了 key_word temp; /用來臨時(shí)存放得到這個(gè)單詞 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)識(shí)符
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)識(shí)符 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() /得到一個(gè)字
20、符 if (index < receive.Length) ch = receiveindex; index+; else ch = '0' public void GetNotKong() /得到一個(gè)不是空的字符 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() /得到這個(gè)單詞的編碼 for (int i = 0; i < 41; i+) if (string.Equals(cache, Keyi.key_name) return Keyi.number; return 0; public void retrace() /退回一個(gè)單詞 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)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)境污染事件原因分析及整改措施
- 四年級道德與法治文化傳承計(jì)劃
- 2025年護(hù)士執(zhí)業(yè)資格考試題庫-急危重癥護(hù)理學(xué)護(hù)理新技術(shù)試題
- 2025年貨車司機(jī)以及安全主任聘用合同6篇
- 電器采購合同模板5篇
- z20xx重點(diǎn)原材料供應(yīng)合同6篇
- Oracle技術(shù)服務(wù)合同6篇
- 銅電纜電器產(chǎn)品定貨合同8篇
- 手車買賣合同范本簡單版
- 版營運(yùn)車輛服務(wù)標(biāo)準(zhǔn)合同10篇
- 大學(xué)英語(西安石油大學(xué))知到智慧樹章節(jié)測試課后答案2024年秋西安石油大學(xué)
- 《壽險(xiǎn)的功能與意義》課件
- DB15-T 3738-2024 家政服務(wù)機(jī)構(gòu)星級劃分及評定規(guī)范
- 實(shí)驗(yàn)室危險(xiǎn)化學(xué)品安全管理
- 新疆烏魯木齊市(2024年-2025年小學(xué)六年級語文)部編版期末考試(上學(xué)期)試卷及答案
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- 計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)基礎(chǔ)(微課版)(周舸第6版) 各章課后習(xí)題
- 中華傳統(tǒng)文化進(jìn)中小學(xué)課程教材指南
- 醫(yī)療搶救設(shè)備儀器培訓(xùn)
- 多模態(tài)數(shù)據(jù)應(yīng)用案例分析
- 2025年中國電信云網(wǎng)資源管理技能認(rèn)證考試題庫(含各題型)
評論
0/150
提交評論