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