編譯原理實驗報告冊_第1頁
編譯原理實驗報告冊_第2頁
編譯原理實驗報告冊_第3頁
編譯原理實驗報告冊_第4頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、編譯原理實驗報告專業(yè) :軟件工程班級 :2013級3 班學(xué)號 :姓名 :雷濤2015 至 2016 學(xué)年 第 2 學(xué)期計算機科學(xué)學(xué)院實驗報告說明本課程實驗從開課學(xué)期第9 周開始,每周 2 學(xué)時上機實驗課,第16 周結(jié)束,其中第 16 周為實驗檢測,共14 學(xué)時。除統(tǒng)一安排的時間外,學(xué)生還可根據(jù)自己的實際適當(dāng)安排課余時間上機。實驗課注意事項如下:(1)每次實驗前學(xué)生必須充分準(zhǔn)備每次的實驗內(nèi)容, 以保證每次上機實驗的效果。實驗過程中必須 獨立完成。(2)每次實驗課將 考勤,并作為實驗成績的重要依據(jù)。(3)每次實驗完成后,及時撰寫實驗報告并交實驗指導(dǎo)老師批閱。(4)實驗報告中學(xué)生必須填寫【實驗地點】

2、、【實驗時間】、【實驗過程】以及【實驗總結(jié) 】,注意:必須 手寫完成,并獨立撰寫實驗總結(jié),嚴(yán)禁抄襲。( )每次實驗完成后,請將實驗結(jié)果發(fā)送到 教師指定郵箱()。5(6)學(xué)期結(jié)束時,每位同學(xué)應(yīng)將自己的實驗報告冊交各班級班長或?qū)W習(xí)委員,由班長或?qū)W習(xí)委員以班級為單位、按學(xué)號從小到大排列 好統(tǒng)一交給實驗指導(dǎo)老師,否則無實驗成績。附 實驗成績登記表實驗名稱實驗一實驗二實驗成績實驗名稱:一個簡單詞法分析器的設(shè)計與實現(xiàn)指導(dǎo)教師:劉麗娟實驗地點:新實驗樓項目一實驗室實驗日期:2016 年 5月 10 日成績:實驗?zāi)康模? 了解詞法分析的任務(wù);2 掌握詞法分析程序的工作流程。實驗內(nèi)容:定義模擬的簡單語言的詞法構(gòu)

3、成,編制詞法分析程序,要求將用模擬語言書寫的源程序進(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)鍵字 :publicclassKeyWords publicStri

4、ngkeyWord ="" ;publicKeyWords (StringkeyWord ) this. keyWord =keyWord ;publicString toString() returnthis. keyWord ;/*列舉寫關(guān)鍵字 */public static final KeyWords and = new KeyWords( "&&" ), or = new KeyWords( "|" ), equal = new KeyWords ( "=" For = new KeyWo

5、rds( "for" ), Do = new KeyWords( "do" ),),privatestaticList<KeyWords>keyWordsLists=newArrayList<KeyWords>();/*/publicstatic List<KeyWords> getKeyWordsLists() keyWordsLists.add(and );keyWordsLists.add(or );keyWordsLists.add(equal );keyWordsLists.add(For );keyWord

6、sLists.add(Do);returnkeyWordsLists;:publicclassDataTypeextendspublicStringdataType ="" ;publicDataType(Strings) super ( s);this. dataType =s;KeyWords/*/publicstaticfinalDataTypeInt=new DataType("int"),Float=new DataType("float"),privatestaticList<DataType>dataType

7、Lists=newArrayList<DataType>();/*/publicstaticList<DataType> getDataTypeLists() dataTypeLists.add(Boolean );dataTypeLists.add(Float);returndataTypeLists;publicString toString() returnthis. dataType ;詞法分析引擎:publicclassLexicalAnalysis /*下一個讀入字符*/charnextChar=' '/*將 KeyWords 對象裝在 ha

8、shMap中privateHashMap<String, String>*/keyWords =new HashMap<String,String>();/*將 DataTypes對象裝在hashMap 中 */privateHashMap<String, String>dataTypes=new HashMap<String,String>();/* token序列(遍歷過程中所有字符串的分割列表, 以便于保存到文件中) */privateList<String>tokenLists=new LinkedList<String

