編譯原理實(shí)驗(yàn)設(shè)計(jì)_第1頁
編譯原理實(shí)驗(yàn)設(shè)計(jì)_第2頁
編譯原理實(shí)驗(yàn)設(shè)計(jì)_第3頁
編譯原理實(shí)驗(yàn)設(shè)計(jì)_第4頁
編譯原理實(shí)驗(yàn)設(shè)計(jì)_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上編譯原理課程設(shè)計(jì)姓名:XXX學(xué)號(hào):XXXXXX班級(jí):XXXXX年級(jí):XXXXXX專心-專注-專業(yè)詞 法 分 析一、 實(shí)驗(yàn)?zāi)康脑O(shè)計(jì)、編制并調(diào)試一個(gè)詞法分析程序,掌握詞法分析的基本原理和詞法分析在編譯過程中的作用,熟悉關(guān)鍵字表等相關(guān)的數(shù)據(jù)結(jié)構(gòu)與單詞的類方法,加深對(duì)詞法分析原理的理解,把握詞法分析器的實(shí)現(xiàn)方法和技術(shù)。二、 實(shí)驗(yàn)要求1. 待分析的簡(jiǎn)單詞法 (1)關(guān)鍵字: main int while if break else (2)運(yùn)算符和界符 + - > ( ) ; (3)其他單詞是標(biāo)識(shí)符(ID)和整型常熟(NUM),通過以下正規(guī)式定義: ID=letter(let

2、ter | digit)* NUM=digit digit* (4)空格有空白、制表符和換行符組成??崭褚话阌脕矸指鬒D、NUM、運(yùn)算符、界符和關(guān)鍵字,詞法分析階段通常被忽略。2. 各種單詞符號(hào)對(duì)應(yīng)的簡(jiǎn)單編碼表1 簡(jiǎn)單語言單詞符號(hào)及內(nèi)部表示單詞符號(hào)種別編碼單詞值單詞符號(hào)種別編碼單詞值main33內(nèi)部字符串二進(jìn)制數(shù)值表示43內(nèi)部字符串二進(jìn)制數(shù)值表示Int3444While35>45If36(46break37)47esle3848letter(letter|digit)3949digit digit*40;50+41=51-423. 詞法分析程序的功能輸入:所給文法的源程序字符串輸出:二元

3、組(temp,lexeme或value)構(gòu)成的序列其中,temp為單詞種別碼,lexeme為存放的單詞自身字符串;value位整型常數(shù)。4. 識(shí)別語言單詞的狀態(tài)轉(zhuǎn)換圖我們知道,從語言單詞符號(hào)的兩種描述方式可以構(gòu)造出識(shí)別語言單詞的有窮自動(dòng)機(jī),它的非形式化描述就是狀態(tài)轉(zhuǎn)換圖。通常,構(gòu)造詞法分析程序有兩種方法。第一種方法是用手工方式,即根據(jù)識(shí)別語言單詞的狀態(tài)圖,使用某種高級(jí)語言,例如,java語言直接編寫此法分析程序。第二種方法就是利用詞法分析程序的自動(dòng)生成工具LEX自動(dòng)生成詞法分析程序。下面以某種語言為例,對(duì)第一種方法做簡(jiǎn)要的介紹。例如,圖2.1是識(shí)別表1的單詞符號(hào)的狀態(tài)轉(zhuǎn)換圖。120 l 非d

4、非ld43 非d 5 +6 -77 /8 >910 : =11 非=12 ;13 其他圖2.1 識(shí)別表1所列的語言單詞的狀態(tài)轉(zhuǎn)換圖三、 詞法分析程序的算法思想算法的基本任務(wù)是從字符串表示的源程序中識(shí)別出具有獨(dú)立的單詞符號(hào),其基本思是根據(jù)掃描到的單詞符號(hào)的第一字種類,拼出相應(yīng)的單詞符號(hào)。1. 主程序示意圖主程序示意圖如圖3.1所示。其中初值包括如下兩個(gè)方面。(1) 關(guān)鍵字表的初值關(guān)鍵字作為特殊標(biāo)識(shí)符處理,把它們預(yù)先安排在一張表格中(稱關(guān)鍵字表),當(dāng)掃描程序識(shí)別吃標(biāo)識(shí)符時(shí),查關(guān)鍵字表。如能查到匹配的單詞,則該單詞位關(guān)鍵字,否則為一般標(biāo)識(shí)符。(2) 程序中需要用到的主要變量為temp,lexe

5、me和value。開始置初值調(diào)用掃描子程序輸出單詞二元組 輸入串結(jié)束 是 否結(jié)束圖3.1 詞法分析主程序示意圖2. 掃描子程序的算法思想首先設(shè)置3個(gè)變量: lexeme用來存放構(gòu)成單詞符號(hào)的字符串;value用來存放整型單詞;temp用來存放單詞符號(hào)的種別碼。掃描子程序主要部分流程如圖3.2所示。開始變量初始化忽略空格是否文件結(jié)束結(jié)束 是 否 數(shù)字 運(yùn)算符、 拼字符串拼數(shù) 界符等符號(hào) 其他符號(hào)對(duì)不同符號(hào)給出相應(yīng)的temp是否關(guān)鍵字 否temp=11temp=10 是 報(bào)錯(cuò)Temp為對(duì)應(yīng)關(guān)鍵字的單詞種別碼結(jié)束圖3.2 詞法分析流程圖四、運(yùn)行結(jié)果1. 正確的輸入(test.in)及結(jié)果test.i

