江蘇科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告73頁_第1頁
江蘇科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告73頁_第2頁
江蘇科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告73頁_第3頁
江蘇科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告73頁_第4頁
江蘇科技大學(xué)編譯原理實(shí)驗(yàn)報(bào)告73頁_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、實(shí)驗(yàn)一 詞法分析設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康耐ㄟ^本實(shí)驗(yàn)的編程實(shí)踐,使學(xué)生了解詞法分析的任務(wù),掌握詞法分析程序設(shè)計(jì)的原理和構(gòu)造方法,使學(xué)生對編譯的基本概念、原理和方法有完整的和清楚的理解,并能正確地、熟練地運(yùn)用。二、實(shí)驗(yàn)內(nèi)容用VC+/VB/JAVA語言實(shí)現(xiàn)對C語言子集的源程序進(jìn)行詞法分析。通過輸入源程序從左到右對字符串進(jìn)行掃描和分解,依次輸出各個(gè)單詞的內(nèi)部編碼及單詞符號自身值;若遇到錯(cuò)誤則顯示“Error”,然后跳過錯(cuò)誤部分繼續(xù)顯示 ;同時(shí)進(jìn)行標(biāo)識符登記符號表的管理。以下是實(shí)現(xiàn)詞法分析設(shè)計(jì)的主要工作:(1)從源程序文件中讀入字符。(2)統(tǒng)計(jì)行數(shù)和列數(shù)用于錯(cuò)誤單詞的定位。(3)刪除空格類字符,包括回車、制表符

2、空格。(4)按拼寫單詞,并用(內(nèi)碼,屬性)二元式表示。(屬性值token的機(jī)內(nèi)表示)(5)如果發(fā)現(xiàn)錯(cuò)誤則報(bào)告出錯(cuò)(6)根據(jù)需要是否填寫標(biāo)識符表供以后各階段使用。單詞的基本分類:u 關(guān)鍵字:由程序語言定義的具有固定意義的標(biāo)識符。也稱為保留字例如 if、 for、while、printf ; 單詞種別碼為1。u 標(biāo)識符:用以表示各種名字,如變量名、數(shù)組名、函數(shù)名;u 常數(shù): 任何數(shù)值常數(shù)。如 125, 1,0.5,3.1416;u 運(yùn)算符:+、-、*、/;u 關(guān)系運(yùn)算符: 、=、;u 分界符: ;、,、(、)、;三、詞法分析實(shí)驗(yàn)設(shè)計(jì)思想及算法 1、主程序設(shè)計(jì)考慮:u 程序的說明部分為各種表格和變量

3、安排空間。在具體實(shí)現(xiàn)時(shí),將各類單詞設(shè)計(jì)成結(jié)構(gòu)和長度均相同的形式,較短的關(guān)鍵字后面補(bǔ)空。 k數(shù)組-關(guān)鍵字表,每個(gè)數(shù)組元素存放一個(gè)關(guān)鍵字(事先構(gòu)造好關(guān)鍵字表)。s 數(shù)組-存放分界符表(可事先構(gòu)造好分界符表)。為了簡單起見,分界符、算術(shù)運(yùn)算符和關(guān)系運(yùn)算符都放在s表中(編程時(shí),應(yīng)建立算術(shù)運(yùn)算符表和關(guān)系運(yùn)算符表,并且各有類號),合并成一類。 id 和ci 數(shù)組分別存放標(biāo)識符和常數(shù)。 instring 數(shù)組為輸入源程序的單詞緩存。 outtoken 記錄為輸出內(nèi)部表示緩存。 還有一些為造表填表設(shè)置的變量。 u 主程序開始后,先以人工方式輸入關(guān)鍵字,造k表;再輸入分界符等造 p 表。 u 主程序的工作部分設(shè)

4、計(jì)成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個(gè)循環(huán)處理一個(gè)單詞;接收鍵盤上送來的一個(gè)單詞;調(diào)用詞法分析過程;輸出每個(gè)單詞的內(nèi)部碼。例如,把每一單詞設(shè)計(jì)成如下形式: (type,pointer)其中type指明單詞的種類,例如:Pointer指向本單詞存放處的開始位置。還有一些為造表填表設(shè)置的變量。 u 主程序開始后,先以人工方式輸入關(guān)鍵字,造k表;再輸入分界符等造 p 表。 u 主程序的工作部分設(shè)計(jì)成便于調(diào)試的循環(huán)結(jié)構(gòu)。每個(gè)循環(huán)處理一個(gè)單詞;接收鍵盤上送來的一個(gè)單詞;調(diào)用詞法分析過程;輸出每個(gè)單詞的內(nèi)部碼。例如,把每一單詞設(shè)計(jì)成如下形式: (type,pointer)其中type指明單詞的種類,例如:Point

