CMM解釋器項(xiàng)目文檔_第1頁(yè)
CMM解釋器項(xiàng)目文檔_第2頁(yè)
CMM解釋器項(xiàng)目文檔_第3頁(yè)
CMM解釋器項(xiàng)目文檔_第4頁(yè)
CMM解釋器項(xiàng)目文檔_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、CMM解釋器項(xiàng)目文檔一、背景完成小組的基本信息:姓名學(xué)號(hào)分工內(nèi)容蔡武慶2013302580148語(yǔ)義分析 中間代碼周子鵬2013302580149界面設(shè)計(jì) 解釋執(zhí)行劉宏勇2013302580151詞法語(yǔ)法 代碼調(diào)試二、文法描述給出所實(shí)現(xiàn)的CMM語(yǔ)言的完整的文法描述詞法/* CMM中的空白符 */SKIP: " " | "r" | "t" | "n"/* CMM中的注釋符號(hào)(需要進(jìn)行匹配查找) */MORE: "/*":IN_MULTI_LINE_COMMENT/* 注釋符號(hào)不用被編譯,是特殊符號(hào)

2、 */<IN_MULTI_LINE_COMMENT>SPECIAL_TOKEN: <MULTI_LINE_COMMENT:"*/">:DEFAULT/* 在注釋符號(hào)之間可以輸入任意字符 */<IN_MULTI_LINE_COMMENT>MORE: <>/* CMM中的保留字 */TOKEN: <ELSE:"else"> | <IF:"if"> | <INT:"int"> | <READ:"read">

3、 | <REAL:"real"> | <WHILE:"while"> | <WRITE:"write">/* CMM中的常數(shù) */TOKEN: <INTEGER_LITERAL:/十進(jìn)制整數(shù)<DECIMAL_LITERAL>> | <#DECIMAL_LITERAL:("1"-"9"("0"-"9")* | "0")> | <REAL_LITERAL:/十進(jìn)制

4、實(shí)數(shù)(<DECIMAL_LITERAL>)+("."(<DECIMAL_LITERAL>)+)?>/* CMM中的標(biāo)識(shí)符(由數(shù)字、字母和下劃線組成的串,但必須以字母開(kāi)頭、且不能以下劃線結(jié)尾的串) */TOKEN: <IDENTIFIER:<LETTER>(<LETTER> | <DIGIT> | "_")*(<LETTER> | <DIGIT>)+)?> | <#LETTER:("a"-"z" | "

5、;A"-"Z")> | <#DIGIT:"0"-"9">/* CMM中的分隔符 */TOKEN: <LPAREN:"("> | <RPAREN:")"> | <LBRACE:""> | <RBRACE:""> | <LBRACKET:""> | <RBRACKET:""> | <SEMICOLON:"&

6、quot;>/* CMM中的運(yùn)算符 */TOKEN: <ASSIGN:"="> | <LT:"<"> | <EQ:"="> | <NE:("<>")> | <PLUS:"+"> | <MINUS:"-"> | <TIMES:"*"> | <OVER:"/">語(yǔ)法非終結(jié)符列表:<Program> /程序<

7、;Statement> /語(yǔ)句<InputStm> /輸入語(yǔ)句<OutputStm> /輸出語(yǔ)句<IfStm> /if語(yǔ)句<WhileStm> /while語(yǔ)句<VarDeclaration> /變量聲明語(yǔ)句<Assignment> /賦值語(yǔ)句<Block> /復(fù)合語(yǔ)句<Expression> /表達(dá)式<Term> /項(xiàng)<Factor> /因子<Variable> /變量<Constant> /常量<Array>/數(shù)組BNF范式列表:

8、<Program>:(<Statement>)*<Statement>:<InputStm>|<OutputStm>|<IfStm>|<WhileStm>|<VarDeclaration>|<Assignment>|<Block>|<SEMICOLON><InputStm>:<READ><LPAREN><Variable> (<COMMA><Variable>)*<RPAREN>&

9、lt;SEMICOLON><OutputStm>:<WRITE><LPAREN><Expression><RPAREN><SEMICOLON><IfStm>:<IF><LPAREN><Expression><RPAREN> <Statement>(<ELSE> <Statement>)*<WhileStm>:<WHILE><LPAREN><Expression><RPA

10、REN> <Statement><VarDeclaration> :(<INT>|<REAL>)<Variable>(<ASSIGN><Expression>)?(<COMMA><Variable>(<ASSIGN><Expression>)?)<SEMICOLON><Assignment>:<Variable><ASSIGN><Expression><SEMICOLON><Blo