6、n 文件內(nèi)容如圖4.1所示:圖4.1 正確的輸入的結(jié)果result.out文件內(nèi)容如圖4.2所示:圖4.2 result.out文件內(nèi)容如果test.in中輸入有誤,則運(yùn)行時(shí)提示:2. 有誤的輸入及結(jié)果有誤的輸入結(jié)果分別如圖4.3和圖4.4所示:圖4.3 有誤的輸入的結(jié)果圖圖4.4 有誤的輸入的結(jié)果五、源程序(Token.java Main.java lexer.java)1. Token.java源代碼如下:package SimpleLexer;class Tag public final static int MAIN = 33, INT = 34, WHILE = 35, IF = 3

7、6,BREAK = 37, ELSE = 38,NUMBER = 39, REAL = 40, TRUE = 41,FALSE = 42, BASIC = 43, ID = 44, LE = 45, GE = 46, NE = 47,EQ = 48, AND = 49, OR = 50;public class Token public final int tag;public Token(int t) tag = t;public String toString() String temp = ""switch (tag) case '+':case &#

8、39;-':case '*':case '/':case '=':case '<':case '>':temp = "OPERATOR,"break;case '(':case ')':case '':case '':case '':temp = "DELIMITER,"break;return "<" + temp + (char) tag + &q

9、uot;>"class Num extends Token public final int value;public Num(int v) super(Tag.NUMBER);value = v;public String toString() return "<NUMBER," + value + ">"class Real extends Token public final float value;public Real(float v) super(Tag.REAL);value = v;public String

10、toString() return "<REAL," + value + ">"class Word extends Token public String lexeme = ""public Word(String s, int tag) super(tag);lexeme = s;public String toString() String temp = ""switch (tag) case Tag.MAIN:case Tag.WHILE:case Tag.BREAK:case Tag.IF:c

11、ase Tag.ELSE:temp = "KEYWORD"break;case Tag.ID:temp = "ID"break;case Tag.TRUE:case Tag.FALSE:temp = "BOOLVALUE"break;case Tag.LE:case Tag.GE:case Tag.NE:case Tag.EQ:temp = "OPERATOR"break;return "<" + temp + "," + lexeme + ">&quo

12、t;public static final Word and = new Word("&&", Tag.AND), or = new Word("|",Tag.OR), eq = new Word("=", Tag.EQ), ne = new Word("<>", Tag.NE),le = new Word("<=", Tag.LE), ge = new Word(">=", Tag.GE);public static final Wo

13、rd True = new Word("true", Tag.TRUE),False = new Word("false", Tag.FALSE);class Type extends Word public int width = 0;public Type(String s, int tag, int w) super(s, tag);width = w;public String toString() return "<BASICTYPE," + lexeme + ">"public static

14、 final Type Int = new Type("int", Tag.BASIC, 4),Float = new Type("float", Tag.BASIC, 8), Char = new Type("char",Tag.BASIC, 1), Bool = new Type("bool", Tag.BASIC, 1);2. Main.java源代碼如下:package SimpleLexer;import java.io.*;public class Main public static void mai

15、n(String args) throws IOException if (args.length < 1)System.err.println("parameter error!");return;PrintStream console = System.out;BufferedInputStream in = new BufferedInputStream(new FileInputStream(args0);PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStrea

16、m("result.out");System.setOut(out);System.setIn(in);lexer lex = new lexer();int count=0;do try System.out.print(lex.scan()+" ");if(+count%3=0)System.out.println();out.flush(); catch (LexError e) / TODO: handle exceptionSystem.err.println(e); while (System.in.available() > 0);o

17、ut.close();System.setOut(console);class LexError extends Exception public LexError() / TODO Auto-generated constructor stubpublic LexError(String msg) super(msg);3. lexer.java源代碼如下:package SimpleLexer;import java.io.*;import java.util.*;public class lexer public static int line = 1;char peek = '

18、 'Hashtable words = new Hashtable();void reserve(Word w) words.put(w.lexeme, w);public lexer() reserve(new Word("if", Tag.IF);reserve(new Word("else", Tag.ELSE);reserve(new Word("while", Tag.WHILE);reserve(new Word("break", Tag.BREAK);reserve(new Word(&quo

19、t;main", Tag.MAIN);reserve(Word.True);reserve(Word.False);reserve(Type.Int);reserve(Type.Char);reserve(Type.Bool);reserve(Type.Float);void readch() throws IOException peek = (char) System.in.read();boolean readch(char c) throws IOException readch();if (peek != c)return false;peek = ' 'r

20、eturn true;public Token scan() throws IOException, LexError for (; readch() if (peek = ' ' | peek = 't' | peek = 'r')continue;else if (peek = 'n')line+;elsebreak;switch (peek) case '&':if (readch('&')return Word.and;elsereturn new Token('&a

21、mp;');case '|':if (readch('|')return Word.or;elsereturn new Token('|');case '=':if (readch('=')return Word.eq;elsereturn new Token('=');case '<':if (readch('=')return Word.le;else if (peek = '>')return Word.ne;elseretu

22、rn new Token('<');case '>':if (readch('=')return Word.ge;elsereturn new Token('>');if (Character.isDigit(peek) int v = 0;do v = 10 * v + Character.digit(peek, 10);readch(); while (Character.isDigit(peek);if (Character.isLetter(peek)error(0);if (peek != '.')return new Num(v);float x = v;fl

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論