《編譯方法》實驗指導書
《《編譯方法》實驗指導書》由會員分享,可在線閱讀,更多相關(guān)《《編譯方法》實驗指導書(35頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 目錄 實驗一 詞法分析器設計 1 【實驗目的】 1 【實驗內(nèi)容】 1 【流程圖】 1 【源代碼】 2 【程序部分截圖】 18 實驗二 LL(1)語法分析程序設計 20 【實驗目的】 20 【實驗內(nèi)容】 20 【實驗步驟和要求】 20 【流程圖】 20 【源代碼】 21 【程序截圖】 32 實驗一 詞法分析器設計 【實驗目的】 1.熟悉詞法分析的基本原理,詞法分析的過程以及詞法分析中要注意的問題。 2.復習高級語言,進一步加強用高級語言來解決實際問題的能力。 3.通過完成詞法分析程序,了解詞法分析的過程。 【實驗內(nèi)容】 用JAVA語言編寫一
2、個PL/0詞法分析器,為語法語義分析提供單詞,使之能把輸入的字符串形式的源程序分割成一個個單詞符號傳遞給語法語義分析,并把分析結(jié)果(基本字,運算符,標識符,常數(shù)以及界符)輸出。 初始化詞法分析器 【流程圖】 調(diào)用語法分析函數(shù) 判斷文字是否讀完 Y Y N 從文本中讀入一行字符,存于一個字符串中 輸出二元組及常數(shù)表,標識符表 N 從字符串中讀出一個字符 程序結(jié)束 字母 符號 判斷為何種字符 不斷讀入,直到出現(xiàn)非數(shù)字符號 看是否有算符或運算符與之匹配 不斷讀入,直到出現(xiàn)非字母或數(shù)字符號 Y
3、N 判斷是否為保留字 將該項插入常數(shù)表中 報錯,出現(xiàn)非法字符 增加一個對應的二元組 Y N 將該項插入標識符表中 增加一個對應的二元組 判斷是否到行尾 【源代碼】 package accidence_analyse; import java.io.*; import java.util.*; import buffer.*; public class AccidenceAnalyser { private java.io.File SourceFile; private jav
4、a.io.File ReserveFile; private java.io.File ClassFile; private java.io.File OutputFile; public Pretreatment pretreatment; public KeyWordTable keyWordTable; public ClassIdentity classIdentity; public Scaner scaner; public ConcreteScanBufferFactory csbFactory; /** * 2) 詞法分析
5、器主程序 */ public AccidenceAnalyser() { System.out.println("[INFOR]已經(jīng)建立詞法分析器!"); } public void initAA() { //創(chuàng)建緩沖工廠 this.csbFactory=newConcreteScanBufferFactory(); //創(chuàng)建字符串掃描對象 scaner = new Scaner(this); //創(chuàng)建pre處理對象 pretreatment=newPretreatment(SourceFile, th
6、is); //創(chuàng)建關(guān)鍵字表對象 keyWordTable= new KeyWordTable(ReserveFile); //創(chuàng)建對象種別碼表對象 classIdentity = new ClassIdentity(ClassFile); System.out.println("[INFOR]已經(jīng)初始化詞法分析器!"); } public void setFilesPath(String reserveFileName, String ClassFileName,String sourceFileName, String outputFi
7、leName) { //創(chuàng)建文件對象 SourceFile = new java.io.File(sourceFileName); //創(chuàng)建文件對象 ReserveFile = new java.io.File(reserveFileName); //創(chuàng)建文件對象 ClassFile = new java.io.File(ClassFileName); //創(chuàng)建文件對象 OutputFile = new java.io.File(outputFileName); //如果文件已經(jīng)存在,先刪除,然后建立新文
8、件 if (OutputFile.exists()) {OutputFile.delete();} try {OutputFile.createNewFile();} catch(Exceptione){e.printStackTrace(System.err);} try { //創(chuàng)建文件隨機讀取對象 ROutputFile = new java.io.RandomAccessFile(this. OutputFile, "rw"); //提示信息 ROutputFile.write("http://///////////////////
9、//////////////////\n".getBytes()); ROutputFile.write( ("http://JAccidenceAnalyser version " + getVersion() +" design by yellowicq//\n").getBytes()); ROutputFile.write("http://java詞法分析器//////////////\n".getBytes()); ROutputFile.write("http://使用java語言開發(fā)///\n".getBytes()); ROutputFile.write("\n".getBy
10、tes()); ROutputFile.write("詞法分析結(jié)果如下:\n".getBytes()); //關(guān)閉文件流 ROutputFile.close(); } catch (Exception e) { e.printStackTrace(System.err); } } public void startAA() { //從預處理開始詞法分析 this.pretreatment.startPretreatment(); } public void outp
11、utAccidence(String outputString) { //把分析出來的單詞寫入文件 outputString="\n[第" + this.pretreatment.fileRow + "行]\n" + outputString; try { //創(chuàng)建文件隨機讀取對象 java.io.RandomAccessFile ROutputFile = new java.io.RandomAccessFile(this.OutputFile, "rw"); //移動指針到文件末尾 ROutputFile
12、.seek(ROutputFile.length()); //Start appending! ROutputFile.write(outputString.getBytes()); //關(guān)閉文件流 ROutputFile.close(); } catch (Exception e) { e.printStackTrace(System.err); } //將分析的單詞結(jié)果輸出到終端 System.out.print(outputString); } public
13、 void controlThread() { //控制掃描器啟動掃描 scaner.controlThread(); } //獲得版本號 public String getVersion() { return "1.0"; } } package accidence_analyse; import java.util.*; import java.io.*; public class ClassIdentity { private Hashtable ClassHash; private File Cla
14、ssFile; private FileReader classFileReader; //讀文件對象 private int TMP_BUFFER_SIZE = 30; /** * 6) 類型種別碼程序 */ public ClassIdentity(java.io.File ClassFile) { System.out.println("[INFOR]類型種別碼表已創(chuàng)建!"); this.ClassFile = ClassFile; } //查找類型種別碼 public int findKey(String c
15、lassWord) { int KEY; for (Enumeration e = this.ClassHash.keys(); e.hasMoreElements(); ) { KEY=Integer.parseInt((String)e.nextElement()); if( ( (String)this.ClassHash.get(Integer.toString(KEY))).equalsIgnoreCase(classWord)) {return KEY;} } return -1; } public void in
16、itClassIdentityTable() { ClassHash = new Hashtable(); //創(chuàng)建hash表 int intLength; char[] chrBuffer = new char[TMP_BUFFER_SIZE]; String classWord; int classCounter = 0; try { if (ClassFile.exists()) { //文件存在 //創(chuàng)建讀文件對象 classFileReader=newjava.io.FileReade
17、r(ClassFile); //讀文件內(nèi)容到hash表 while((intLength=classFileReader.read(chrBuffer)) != -1) { classCounter++; //填寫hash表 classWord = String.valueOf(chrBuffer).trim(); System.out.println("[INFOR]讀取類型種別碼: [KEY: " + classCounter + "][VALUE: " + classWord +
18、 "]"); this.ClassHash.put(Integer.toString(classCounter), classWord); } //關(guān)閉讀文件對象 classFileReader.close(); } else { //文件不存在 System.err.println("[ERROR]類型種別碼文件不存在!"); } } catch (Exception e) { e.printStackTrace(System.err)
19、; } } } package accidence_analyse; import java.util.*; import java.io.*; public class KeyWordTable { private Hashtable KWHash; private File ReserveFile; private FileReader resFileReader; //讀文件對象 private int TMP_BUFFER_SIZE = 30; /** * 5) 表留字表程序 */ public KeyW
20、ordTable(java.io.File ReserveFile) { System.out.println("[INFOR]關(guān)鍵字表已創(chuàng)建!"); this.ReserveFile = ReserveFile; } public boolean isKeyWord(String inw) { String resWord; //查找hash表 for (Enumeration e = this.KWHash.elements(); e.hasMoreElements(); ) { resWord = (String
21、) e.nextElement(); if (resWord.equalsIgnoreCase(inw)) { return true; } } return false; } public void initKeyWordTable() { KWHash = new Hashtable(); //創(chuàng)建hash表 int intLength; char[] chrBuffer = new char[TMP_BUFFER_SIZE]; String resWord; i
22、nt resCounter = 0; try { if (ReserveFile.exists()) { //文件存在 //創(chuàng)建讀文件對象 resFileReader = new java.io.FileReader(ReserveFile); //讀文件內(nèi)容到hash表 while((intLength = resFileReader.read(chrBuffer))!= -1) { resCounter++; //填寫hash表 resWord = String.valueOf(chr
23、Buffer).trim(); System.out.println("[INFOR]讀取關(guān)鍵字: [INDEX: " + resCounter +"][VALUE: " + resWord + "]"); this.KWHash.put(Integer.toString(resCounter), resWord);} //關(guān)閉讀文件對象 resFileReader.close(); } else { //文件不存在 System.err.println("[ERROR]保留字文件不存在!
24、"); } } catch (Exception e) { e.printStackTrace(System.err); } } } package accidence_analyse; import javax.xml.parsers.*; import org.w3c.dom.*; public class main { /** * 1) 詞法分析器引導文件 */ public static void main(String[] args) { //讀取配置文件,得到系統(tǒng)
25、屬性 String cfgString[] = new String[4]; try { cfgString = main.loadAACfg("d:\\aaCfg.xml"); } catch (Exception e) { e.printStackTrace(System.err); } //設置待讀文件名 //保留字表文件 String reserveFileName = cfgString[0]; //類型種別碼表文件 String classFileName = c
26、fgString[1]; //需要分析的源文件 String sourceFileName = cfgString[2]; //輸出文件 String outputFileName = cfgString[3]; //創(chuàng)建詞法分析器 AccidenceAnalyser aa=new AccidenceAnalyser(); aa.setFilesPath(reserveFileName, classFileName, sourceFileName,outputFileName); //建立所需要的文件對象 //初始化詞
27、法分析器 aa.initAA(); //初始化關(guān)鍵字表 aa.keyWordTable.initKeyWordTable(); //初始化類型種別碼表 aa.classIdentity.initClassIdentityTable(); //開始進行詞法分析 aa.startAA(); //分析完畢 } //讀取配置文件 private static String[] loadAACfg(String name) throws Exception { String cfgString[]
28、 = new String[4]; /*解析xml配置文件*/ try { /*創(chuàng)建文檔工廠*/ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); /*創(chuàng)建文檔解析器*/ DocumentBuilder builder = factory.newDocumentBuilder(); /*解析配置文件*/ Document doc = builder.parse(name); /*規(guī)范化文
29、檔*/ doc.normalize(); /*查找接點表*/ NodeList nlists = doc.getElementsByTagName("FilePath"); for (int i = 0; i < nlists.getLength(); i++) { Element item = (Element) nlists.item(i); //取得需要的配置屬性 cfgString[0] = item.getElementsByTagName("ReserveFileName"
30、).item(0).getFirstChild().getNodeValue().trim(); cfgString[1] = item.getElementsByTagName("ClassFileName").item(0). getFirstChild().getNodeValue().trim(); cfgString[2] = item.getElementsByTagName("SourceFileName").item(0). getFirstChild().getNodeValue().trim();
31、 cfgString[3] = item.getElementsByTagName("OutputFileName").item(0). getFirstChild().getNodeValue().trim(); } } catch (Exception e) { e.printStackTrace(); throw new Exception("[ERROR]加載配置文件 " + name + " 錯誤!"); } //返回屬性數(shù)組 return cfgStri
32、ng; } } package accidence_analyse; import java.io.*; import buffer.*; public class Pretreatment { private String tmpString; private String outputString; private int BUFFER_SIZE = 100; private AccidenceAnalyser aa; public InputBuffer inputBuffer; //輸入緩沖區(qū)--共享 private
33、java.io.File SourceFile; //文件對象 private java.io.RandomAccessFile randomAFile; //隨機文件對象 public static int fileRow = 0; /** * 3) 預處理子程序 */ public Pretreatment(File SourceFile, AccidenceAnalyser aa) { try { this.SourceFile = SourceFile; this.randomAFile = new java
34、.io.RandomAccessFile(this.SourceFile, "r"); } catch (FileNotFoundException e) { e.printStackTrace(System.err); } this.aa = aa; inputBuffer = aa.csbFactory.createInputBuffer(BUFFER_SIZE); System.out.println("[INFOR]預處理器已經(jīng)創(chuàng)建!"); } public void putSourceToINBuf
35、fer(String tmpString) { this.inputBuffer.Data = tmpString.toCharArray(); } public void putFinToSCBuffer(String filtratedString) { aa.scaner.scanBuffer.Data = filtratedString.toCharArray(); } public void controlThread() { int intLength; int resCounter = 0; String
36、tmpString; String filtratedString; System.out.println("[INFOR]開始單詞分析////////////////////////////////////////"); try { if (SourceFile.exists()) { //文件存在 //讀文件內(nèi)容到緩沖區(qū) while ( (tmpString = this.randomAFile.readLine()) != null) { ++fileRow; //
37、分割符 System.out.println("...................begin row " + this.fileRow + "......................."); //開始這一行分析 System.out.println("[INFOR]正在處理行: " + String.valueOf(fileRow)); //放入輸入緩沖區(qū) this.putSourceToINBuffer(tmpStr
38、ing); //處理字符串 filtratedString = this.filtrateSource(this.inputBuffer.Data); System.out.println("[INFOR]已過濾句子: " + filtratedString); //放入掃描緩沖區(qū) this.putFinToSCBuffer(filtratedString); aa.controlThread(); } System.out.p
39、rintln( "[INFOR]分析完畢////////////////////////////////////////////"); } else { //文件不存在 System.err.println("[ERROR]源文件不存在!"); } } catch (Exception e) { e.printStackTrace(System.err); } } public String filtrateSource(char[] Data) {
40、 String filtratedString = String.valueOf(Data).trim(); return filtratedString; } public void startPretreatment() { this.controlThread(); } } package accidence_analyse; import buffer.*; public class Scaner { public ScanBuffer scanBuffer; //掃描緩沖區(qū)--共享 private String
41、finalAccidence; private AccidenceAnalyser aa; private int BUFFER_SIZE = 100; private String toDelString; private int senLength = 0; private char[] sentenceChar = new char[1000]; private String TOKEN; private char CHAR; private int index = 0; private String IDENTITY = "iden
42、tity"; private String DIGIT = "digit"; private String WORD_ERROR_INF = "在此行發(fā)現(xiàn)不能識別的單詞,此行分析終止!"; private boolean ASTATE = true; /** * 4) 掃描子程序 */ public Scaner(AccidenceAnalyser aa) { this.aa = aa; initBuffer(); this.finalAccidence = ""; System.out.println("[
43、INFOR]掃描處理器已經(jīng)創(chuàng)建!"); } public String readFromBuffer(char[] Data) { String toDelString = String.valueOf(Data); return toDelString; } public String scan(String toDelString) { sentenceChar = toDelString.toCharArray(); this.senLength = sentenceChar.length; int i = 0;
44、 //分析單詞 while (this.index <= this.senLength) { //state0: this.TOKEN = ""; this.CHAR = GETBC(sentenceChar); if (this.CHAR == ';') { break; //';'表示這一行結(jié)束 } //進入狀態(tài)判斷 switch (this.CHAR) { //judge letter case 'a':case 'b':case 'c
45、':case 'd':case 'e':case 'f':case 'g':case 'h':case 'i':case 'j':case 'k': case 'l':case 'm':case 'n':case 'o':case 'p':case 'q':case 'r':case 's':case 't':case 'u':case 'v':case 'w':case 'x':case 'y': case 'z':case 'A':case 'B':case 'C':case 'D':case 'E':case 'F':case 'G':case 'H':case 'I':case '
46、J':case 'K':case 'L':case 'M': case 'N':case 'O':case 'P':case 'Q':case 'R':case 'S':case 'T':case 'U':case 'V':case 'W':case 'X':case 'Y':case 'Z': //do this.TOKEN = this.CONTACT(TOKEN, CHAR); //state1 CHAR = this.GETCHAR(sentenceChar); while
47、(this.ISLETTER(CHAR) || this.ISDIGIT(CHAR)) { this.TOKEN = this.CONTACT(this.TOKEN, CHAR); CHAR = this.GETCHAR(sentenceChar); } this.RETRACT(); //state2 if (aa.keyWordTable.isKeyWord(TOKEN)) { this.finalAccidence = th
48、is.finalAccidence + "[保留字] " + this.returnAWord(TOKEN) + "\n"; } else { this.finalAccidence = this.finalAccidence + "[標識符] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(IDENTITY))
49、 + "\n"; } //clear up token this.TOKEN = ""; break; //judge ditital case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8': case '9': //do this.TOKEN = this.CONTACT(TOKEN, CHAR);
50、 //state3 CHAR = this.GETCHAR(sentenceChar); while (this.ISDIGIT(CHAR)) { this.TOKEN = this.CONTACT(TOKEN, CHAR); CHAR = this.GETCHAR(sentenceChar); } this.RETRACT(); //state4 this.finalAccidence = this.fina
51、lAccidence + "[數(shù)字] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(DIGIT)) + "\n"; //clear up token this.TOKEN = ""; break; case '=': //state5 this.TOKEN = this.CONTACT(TOKE
52、N, CHAR); this.finalAccidence = this.finalAccidence + "[等號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; //clear up token this.TOKEN = ""; break
53、; case '+': //state6 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[加號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
54、 "\n"; //clear up token this.TOKEN = ""; break; case '*': //state7 this.TOKEN = this.CONTACT(TOKEN, CHAR); CHAR = this.GETCHAR(sentenceChar); //state8 if (CHAR == '*') { this.TOKEN = this
55、.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[乘方] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; } //state9 else {
56、 this.finalAccidence = this.finalAccidence + "[乘號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; } //clear up token this.TOKEN = "";
57、 break; case ',': //state10 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[逗號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) +
58、 "\n"; //clear up token this.TOKEN = ""; break; case '(': //state11 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[左括號] " + this.returnAWord(TOKEN) + "[種別碼]
59、 " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; //clear up token this.TOKEN = ""; break; case ')': //state12 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidenc
60、e = this.finalAccidence + "[右括號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; //clear up token this.TOKEN = ""; break; case '{': //stat
61、e13 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[左大括號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; //clear up tok
62、en this.TOKEN = ""; break; case '}': //state14 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[右大括號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIde
63、ntity.findKey(String.valueOf(CHAR))) + "\n"; //clear up token this.TOKEN = ""; break; case '[': //state15 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[左中括號] " +
64、 this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; //clear up token this.TOKEN = ""; break; case ']': //state16 this.TOKEN = this.CONTACT(TOKE
65、N, CHAR); this.finalAccidence = this.finalAccidence + "[右中括號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; //clear up token this.TOKEN = ""; bre
66、ak; case '.': //state17 this.TOKEN = this.CONTACT(TOKEN, CHAR); this.finalAccidence = this.finalAccidence + "[點號] " + this.returnAWord(TOKEN) + "[種別碼] " + String.valueOf(aa.classIdentity.findKey(String.valueOf(CHAR))) + "\n"; //clear up token this.TOKEN = ""; break; default: //state18 this.TOKEN = this.CONTACT(this.TOKEN, this.CHAR); //
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應急救援安全知識競賽試題
- 1 礦井泵工考試練習題含答案
- 2煤礦爆破工考試復習題含答案
- 1 各種煤礦安全考試試題含答案