11、ck>:<LBRACE>(<Statement>)*<RBRACE><Expression>:<Term>(<PLUS>|<MINUS>|<LT>|<GT>|<EQ>|<NE>)<Term>)*<Term>: <Factor>(<TIMES>|<OVER>)<Factor>)*<Factor>: <LPAREN><Expression><RPAR

12、EN>|<Variable>|<Constant><Variable>:<ID>|<Array><Constant>: (<MINUS>|<PLUS>)?<INTEGER_LITERAL>|<REAL_LITERAL><Array>:<ID><LBRACKET><Expression><RBRACKET>三、系統(tǒng)分析和設(shè)計(jì)包括系統(tǒng)的概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)和核心算法說(shuō)明及分析,系統(tǒng)所采用的開(kāi)發(fā)工具等。詞法 1. 先將

13、Token按要求劃分成常數(shù)(包括十進(jìn)制整數(shù)和十進(jìn)制實(shí)數(shù))、保留字、注釋、 特殊符號(hào)(操作符和分隔符)、特殊Token幾大類(lèi); 2. 逐行掃描,將每行的字符串轉(zhuǎn)換為字符型的數(shù)組,其中剔除空白符號(hào)(比如空格); 3. 逐字掃描,根據(jù)構(gòu)造的DFA,完成讀入字符后狀態(tài)的跳轉(zhuǎn),并在到達(dá)終態(tài)時(shí)確定所 讀入的Token的類(lèi)型,必要時(shí)還要記錄Token的字符串形式以備將其打印出來(lái); 4. 根據(jù)對(duì)Token的處理,選擇不同的打印形式,有以下幾種:打印出錯(cuò)信息、打印操 作符和分隔符、打印關(guān)鍵字、打印常數(shù)、打印標(biāo)識(shí)符、打印注釋內(nèi)容。主要有以下幾個(gè)方法:1./* 啟動(dòng)逐行的詞法分析*/ public string r

14、un(string text)2./* 檢查讀入的當(dāng)前標(biāo)識(shí)符是否為保留字,如果是則把標(biāo)識(shí)符類(lèi)型從ID改為相應(yīng)的保留字類(lèi)型*/ public TokenType reservedWordScan(string word) 3./* 啟動(dòng)逐標(biāo)識(shí)符的詞法分析*/ public void getToken() 4./* 處理Token,按要求輸出*/ public string tokenstrOutput(TokenStr tokS) 語(yǔ)法 采用遞歸下降的語(yǔ)法分析方法,并構(gòu)造出抽象語(yǔ)法樹(shù)。 語(yǔ)法樹(shù)的節(jié)點(diǎn)中有三個(gè)屬性:節(jié)點(diǎn)類(lèi)型、節(jié)點(diǎn)名字、子節(jié)點(diǎn)鏈表(孩子鏈表)。 語(yǔ)法分析步驟:1. 首先從詞法分析的結(jié)

15、果(一個(gè)ArrayList)中獲取各種終結(jié)符,但同時(shí)剔除掉一些注釋、空格符、有錯(cuò)誤標(biāo)記的Token等特殊Token,將有待語(yǔ)法分析的終結(jié)符放入wordAl(ArrayList類(lèi)型)中;2. 為每個(gè)非終結(jié)符提供一個(gè)處理其邏輯的函數(shù),通過(guò)函數(shù)分析對(duì)應(yīng)非終結(jié)符的產(chǎn)生式,并將結(jié)果保存為節(jié)點(diǎn)添加到抽象語(yǔ)法樹(shù)上合適的位置。通過(guò)每個(gè)函數(shù)的遞歸調(diào)用最后就可以產(chǎn)生整個(gè)程序的抽象語(yǔ)法樹(shù)。根節(jié)點(diǎn)為Program;3. 打印語(yǔ)法樹(shù),采用前序遍歷的方式將節(jié)點(diǎn)中的str成員打印出來(lái),一旦出現(xiàn)語(yǔ)法錯(cuò)誤就將錯(cuò)誤處理信息直接附在str中。主要有以下幾個(gè)方法:1./* 啟動(dòng)逐Token的語(yǔ)法分析 */ public string

16、 run(ArrayList tokenAL) 2./* 打印語(yǔ)法樹(shù) */ public string dump(Node node, string space)3./* 匹配單詞 */ public void match(Scanner.TokenType type) public void match(string s)PS:對(duì)應(yīng)每個(gè)語(yǔ)法樹(shù)節(jié)點(diǎn)都有一個(gè)相應(yīng)的處理方法,例如:對(duì)于分析賦值語(yǔ)句有ParseAssignment方法,對(duì)于分析變量有ParseVariable方法。每個(gè)方法的返回類(lèi)型都是Node,也就是調(diào)用后都會(huì)生成一個(gè)相應(yīng)的語(yǔ)法樹(shù)結(jié)點(diǎn)。4.5.6. 語(yǔ)義利用符號(hào)表在語(yǔ)法分析的基礎(chǔ)上