5、er指向本單詞存放處的開始位置。詞法分析設(shè)計(jì)流程圖2、詞法分析過程考慮 u 根據(jù)輸入單詞的第一個(gè)字符(有時(shí)還需讀第二個(gè)字符),判斷單詞類,產(chǎn)生類號:以字符k表示關(guān)鍵字;id表示標(biāo)識符;ci表示常數(shù);s 表示分界符。 u 對于標(biāo)識符和常數(shù),需分別與標(biāo)識符表和常數(shù)表中已登記的元素相比較,如表中已有該元素,則記錄其在表中的位置,如未出現(xiàn)過,將標(biāo)識符按順序填入數(shù)組 id 中,將常數(shù)變?yōu)槎M(jìn)制形式存入數(shù)組中 ci 中,并記錄其在表中的位置。lexical 過程中嵌有兩個(gè)小過程:一個(gè)名為 getchar,其功能為從 instring 中按順序取出一個(gè)字符,并將其指針 pint 加 1 ;另一個(gè)名為 err

6、or,當(dāng)出現(xiàn)錯(cuò)誤時(shí),調(diào)用這個(gè)過程,輸出錯(cuò)誤編號。u 要求:所有識別出的單詞都用兩個(gè)字節(jié)的等長表示,稱為內(nèi)部碼。第一個(gè)字節(jié)為 t ,第二個(gè)字節(jié)為 i 。 t 為單詞的種類。關(guān)鍵字的 t=;分界符的 t=;算術(shù)運(yùn)算符的 t=;關(guān)系運(yùn)算符的 t=;無符號數(shù)的 t=;標(biāo)識符的 t=。i 為該單詞在各自表中的指針或內(nèi)部碼值。表 1 為關(guān)鍵字表;表 2 為分界符表;表 3 為算術(shù)運(yùn)算符的 i 值;表 4 為關(guān)系運(yùn)算符的 i 值。 取字符和統(tǒng)計(jì)字符行列位置子程序四、實(shí)驗(yàn)要求1、編程時(shí)注意編程風(fēng)格:空行的使用、注釋的使用、縮進(jìn)的使用等。2、將標(biāo)識符填寫的相應(yīng)符號表須提供給編譯程序的以后各階段使用。3、根據(jù)測試

7、數(shù)據(jù)進(jìn)行測試。測試實(shí)例應(yīng)包括以下三個(gè)部分:u 全部合法的輸入。u 各種組合的非法輸入。u 由記號組成的句子。4、詞法分析程序設(shè)計(jì)要求輸出形式:例:輸入VC+語言的實(shí)例程序:If i=0 then n+;a= 3b %);輸出形式為:單詞 二元序列 類 型 位置(行,列) (單詞種別,單詞屬性)for (1,for ) 關(guān)鍵字 (1,1) i ( 6,i ) 標(biāo)識符 (1,2)= ( 4,= ) 關(guān)系運(yùn)算符 (1,3)0 ( 5,0 ) 常數(shù) (1,4)then ( 1,then) 關(guān)鍵字 (1,5)n (6,n ) 標(biāo)識符 (1,6)+ Error Error (1,7); ( 2, ; )

