日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编译原理:词法分析实验报告

發(fā)布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编译原理:词法分析实验报告 小編覺得挺不錯的,現(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)的種別碼

單詞符號種別碼單詞符號種別碼
int1-23
short2=24
long3;25
char4(26
class5)27
finally6:28
public7:=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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。