9、>();/*讀取文件變量*/BufferedReaderreader=null;/*保存當(dāng)前是否讀取到了文件的結(jié)尾*/privateBooleanisEnd=false;/*記錄行號*/publicstaticintlineNum= 1;/*將保存 keyWords 對象保存到 HashMap中便于查詢voidreserve(KeyWordsw) keyWords .put(w. keyWord ,w.toString();( 其實 key=value) */* 裝數(shù)據(jù)類型 */voidreservedataTypes(DataType dataTypes .put( d. dataTy

10、pe,d) d.toString();/*構(gòu)造函數(shù)中將關(guān)鍵字和類型添加到hashtable words中*/publicLexicalAnalysis(StringfilePath) /*初始化讀取文件變量*/tryreader=new BufferedReader(new FileReader(filePath);/讀入文件catch(IOExceptionSystem. out .print(e) e);/*關(guān)鍵字對象*/List<KeyWords>list1= KeyWords.getKeyWordsLists();for(KeyWordsk :list1) this.res

11、erve(k);/*數(shù)據(jù)類型 */List<DataType>list= DataType.getDataTypeLists();for(DataTypedataType:list) this.reserve(dataType);this.reservedataTypes(dataType );publicvoidreadChar()throws IOException /*這里應(yīng)該是使用的是*/nextChar= (char)reader.read();if( int) nextChar= 0xffff) / 標(biāo)志文件已讀完this. isEnd=true ;public Boo

12、lean readChar( char ch ) throws IOException readChar();if( this. nextChar!=ch ) returnfalse;this. nextChar=' 'returntrue ;publicvoidscan()throwsIOException /*for消除空白 */(; readChar() if( nextChar=' '|nextChar='t'continue;elseif( nextChar='n') tokenLists.add(" 第 -&

13、quot;+lineNum+lineNum=lineNum+ 1;elsebreak ;"-) 行" );/*下面開始分割關(guān)鍵字,標(biāo)識符等信息*/switch( nextChar) /*對于 =, >=, <=, !=的區(qū)分使用狀態(tài)機實現(xiàn)*/case'=':if(readChar('=') tokenLists.add("="+" -KeyWords");break ;elsetokenLists.add("="+ "-KeyWords");break

14、 ;case'>':if(readChar('=') tokenLists.add(">="+" -KeyWords"break ;elsetokenLists.add(">"+ "-KeyWords"););break ;caseif'<':(readChar('=') tokenLists.add("<="+" -KeyWords");break ;elsetokenLists.

15、add("<"+ "-KeyWords");break ;case'!':if(readChar('=') tokenLists.add("!="+" -KeyWords"break ;elsetokenLists.add("!"+ "-KeyWords"););break ;caseif'(':(readChar(tokenListsbreak ;'(' ) .add( "("+&qu

16、ot;-KeyWords");case')':if(readChar(')') tokenLists.add(")"+"-KeyWords");break ;/* 下面是對數(shù)字的識別, 根據(jù)文法的規(guī)定的話, 這里的 數(shù)字只要是能夠識別整數(shù)就行 isDigit 確定指定字符( Unicode 代碼點)是否為數(shù)字。*/if(Character.isDigit( nextChar) intvalue= 0;do value= 10 *value+ Character.digit( nextChar, 10);readC

17、har();while(Character.isDigit( nextChar);tokenLists.add( value+" -Number"return;);/*關(guān)鍵字或者是標(biāo)識符的識別isLetter確定指定字符是否為字母*/if(Character.isLetter( nextChar) StringBuffersb =new StringBuffer();/*首先得到整個的一個分割*/do sb .append(nextChar);readChar();while(Character.isLetterOrDigit( nextChar);/ isLetterOr

18、Digit確定指定字符是否為字母或數(shù)字/*判斷是關(guān)鍵字還是標(biāo)識符*/Strings =sb .toString();Stringdatatype=dataTypes.get(s);/*如果是關(guān)鍵字或者是類型的話,w不應(yīng)該是空的*/if( s !=null) if( datatype!= null) tokenLists.add(datatype+"-DataType");return;tokenListsreturn;/*.add(s);說明是關(guān)鍵字或者是類型名*/*否則就是一個標(biāo)識符id */tokenLists.add( s);keyWords .put(s,s);re

19、turn;/* nextChar中的任意字符都被認(rèn)為是詞法單元返回*/if(int )nextChar!= 0xffff)tokenLists.add( nextChar+"" );nextChar=''return;/*是否讀取到文件的結(jié)尾*/publicBoolean getReaderState() returnthis. isEnd ;/*保存 Tokens */publicvoidsaveTokens()throwsIOException FileWriterwriter=new FileWriter("Tokens 表 .txt&quo

20、t;);writer.write(" 符號 符號類型信息 n");writer.write("rn");for( inti = 0;i <tokenLists.size(); +i ) Stringtok= (String)tokenLists.get(i );/*寫入文件 */writer.write(tok +"rn");writer.flush();writer.close();主方類 :publicclassMain publicstaticvoidmain(Stringargs )throwsIOException S

21、tringfilePath="D:/Lexer.java"LexicalAnalysislexicalAnalysis=new LexicalAnalysis(filePath);while( lexicalAnalysis.getReaderState() =false) lexicalAnalysis.scan();/*保存相關(guān)信息*/lexicalAnalysis.saveTokens();System. out .println(" 詞法分析完畢 " );遇到的問題 :1, 字符的讀取2, 關(guān)鍵字的讀取解決的方法 :上網(wǎng)查詢資料實驗結(jié)果截圖 :熟

22、練完成(無錯誤) ,對應(yīng)級別 A實驗總結(jié)實驗評價(學(xué)生)基本完成(有錯誤) ,對應(yīng)級(教師)別 B請手工填部分完成(部分沒做) ,對應(yīng)對應(yīng)后面寫級別 C打“”沒有做(與題目無關(guān)、 空白),記 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é)果?;疽?/p>

23、求:1寫出實驗步驟;2寫出實驗中遇到的問題及解決的方法。實驗步驟 :1, 根據(jù)文法構(gòu)造 LL(1) 分析表2, 編寫分析程序主要代碼 :publicclassLL1 / 文法/ (1)E->TG/ (2)G->+TG|-TG/ (3)G- >/ (4)T->FS/ (5)S->*FS|/FS/ (6)S- >/ (7)F->(E)/ (8)F->ipublicLL1(Stringstr) super ();strToken=new StringBuilder(str);/ LL(1)分析表privateString "TG"

24、,"" ,analysisTable "" , "TG" ,"" ,=new String "","","","","+TG","","" ," ","-TG", "" , " ","FS", "","" ,"FS",&

25、quot;","", "", "",""," ","*FS",""," ", " ", "/FS" , " ","i","" ,"","(E)","","", "", "" ;/ 存儲終結(jié)符privateStr

26、ingVT =new String "i","+" ,"*","(",")","-", "/", "#"/ 存儲終結(jié)符privateStringVN =new String "E" ,"G" ,"T" ,"S" ,"F"/ 輸入串privateStringBuilderstrToken;/ 分析棧privateStack<Strin

27、g>stack=new Stack<String>();/ a 保存從輸入串中讀取的一個輸入符號,當(dāng)前符號privateStringa =null;/ topChar中保存 stack棧頂符號privateStringtopChar=null;/ flag標(biāo)志預(yù)測分析是否成功privatebooleanflag=true;/ 記錄輸入串中當(dāng)前字符的位置privateintcur = 0;/ 記錄步數(shù)privateintcount= 0;/* 初始化 */protectedvoidinit() strToken.append(stack.push("#" )

28、;System. out .printf("#" );"%-9s %-38s %6s %-20sn","步驟"," 符號棧" ,"輸入串"," 所用產(chǎn)生式 " );stack .push( "E" ); curCharacter();System. out .printf("%-6d %-20s %6s n",strToken.substring(cur ,strTokencount ,stack.length();.toString(

29、),/* 讀取當(dāng)前棧頂符號*/protectedString stackPeek() topChar=stack .peek();returntopChar ;/* 返回輸入串中當(dāng)前位置的字母*/privateString curCharacter() a = String.valueOf( strToken.charAt(cur );returna;/* 判斷 topChar 是否是終結(jié)符 */protectedbooleantopCharisVT() for( inti = 0;i < (VT. length- 1);i +) if( VT i .equals(topChar ) r

30、eturntrue ;returnfalse;/* 查找 topChar 在非終結(jié)符中分析表中的橫坐標(biāo)protectedString VNTI() intNi = 0,Tj = 0;for( inti = 0;i <VN. length;i +) if( VN i .equals(topChar ) Ni =i ;*/for( intj = 0;j <VT. length;j +) if( VT j .equals(a) Tj =j ;returnanalysisTable Ni Tj ;/ 判斷 MA,a=X->X1X2.Xk/ 把 X1X2.Xk 推進(jìn)棧/ X1X2.Xk

31、=,不推什么進(jìn)棧protectedbooleanproductionType() if(VNTI() !="" ) returntrue;returnfalse;/ 推進(jìn) stack 棧protectedvoidpushStack() stack.pop();StringM = VNTI();Stringch ;for( inti = (M.length() - 1);ch = String.valueOf( M.charAt(stack .push(ch );i >= 0;i );i -) strTokenSystem. out .printf("%-6d

32、 %-20s %6s %-1s->%-12sn"stack .toString(),strToken.substring(.length(),topChar ,M);cur , (+count ),/主程序publicvoidLL1Analysis() while( flag=true) stackPeek();if(topCharisVT() =true ) if( topChar .equals(a) cur +;a = curCharacter();stack .pop();System. out .printf("%-6d %-20s %6s n",

33、 (+count ),stack .toString(),strToken.substring(cur ,strToken.length();elseERROR();elseif( topChar .equals(if( topChar .equals(a) flag=false;elseERROR();"#" ) elseif(productionType() =true ) if(VNTI().equals("synch") ERROR();elseif(VNTI().equals(" ") stack .pop();System. out .printf("%-6d %-20s %6s %-1s->%-12sn",(+ count ),stack .toString(),strToken.substring(cur ,strToken.length(),topChar ,VNTI();elsepushStack()

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論