17、,主要檢查了以下幾種語(yǔ)義錯(cuò)誤,并同時(shí)生成了中間代碼。檢測(cè)的語(yǔ)義錯(cuò)誤:1. 使用了未定義的變量;2. 在同一層對(duì)變量進(jìn)行了重復(fù)定義;3. 聲明的數(shù)組長(zhǎng)度不為正整數(shù);注:1. 由于每個(gè)聲明之后會(huì)自動(dòng)得到初始值0,所以不存在變量聲明后未初始化就使用的問(wèn)題。2. 本程序中檢查類(lèi)型的轉(zhuǎn)換只是會(huì)在real類(lèi)型轉(zhuǎn)換為int類(lèi)型時(shí)有精讀丟失,但不將其定義為語(yǔ)義錯(cuò)誤。在生成的語(yǔ)法樹(shù)基礎(chǔ)上,具體在類(lèi)GramParser中實(shí)現(xiàn):主要有以下幾個(gè)方法:1./* 在總表中查詢某變量,如果找到返回該符號(hào)表項(xiàng),否則返回null */ public SymItem LookUp(string s) 2./* 檢查當(dāng)前符號(hào)表中是

18、否已經(jīng)存在該變量名,以防止在同一層對(duì)變量重復(fù)定義;如果重復(fù)定義,則返回false,否則返回true */ bool Check(string str)3./* 匹配單詞 */符號(hào)表若干張符號(hào)分表構(gòu)成一個(gè)鏈?zhǔn)綏5姆?hào)總表,每一張符號(hào)分表都是一個(gè)由若干符號(hào)表項(xiàng)組成的鏈表,對(duì)應(yīng)著某一個(gè)塊域,管理同一個(gè)層里的所有變量,每個(gè)符號(hào)表項(xiàng)對(duì)應(yīng)該層內(nèi)的一個(gè)變量或者一個(gè)數(shù)組元素。符號(hào)表項(xiàng)一共有三個(gè)屬性:名字、類(lèi)型和值。程序中含有兩個(gè)類(lèi):SymItem和Symtable,分別對(duì)應(yīng)著符號(hào)表項(xiàng)和符號(hào)分表。中間代碼說(shuō)明:表示當(dāng)前值, 具體在類(lèi)GramParser中實(shí)現(xiàn),該類(lèi)中有一個(gè)string類(lèi)型的鏈表intercode

19、,用于存放生成的中間代碼。另外有一個(gè)gen方法,將輸入的字符串存入intercode鏈表。1. 輸入語(yǔ)句gen("read", item.Type.ToString(), "_", item.Name);2. 輸出語(yǔ)句gen("write", ”result”, "_", "outstream");3. If語(yǔ)句設(shè)置一個(gè)整數(shù)變量ifLevel,用于記錄if語(yǔ)句鑲嵌層次gen("judge", "if", "result&quo

20、t;, ifLevel.ToString();gen("judge", "if", "start",  ifLevel.ToString();gen("mark", "if", "end", ifLevel.ToString(); gen("judge", "else", "start", ifLe

21、vel.ToString();gen("mark", "else", "end",  ifLevel.ToString();4. While語(yǔ)句設(shè)置一個(gè)整數(shù)變量whileLevel,用于記錄while語(yǔ)句鑲嵌層次gen("mark", "while", "begin", whileLevel.ToString();gen("judge", "while",&

22、#160;"result", whileLevel.ToString();gen("mark", "while", "end", whileLevel.ToString();5. 賦值語(yǔ)句 gen("assign", item.Type.ToString(), "result", item.Name);6. 聲明語(yǔ)句在獲得int或者real關(guān)鍵字后,登錄符號(hào)表,創(chuàng)建一個(gè)符號(hào)表項(xiàng): gen("new

23、", "item", "_", "table")然后對(duì)生成的item的類(lèi)型進(jìn)行相應(yīng)的賦值: gen("assign", "type", "INT", "item")或者gen("assign", "type", "REAL", "item");如果存在賦值,則在進(jìn)行賦值操作:gen("assign", "type", tempT

24、ype.ToString(), "item");7. 表達(dá)式gen("lt", num2.ToString(), num1.ToString(), value);gen("gt", num2.ToString(), num1.ToString(), value);gen("eq", num2.ToString(), num1.ToString(), value);gen("ne", num2.ToString(),

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論