8、分界符 (1,8)a (6,a ) 標(biāo)識符 (2,1)= (4,= ) 關(guān)系運(yùn)算符 (2,2)3b Error Error (2,4)% Error Error (2,4)) ( 2, ) ) 分界符 (2,5); ( 2, ; ) 分界符 (2,6)五、實(shí)驗(yàn)步驟1、根據(jù)流程圖編寫出各個(gè)模塊的源程序代碼上機(jī)調(diào)試。2、 編制好源程序后,設(shè)計(jì)若干用例對系統(tǒng)進(jìn)行全面的上機(jī)測試,并通過所設(shè)計(jì)的詞法分析程序;直至能夠得到完全滿意的結(jié)果。六、程序源代碼1、詞法分析器操作類package 詞法分析器;public class compiler public String computerComp(Strin

9、g str) String output=; int index=0; while(index|str.charAt(index)=str.length() return output;output+=();/數(shù)字 else if(isMath(str.charAt(index)int index1=index; output+=(); while(isMath(str.charAt(index)output+=(str.charAt(index); index+; if(index=str.length() return output; if(isLetter(str.charAt(inde

10、x)while(!isMath(str.charAt(index) & (isLetter(str.charAt(index) output+=(str.charAt(index);index+; if(index=str.length() return output;output+=(,非法字符);elseif(str.charAt(index1)=0)if(isMath(str.charAt(index1+1)output+=(,非法字符);elseoutput+=(,數(shù)字,);elseoutput+=(,數(shù)字,);/字母判斷 else if(isLetter(str.charAt(ind

11、ex) int i=index;while(isLetter(str.charAt(index)|isMath(str.charAt(index)if(index=str.length() return output; index+;String sub =str.substring(i, index);/判斷是是不是關(guān)鍵字 if(isKeyword(sub) output+=(關(guān)鍵字,+sub+); else output+=(標(biāo)識符,+sub+);/空格或者回車處理 else index+; return output;/判斷是不是關(guān)鍵字 public boolean isKeyword(

12、String str) boolean flag=true; String arr=public,static,void,main,String,int,boolean,private,if,else,while ;for(int i=0;i=a&charr=A&charr=0)&(charr=9) return true; else return false; /判斷是不是界符得方法 public boolean isJieFu(char charr) char arr=,;,; for(int i=0;iarr.length;i+) if (charr=arri) return true;

13、 return false; /判斷是不是運(yùn)算符得方法public boolean isCompu(char charr) boolean flag=false; char arr=,+,-,*,!,/,%; for(int i=0;iTG(2)G-+TG|TG(3)G-(4)T-FS(5)S-*FS|/FS(6)S-(7)F-(E)(8)F-i輸出的格式如下:五、實(shí)驗(yàn)步驟1、根據(jù)流程圖編寫出各個(gè)模塊的源程序代碼上機(jī)調(diào)試。2、 編制好源程序后,設(shè)計(jì)若干用例對系統(tǒng)進(jìn)行全面的上機(jī)測試,并通過所設(shè)計(jì)的LL(1)分析程序;直至能夠得到完全滿意的結(jié)果。六、程序源代碼1、操作類package test2;

14、public class LL1_Opertion private char strChar;/ 輸入串private char stack = new char1000;/ 分析棧private int top = 0;/ 分析棧指針private int strPointer = 0;/ 輸入串指針private int length;/ 輸入串長度private String analysisTable = new String69;/ 分析表private final char constChar = i, (, +, -, *, /, ), # ;/ 常字符private Strin

15、g dataStrings = new String10005;/ 結(jié)果數(shù)據(jù)表private String tempString = new String();/ 臨時(shí)字符串private String result = new String();/ 得出的結(jié)果字符串private int dataRow = 0;/ 數(shù)據(jù)表行數(shù)/* * 規(guī)則 i ( + - * / ) # E E-TG E-TG synch synch G G-+TG G-TG G- G- T * T-FS T-FS synch synch synch synch S S- S- S-*FS S-/FS S- S- F *

16、F-i F-(E) synch synch synch synch synch synch */public LL1_Opertion() / 初始化各個(gè)參數(shù)for (int i = 0; i 6; i+) for (int j = 0; j 9; j+) analysisTableij = new String();analysisTableij = ;for (int i = 0; i 1000; i+) for (int j = 0; j 5; j+) dataStringsij = new String();dataStringsij = ;analysisTable01 = i;an

17、alysisTable02 = (;analysisTable03 = +;analysisTable04 = -;analysisTable05 = *;analysisTable06 = /;analysisTable07 = );analysisTable08 = #;analysisTable10 = E;analysisTable20 = G;analysisTable30 = T;analysisTable40 = S;analysisTable50 = F;analysisTable11 = TG;analysisTable12 = TG;analysisTable23 = +T

18、G;analysisTable24 = -TG;analysisTable27 = ;analysisTable28 = ;analysisTable31 = FS;analysisTable32 = FS;analysisTable43 = ;analysisTable44 = ;analysisTable45 = *FS;analysisTable46 = /FS;analysisTable47 = ;analysisTable48 = ;analysisTable51 = i;analysisTable52 = (E);stacktop = #;stack+top = E;public

19、boolean checkChar(char needCheck) / 檢查字符是否在字符表中for (int i = 0; i constChar.length; i+) if (needCheck = constChari) return true;return false;public void printStack() / 輸出分析棧this.tempString = new String();for (int i = 0; i top + 1; i+) this.tempString += stacki;System.out.print(stacki);result += stack

20、i;System.out.print(tt);result += tt;public void printStr() / 輸出剩余輸入串this.tempString = new String();for (int i = 0; i strPointer; i+) System.out.print( );result += ;for (int i = strPointer; i length; i+) this.tempString += strChari;System.out.print(strChari);result += strChari;System.out.print(ttt);r

21、esult += ttt;public void analysis(String line) / LL(1)分析strChar = line.toCharArray();length = strChar.length;String analysisString = new String();char ch = strCharstrPointer;char topX;int finish = 0, flag = 0;int row = 0, column = 0;System.out.print(步驟tt分析棧 tt剩余字符 tt所用產(chǎn)生式 tt動(dòng)作n);result += 步驟tt分析棧 tt

22、剩余字符 tt所用產(chǎn)生式 tt動(dòng)作rn;dataStrings00 = dataRow+ + ;System.out.print(dataRow + tt);result += dataRow + tt;printStack();dataStrings01 = tempString;printStr();dataStrings02 = tempString;dataStrings04 = 初始化;result += tt初始化rn;System.out.print(n);do topX = stacktop-;dataStringsdataRow0 = dataRow + ;System.ou

23、t.print(dataRow + tt);result += dataRow + tt;for (int i = 0; i 9; i+) / 判斷是否為非終結(jié)符if (checkChar(topX) flag = 1;break;if (flag = 1) / 如果是終結(jié)符if (topX = #) finish = 1;System.out.println(over);result += overrn;break;if (topX = ch) printStack();dataStringsdataRow1 = tempString;ch = strChar+strPointer;prin

24、tStr();dataStringsdataRow2 = tempString;System.out.print(匹配n);dataStringsdataRow4 = GETNEXT(I);result += ttGETNEXT(I)rn;flag = 0;this.dataRow+; else printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print(錯(cuò)誤n);result += tt錯(cuò)誤rn;this.dataRow+;break; e

25、lse for (int i = 0; i 6; i+) if (topX = analysisTablei0.charAt(0) row = i;break;for (int i = 0; i = 0; i-) stack+top = analysisString.charAt(i);printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print(analysisTablerow0 + -+ analysisString + n);dataSt

26、ringsdataRow3 = analysisTablerow0 + -+ analysisString;result += analysisTablerow0 + - + analysisString;if (!analysisString.equals() dataStringsdataRow4 = POP,PUSH( + analysisString+ );result += ttPOP,PUSH( + analysisString + )rn; else dataStringsdataRow4 = POP;result += ttPOPrn;if (stacktop = ) top-

27、;this.dataRow+; else printStack();dataStringsdataRow1 = tempString;printStr();dataStringsdataRow2 = tempString;System.out.print(出錯(cuò)n);result += tt錯(cuò)誤rn;this.dataRow+;break; while (finish = 0);public String getDataStrings() return dataStrings;public void setDataStrings(String dataStrings) this.dataStri

28、ngs = dataStrings;public int getDataRow() return dataRow;public void setDataRow(int dataRow) this.dataRow = dataRow;public String getResult() return result;public void setResult(String result) this.result = result;2、界面類package test2;import java.io.BufferedReader;public class LL1SWT protected Shell s

29、hell;private Text text;private Text text_1;private Table table;private MessageBox messageBox;private File sourceFile = null;private LL1_Opertion mOpertion;private String Language = new String();private String analysisString = new String();private String result = new String();/* * Launch the applicat

30、ion. * * param args */public static void main(String args) try LL1SWT window = new LL1SWT();window.open(); catch (Exception e) e.printStackTrace();/* * Open the window. */public void open() Display display = Display.getDefault();createContents();shell.open();shell.layout();while (!shell.isDisposed()

31、 if (!display.readAndDispatch() display.sleep();/* * Create contents of the window. */protected void createContents() shell = new Shell();shell.setSize(570, 565);shell.setText(LL(1)u5206u6790u5668);Menu menu = new Menu(shell, SWT.BAR);shell.setMenuBar(menu);MenuItem menuItem = new MenuItem(menu, SWT

32、.NONE);menuItem.addSelectionListener(new SelectionAdapter() Overridepublic void widgetSelected(SelectionEvent e) try newTextTable(); catch (Exception e2) e2.printStackTrace(););menuItem.setText(u65B0u5EFA);MenuItem menuItem_1 = new MenuItem(menu, SWT.NONE);menuItem_1.addSelectionListener(new Selecti

33、onAdapter() Overridepublic void widgetSelected(SelectionEvent e) openFile(););menuItem_1.setText(u6253u5F00);MenuItem menuItem_3 = new MenuItem(menu, SWT.NONE);menuItem_3.addSelectionListener(new SelectionAdapter() Overridepublic void widgetSelected(SelectionEvent e) try analysis(); catch (Exception e2) e2.printStackTrace(););menuItem_3.setText(u5206u6790);MenuItem menuItem_2 = new MenuItem(menu, SWT.NONE);menuItem_2.addSelectionListener(new SelectionAdapter() Overridepublic void widgetSelected(SelectionEvent e) saveFile(););menuItem_2.setText(u4FDDu5B58);MenuItem

溫馨提示

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

評論

0/150

提交評論