编译原理:词法分析实验报告
生活随笔
收集整理的這篇文章主要介紹了
编译原理:词法分析实验报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
詞法分析實驗報告
文章目錄
- 詞法分析實驗報告
- 一、實驗目的
- 二、實驗原理
- 三、實驗要求
- 四、實驗步驟(利用Java語言來進行詞法分析)
- ① 待分析的語言詞法
- ② 單詞符號對應的種別碼
- ③ 詞法分析程序流程圖
- ④ 編寫程序(見源程序代碼文件)
- ⑤ 測試結果(見輸入輸出文件)
- 五、運行結果分析
一、實驗目的
設計、編制并調試一個詞法分析程序,加深對詞法分析原理的理解。
二、實驗原理
詞法分析程序的基本任務是從字符串表示的源程序中識別出具有獨立意義的單詞符號,其基本思想是根據掃描到單詞符號的第一個字符的種類,拼出相應的單詞符號。
三、實驗要求
- 1、寫出某個語言的詞法分析程序,要求能識別出關鍵字,標識符,常數,運算符和分界符等常用語言單詞符號。
- 2、詞法分析程序的輸入為文件格式(包含要分析的源程序),輸出為文件格式(單詞符號的二元組序列)。
- 3、空格有空白、制表符和換行符組成。空格一般用來分隔ID、SUM、運算符、界符和關鍵字,詞法分析階段通常被忽略。
- 4、對詞法分析程序的每個函數給出注釋,說明函數的主要功能。針對代碼中的關鍵部分適當給出注釋解釋。
四、實驗步驟(利用Java語言來進行詞法分析)
① 待分析的語言詞法
(1)關鍵字: int short long char class finally public
(2)運算符和界符:* / + - = ; ( ) : := > >= < <= #
(3)其他單詞是標識符 (ID) 和整型常數 (NUM),通過以下正規式定義:
(4)空格由空白字符組成,用來分隔ID,NUM,運算符,界符和關鍵字,詞法分析階段通常被忽略。
② 單詞符號對應的種別碼
| int | 1 | - | 23 |
| short | 2 | = | 24 |
| long | 3 | ; | 25 |
| char | 4 | ( | 26 |
| class | 5 | ) | 27 |
| finally | 6 | : | 28 |
| public | 7 | := | 29 |
| l(l|d)* | 10 | > | 30 |
| dd* | 11 | >= | 31 |
| * | 20 | < | 32 |
| / | 21 | <= | 33 |
| + | 22 | # | 0 |
③ 詞法分析程序流程圖
④ 編寫程序(見源程序代碼文件)
import java.io.*; import java.util.ArrayList; import java.util.List;public class Analyse {public static void main(String[] args) throws IOException {//指定關鍵字String[] KeyWords = {"int", "short", "long", "char", "class", "finally","public"};//讀入要輸入的程序文件BufferedReader reader =new BufferedReader(new InputStreamReader(new FileInputStream("E://reader.txt")));//輸出結果文件BufferedWriter writer =new BufferedWriter(new OutputStreamWriter(new FileOutputStream("E://writer.txt")));//將文件的第一行生成字符串String string = reader.readLine();//限制字符串的最大值final int length = 100;//給要分析的數據創建一個字符型數組char[] chars = new char[length];//索引值int Index = 0, key = 0;//集合存儲數據List mylist = new ArrayList();System.out.println("詞法分析的結果如下:");do {String strs = null;char t = string.charAt(Index);mylist = Check(t, chars, KeyWords, string, Index, strs);if (mylist.size() == 0) {Index++;continue;}//規定List的第一個元素為Index,第二個元素為keyIndex = Integer.parseInt((String) mylist.get(0));key = Integer.parseInt((String) mylist.get(1));String words = (String) mylist.get(2);writer.write("(" + words + " , \t"+ key + ")");writer.newLine();writer.flush();System.out.println("(" + words + " , \t"+ key + ")");} while (key != 0); }/**** @param t* @param chars* @param KeyWords* @param string* @param Index* @param strs* @return*/ public static List Check(char t, char[] chars, String[] KeyWords, String string, int Index, String strs) {int keyId = -1, find = 0;List mylist = new ArrayList();/** 第一部分:掃描分類:關鍵字,數非關鍵字,數字,關系運算符*///判斷下一個讀入的字符是否為空格,若讀取到空格則跳過,提取下一個字符進行判斷while (t != ' ') { //t是掃描到的臨時字符//判斷當前字符是字母或者數字和字母的組合if (t >= 'a' && t <= 'z') {// 當讀取到不是大小寫字母或者數字時候判斷為一個單詞讀取完成while (t >= 'a' && t <= 'z' || t >= 'A' && t <= 'Z' || t >= '0' && t <= '9') {chars[find++] = t;strs += t + "";t = string.charAt(++Index);//讀取下一個}// 與讀取出來的字符判斷是否為關鍵字strs = strs.substring(4);//這里的i限制對應指定關鍵字的數組大小for (int i = 0; i < 7; i++) {if (strs.equals(KeyWords[i])) {keyId = i + 1;mylist.add(Index + "");mylist.add(keyId + "");mylist.add(strs);return mylist;}}//若為非關鍵字就當作為標識符keyId = 10;mylist.add(Index + "");mylist.add(keyId + "");mylist.add(strs);return mylist;}//判斷當前字符是否為數字else if (t >= '0' && t <= '9') {find = 0;String tTokens = null;// 對后面的字符進行判斷是否為數字while (t >= '0' && t <= '9') {chars[find++] = t;tTokens += t;t = string.charAt(++Index);}// 不是數字則返回種別碼,結束當前方法keyId = 11;tTokens = tTokens.substring(4);mylist.add(Index + "");mylist.add(keyId + "");mylist.add(tTokens + "");return mylist;}find = 0;/** 第二部分:掃描分類:關系運算符*///判斷當前字符是否為其他關系運算符String token = null;switch (t) {case '>':chars[find++] = t;token += t;if (string.charAt(++Index) == '=') {keyId = 31;chars[find++] = t;token += string.charAt(Index++);} else {keyId = 30;}mylist.add(Index + "");mylist.add(keyId + "");token = token.substring(4);mylist.add(token);return mylist;case '<':chars[find++] = t;token += t;if (string.charAt(++Index) == '=') {chars[find++] = t;keyId = 33;token += string.charAt(Index++);} else {keyId = 32;}mylist.add(Index + "");mylist.add(keyId + "");token = token.substring(4);mylist.add(token);return mylist;case ':':chars[find++] = t;token += t;if (string.charAt(++Index) == '=') {keyId = 29;chars[find++] = string.charAt(Index);token += string.charAt(Index++);} else {keyId = 28;}mylist.add(Index + "");mylist.add(keyId + "");token = token.substring(4);mylist.add(token);return mylist;case '*':keyId = 20;break;case '/':keyId = 21;break;case '+':keyId = 22;break;case '-':keyId = 23;break;case '=':keyId = 24;break;case ';':keyId = 25;break;case '(':keyId = 26;break;case ')':keyId = 27;break;case '#':keyId = 0;break;default:keyId = -1;break;}chars[find++] = t;mylist.add(++Index + "");mylist.add(keyId + "");mylist.add(t + "");return mylist;}return mylist;} }⑤ 測試結果(見輸入輸出文件)
五、運行結果分析
打開包含源程序的文件,截圖:
經過詞法分析處理后,打開輸出文件,截圖:
通過文件輸入:
分析結果:
六、總結
剛開始寫實驗的時候確實無從下手,后面通過看書和查閱資料了解大概,然后開始嘗試寫步驟、流程和程序,漸入佳境。
通過這次實驗讓我對詞法分析的理解更深了一步,這也是做實驗和學習這門課程的目的所在。一步步完善實驗的過程也是在增強自己的知識。
- 不足:應該改善程序能識別更多的無相關字符,空白字符,如轉行字符等。
- 優點:測試階段階段做得比較詳細
總結
以上是生活随笔為你收集整理的编译原理:词法分析实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的三年自学深度学习之路
- 下一篇: 五点三次平滑滤波在消除随机噪声中的应用以