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

下載本文檔

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

文檔簡介

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

2、 */<IN_MULTI_LINE_COMMENT>SPECIAL_TOKEN: <MULTI_LINE_COMMENT:"*/">:DEFAULT/* 在注釋符號之間可以輸入任意字符 */<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ù)字、字母和下劃線組成的串,但必須以字母開頭、且不能以下劃線結(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:"/">語法非終結(jié)符列表:<Program> /程序<

7、;Statement> /語句<InputStm> /輸入語句<OutputStm> /輸出語句<IfStm> /if語句<WhileStm> /while語句<VarDeclaration> /變量聲明語句<Assignment> /賦值語句<Block> /復(fù)合語句<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ì)和核心算法說明及分析,系統(tǒng)所采用的開發(fā)工具等。詞法 1. 先將

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

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

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

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

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

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

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

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

23、", "item", "_", "table")然后對生成的item的類型進(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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論