版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、編譯原理實 驗 報 告專業(yè): 軟件工程 班級: 2013 級 3 班學(xué)號: 姓名: 雷 濤 2015至2016學(xué)年 第2學(xué)期計算機(jī)科學(xué)學(xué)院實 驗 報 告 說 明本課程實驗從開課學(xué)期第9周開始,每周2學(xué)時上機(jī)實驗課,第16周結(jié)束,其中第16周為實驗檢測,共14學(xué)時。除統(tǒng)一安排的時間外,學(xué)生還可根據(jù)自己的實際適當(dāng)安排課余時間上機(jī)。實驗課注意事項如下:(1) 每次實驗前學(xué)生必須充分準(zhǔn)備每次的實驗內(nèi)容,以保證每次上機(jī)實驗的效果。實驗過程中必須獨立完成。(2) 每次實驗課將考勤,并作為實驗成績的重要依據(jù)。(3) 每次實驗完成后,及時撰寫實驗報告并交實驗指導(dǎo)老師批閱。(4) 實驗報告中學(xué)生必須填寫【實驗地
2、點】、【實驗時間】、【實驗過程】以及【實驗總結(jié)】,注意:必須手寫完成,并獨立撰寫實驗總結(jié),嚴(yán)禁抄襲。(5) 每次實驗完成后,請將實驗結(jié)果發(fā)送到教師指定郵箱(jkxllj)。(6) 學(xué)期結(jié)束時,每位同學(xué)應(yīng)將自己的實驗報告冊交各班級班長或?qū)W習(xí)委員,由班長或?qū)W習(xí)委員以班級為單位、按學(xué)號從小到大排列好統(tǒng)一交給實驗指導(dǎo)老師,否則無實驗成績。附 實驗成績登記表實驗名稱實驗一實驗二實驗成績2實驗名稱:一個簡單詞法分析器的設(shè)計與實現(xiàn) 指導(dǎo)教師:劉麗娟實驗地點: 新實驗樓項目一實驗室 實驗日期: 2016年 5 月 10 日 成績: 實驗?zāi)康模? 了解詞法分析的任務(wù);2 掌握詞法分析程序的工作流程。實驗內(nèi)容:
3、定義模擬的簡單語言的詞法構(gòu)成,編制詞法分析程序,要求將用模擬語言書寫的源程序進(jìn)行詞法分析,輸出源程序清單,Token文件和錯誤信息文件。若有錯誤,必須輸出錯誤在源程序中行號和列號,并將符號表和字符串以文件的形式寫出來。基本要求:1寫出該實驗的實驗步驟;2寫出實驗中遇到的問題及解決的方法。實驗步驟:1,分析關(guān)鍵字(語言保留標(biāo)識符等)2,定義模擬的簡單語言的詞法構(gòu)成3,將關(guān)鍵字裝入HashMap中4,讀入要分析的程序文件5,詞法分析6,將分析結(jié)果tokens保存到List集合中7,輸出tokens到文件中核心代碼:關(guān)鍵字:public class KeyWords public String ke
4、yWord = "" public KeyWords (String keyWord) this.keyWord = keyWord; public String toString() return this.keyWord; /*列舉寫關(guān)鍵字*/ public static final KeyWords and = new KeyWords("&&"), or = new KeyWords("|"), equal = new KeyWords ("="), For = new KeyWords(&
5、quot;for"), Do = new KeyWords("do"), private static List<KeyWords> keyWordsLists = new ArrayList<KeyWords>(); /*向外界提供對象集合*/ public static List<KeyWords> getKeyWordsLists() keyWordsLists.add(and); keyWordsLists.add(or); keyWordsLists.add(equal); keyWordsLists.add(For)
6、; keyWordsLists.add(Do); return keyWordsLists;數(shù)據(jù)類型:public class DataType extends KeyWordspublic String dataType=""public DataType(String s) super(s);this.dataType=s;/*八種基本數(shù)據(jù)類型*/ public static final DataType Int = new DataType("int"), Float = new DataType("float"), priva
7、te static List<DataType> dataTypeLists = new ArrayList<DataType>(); /*向外界提供對象集合*/ public static List<DataType> getDataTypeLists() dataTypeLists.add(Boolean); dataTypeLists.add(Float); return dataTypeLists; public String toString() return this.dataType; 詞法分析引擎:public class LexicalAn
8、alysis /* 下一個讀入字符 */char nextChar = ' '/* 將KeyWords對象裝在hashMap中 */private HashMap<String, String> keyWords = new HashMap<String, String>();/* 將DataTypes對象裝在hashMap中 */private HashMap<String, String> dataTypes = new HashMap<String, String>();/* token序列 (遍歷過程中所有字符串的分割列表
9、,以便于保存到文件中) */private List<String> tokenLists = new LinkedList<String>();/* 讀取文件變量 */BufferedReader reader = null;/* 保存當(dāng)前是否讀取到了文件的結(jié)尾 */private Boolean isEnd = false;/* 記錄行號 */public static int lineNum = 1;/* 將保存keyWords對象保存到HashMap中便于查詢(其實key=value) */void reserve(KeyWords w) keyWords.pu
10、t(w.keyWord, w.toString();/*裝數(shù)據(jù)類型*/void reservedataTypes(DataType d) dataTypes.put(d.dataType, d.toString();/* * 構(gòu)造函數(shù)中將關(guān)鍵字和類型添加到hashtable words中 */public LexicalAnalysis(String filePath) /* 初始化讀取文件變量 */try reader = new BufferedReader(new FileReader(filePath);/ 讀入文件 catch (IOException e) System.out.p
11、rint(e);/* 關(guān)鍵字對象 */List<KeyWords> list1 = KeyWords.getKeyWordsLists();for (KeyWords k : list1) this.reserve(k);/* 數(shù)據(jù)類型 */List<DataType> list = DataType.getDataTypeLists();for (DataType dataType : list) this.reserve(dataType);this.reservedataTypes(dataType);public void readChar() throws I
12、OException /* 這里應(yīng)該是使用的是 */nextChar = (char) reader.read();if (int) nextChar = 0xffff) / 標(biāo)志文件已讀完this.isEnd = true;public Boolean readChar(char ch) throws IOException readChar();if (this.nextChar != ch) return false;this.nextChar = ' 'return true;public void scan() throws IOException /* 消除空白 *
13、/for (; readChar() if (nextChar = ' ' | nextChar = 't') continue; else if (nextChar = 'n') tokenLists.add("第-" + lineNum + "-行");lineNum = lineNum + 1; elsebreak;/* 下面開始分割關(guān)鍵字,標(biāo)識符等信息 */switch (nextChar) /* 對于 =, >=, <=, !=的區(qū)分使用狀態(tài)機(jī)實現(xiàn) */case '='
14、:if (readChar('=') tokenLists.add("=" + "-KeyWords");break; else tokenLists.add("=" + "-KeyWords");break;case '>':if (readChar('=') tokenLists.add(">=" + "-KeyWords");break; else tokenLists.add(">"
15、 + "-KeyWords");break;case '<':if (readChar('=') tokenLists.add("<=" + "-KeyWords");break; else tokenLists.add("<" + "-KeyWords");break;case '!':if (readChar('=') tokenLists.add("!=" + "-KeyWord
16、s");break; else tokenLists.add("!" + "-KeyWords");break;case '(':if (readChar('(') tokenLists.add("(" + "-KeyWords");break;case ')':if (readChar(')') tokenLists.add(")" + "-KeyWords");break;/* * 下面是對數(shù)字的識
17、別,根據(jù)文法的規(guī)定的話,這里的 數(shù)字只要是能夠識別整數(shù)就行 isDigit確定指定字符(Unicode代碼點)是否為數(shù)字。 */if (Character.isDigit(nextChar) int value = 0;do value = 10 * value + Character.digit(nextChar, 10);readChar(); while (Character.isDigit(nextChar);tokenLists.add(value + "-Number");return;/* * 關(guān)鍵字或者是標(biāo)識符的識別 isLetter確定指定字符是否為字母
18、*/if (Character.isLetter(nextChar) StringBuffer sb = new StringBuffer();/* 首先得到整個的一個分割 */do sb.append(nextChar);readChar(); while (Character.isLetterOrDigit(nextChar); / isLetterOrDigit確定指定字符是否為字母或數(shù)字/* 判斷是關(guān)鍵字還是標(biāo)識符 */String s = sb.toString();String datatype = dataTypes.get(s);/* 如果是關(guān)鍵字或者是類型的話,w不應(yīng)該是空的
19、 */if (s != null) if (datatype!=null) tokenLists.add(datatype+"-DataType");return;tokenLists.add(s);return; /* 說明是關(guān)鍵字 或者是類型名 */* 否則就是一個標(biāo)識符id */tokenLists.add(s);keyWords.put(s, s);return;/* nextChar中的任意字符都被認(rèn)為是詞法單元返回 */if (int) nextChar != 0xffff)tokenLists.add(nextChar + "");next
20、Char = ' 'return;/* 是否讀取到文件的結(jié)尾 */public Boolean getReaderState() return this.isEnd;/* 保存Tokens */public void saveTokens() throws IOException FileWriter writer = new FileWriter("Tokens表.txt");writer.write("符號 符號類型信息n");writer.write("rn");for (int i = 0; i < to
21、kenLists.size(); +i) String tok = (String) tokenLists.get(i);/* 寫入文件 */writer.write(tok + "rn");writer.flush();writer.close();主方類:public class Main public static void main(String args) throws IOException String filePath="D:/Lexer.java"LexicalAnalysis lexicalAnalysis = new Lexical
22、Analysis(filePath);while (lexicalAnalysis.getReaderState() = false) lexicalAnalysis.scan();/* 保存相關(guān)信息 */lexicalAnalysis.saveTokens();System.out.println("詞法分析完畢");遇到的問題:1,字符的讀取2,關(guān)鍵字的讀取解決的方法:上網(wǎng)查詢資料實驗結(jié)果截圖:實驗總結(jié)(學(xué)生)請手工填寫實驗評價(教師)對應(yīng)后面打“”熟練完成(無錯誤),對應(yīng)級別A基本完成(有錯誤),對應(yīng)級別B部分完成(部分沒做),對應(yīng)級別C沒有做(與題目無關(guān)、空白),記
23、0分實驗名稱:一個簡單語法分析器的設(shè)計與實現(xiàn) 指導(dǎo)教師: 劉麗娟 實驗地點: 新實驗樓項目一實驗室 實驗日期: 2016年 5 月 20 日 成績: 實驗?zāi)康模?.掌握語法分析的基本任務(wù);2.掌握語法分析器的工作流程;3.能設(shè)計一個簡單的語法分析器,并完成對指定句子的分析。實驗內(nèi)容: 給定一個LL(1)文法,編制語法分析程序,輸出其預(yù)測分析表,用LL(1)預(yù)測分析程序?qū)崿F(xiàn)其分析過程并輸出分析過程和分析結(jié)果?;疽螅?寫出實驗步驟;2寫出實驗中遇到的問題及解決的方法。實驗步驟:1,根據(jù)文法構(gòu)造LL(1)分析表2,編寫分析程序主要代碼:public class LL1 /文法/(1)E->
24、TG/(2)G->+TG|-TG/(3)G->/(4)T->FS/(5)S->*FS|/FS/(6)S->/(7)F->(E)/(8)F->ipublic LL1(String str) super();strToken = new StringBuilder(str);/ LL(1)分析表private String analysisTable = new String "TG", "", "", "TG", "", "",&quo
25、t;","", "", "+TG", "", "", "", "-TG","","", "FS", "", "", "FS", "", "","","" , "", "", "*FS", &
26、quot;", "", "" ,"/FS","", "i", "", "", "(E)", "", "","","" ;/ 存儲終結(jié)符private String VT = new String "i", "+", "*", "(", ")", &q
27、uot;-","/","#" ;/ 存儲終結(jié)符private String VN = new String "E", "G", "T", "S", "F" ;/ 輸入串private StringBuilder strToken;/ 分析棧private Stack<String> stack = new Stack<String>();/ a保存從輸入串中讀取的一個輸入符號,當(dāng)前符號private String a =
28、null;/ topChar中保存stack棧頂符號private String topChar = null;/ flag標(biāo)志預(yù)測分析是否成功private boolean flag = true;/ 記錄輸入串中當(dāng)前字符的位置private int cur = 0;/ 記錄步數(shù)private int count = 0;/*初始化*/protected void init() strToken.append("#");stack.push("#");System.out.printf("%-9s %-38s %6s %-20sn"
29、, "步驟 ", "符號棧 ", "輸入串 ","所用產(chǎn)生式 ");stack.push("E");curCharacter();System.out.printf("%-6d %-20s %6s n", count, stack.toString(),strToken.substring(cur, strToken.length();/*讀取當(dāng)前棧頂符號*/protected String stackPeek() topChar = stack.peek();return
30、topChar;/*返回輸入串中當(dāng)前位置的字母*/private String curCharacter() a = String.valueOf(strToken.charAt(cur);return a;/*判斷topChar是否是終結(jié)符*/protected boolean topCharisVT() for (int i = 0; i < (VT.length - 1); i+) if (VTi.equals(topChar) return true;return false;/*查找topChar在非終結(jié)符中分析表中的橫坐標(biāo)*/protected String VNTI() i
31、nt Ni = 0, Tj = 0;for (int i = 0; i < VN.length; i+) if (VNi.equals(topChar) Ni = i;for (int j = 0; j < VT.length; j+) if (VTj.equals(a) Tj = j;return analysisTableNiTj;/ 判斷MA,a=X->X1X2.Xk/ 把X1X2.Xk推進(jìn)棧/ X1X2.Xk=,不推什么進(jìn)棧protected boolean productionType() if (VNTI() != "") return tru
32、e;return false;/ 推進(jìn)stack棧protected void pushStack() stack.pop();String M = VNTI();String ch;for (int i = (M.length() - 1); i >= 0; i-) ch = String.valueOf(M.charAt(i);stack.push(ch);System.out.printf("%-6d %-20s %6s %-1s->%-12sn", (+count),stack.toString(), strToken.substring(cur, st
33、rToken.length(),topChar, M);/ 主程序public void LL1Analysis() while (flag = true) stackPeek();if (topCharisVT() = true) if (topChar.equals(a) cur+;a = curCharacter();stack.pop();System.out.printf("%-6d %-20s %6s n", (+count),stack.toString(),strToken.substring(cur, strToken.length(); else ERR
34、OR(); else if (topChar.equals("#") if (topChar.equals(a) flag = false; else ERROR(); else if (productionType() = true) if (VNTI().equals("synch") ERROR(); else if (VNTI().equals("") stack.pop();System.out.printf("%-6d %-20s %6s %-1s->%-12sn",(+count), stack.toString(),strToken.substring(cur, strToken.length(), topChar,VNTI(); else pushStack(); else ERROR();/ 出現(xiàn)錯誤protected void ERROR() System.out.println("輸入串出現(xiàn)錯誤,無法進(jìn)行
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 憑祥2022年事業(yè)單位招聘考試模擬試題及答案解析16
- 深圳生物中考試題及答案
- 2026年深圳中考?xì)v史核心素養(yǎng)檢測試卷(附答案可下載)
- 新產(chǎn)品開發(fā)中的市場導(dǎo)向策略
- 2025西藏林芝市生態(tài)環(huán)境局工布江達(dá)縣分局招聘1人備考題庫及參考答案詳解
- 人工智能海洋:AI海洋藍(lán)色經(jīng)濟(jì)新引擎
- 連南農(nóng)商銀行2026校園招聘備考題庫及參考答案詳解一套
- 中國標(biāo)準(zhǔn)化研究院政府管理創(chuàng)新標(biāo)準(zhǔn)化研究所企業(yè)編制職工招聘2人備考題庫及參考答案詳解
- 分道品牌介紹
- 北京市體育局所屬事業(yè)單位招聘100人備考題庫參考答案詳解
- 學(xué)堂在線 雨課堂 學(xué)堂云 唐宋詞鑒賞 期末考試答案
- 2025至2030中國輻射監(jiān)測儀表市場投資效益與企業(yè)經(jīng)營發(fā)展分析報告
- 工程力學(xué)(本)2024國開機(jī)考答案
- 產(chǎn)品認(rèn)證標(biāo)志管理制度
- 廣州西關(guān)大屋介紹
- 基于機(jī)器視覺的SLM金屬3D打印設(shè)備視覺標(biāo)定技術(shù)研究
- CJ/T 192-2017內(nèi)襯不銹鋼復(fù)合鋼管
- GB/T 31907-2025服裝測量方法
- 消毒供應(yīng)中心清洗流程
- 買賣合同爭議仲裁應(yīng)訴答辯書范本
- 北京通州區(qū)事業(yè)單位公開招聘189人高頻重點提升(共500題)附帶答案詳解
評論
0/150
提交評論