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),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

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

2、留字 */TOKEN: | | | | | | /* CMM中的常數(shù) */TOKEN: INTEGER_LITERAL:/十進(jìn)制整數(shù) | | REAL_LITERAL:/十進(jìn)制實(shí)數(shù)()+(.()+)?/* CMM中的標(biāo)識(shí)符(由數(shù)字、字母和下劃線組成的串,但必須以字母開頭、且不能以下劃線結(jié)尾的串) */TOKEN: IDENTIFIER:( | | _)*( | )+)? | | /* CMM中的分隔符 */TOKEN: | | | | | | /* CMM中的運(yùn)算符 */TOKEN: | LT: | | NE:() | | | | 語法非終結(jié)符列表: /程序 /語句 /輸入語句 /輸出語句 /

3、if語句 /while語句 /變量聲明語句 /賦值語句 /復(fù)合語句 /表達(dá)式 /項(xiàng) /因子 /變量 /常量/數(shù)組BNF范式列表:()*:|: ()*: ( )*: :(|)()?()?):()*:(|)*: (|)*: |:|: (|)?|:三、系統(tǒng)分析和設(shè)計(jì)包括系統(tǒng)的概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)和核心算法說明及分析,系統(tǒng)所采用的開發(fā)工具等。詞法 1. 先將Token按要求劃分成常數(shù)(包括十進(jìn)制整數(shù)和十進(jìn)制實(shí)數(shù))、保留字、注釋、 特殊符號(hào)(操作符和分隔符)、特殊Token幾大類; 2. 逐行掃描,將每行的字符串轉(zhuǎn)換為字符型的數(shù)組,其中剔除空白符號(hào)(比如空格); 3. 逐字掃描,根據(jù)構(gòu)造的DFA,完成讀入

4、字符后狀態(tài)的跳轉(zhuǎn),并在到達(dá)終態(tài)時(shí)確定所 讀入的Token的類型,必要時(shí)還要記錄Token的字符串形式以備將其打印出來; 4. 根據(jù)對(duì)Token的處理,選擇不同的打印形式,有以下幾種:打印出錯(cuò)信息、打印操 作符和分隔符、打印關(guān)鍵字、打印常數(shù)、打印標(biāo)識(shí)符、打印注釋內(nèi)容。主要有以下幾個(gè)方法:1./* 啟動(dòng)逐行的詞法分析*/ public string run(string text)2./* 檢查讀入的當(dāng)前標(biāo)識(shí)符是否為保留字,如果是則把標(biāo)識(shí)符類型從ID改為相應(yīng)的保留字類型*/ public TokenType reservedWordScan(string word) 3./* 啟動(dòng)逐標(biāo)識(shí)符的詞法分

5、析*/ public void getToken() 4./* 處理Token,按要求輸出*/ public string tokenstrOutput(TokenStr tokS) 語法 采用遞歸下降的語法分析方法,并構(gòu)造出抽象語法樹。 語法樹的節(jié)點(diǎn)中有三個(gè)屬性:節(jié)點(diǎn)類型、節(jié)點(diǎn)名字、子節(jié)點(diǎn)鏈表(孩子鏈表)。 語法分析步驟:1. 首先從詞法分析的結(jié)果(一個(gè)ArrayList)中獲取各種終結(jié)符,但同時(shí)剔除掉一些注釋、空格符、有錯(cuò)誤標(biāo)記的Token等特殊Token,將有待語法分析的終結(jié)符放入wordAl(ArrayList類型)中;2. 為每個(gè)非終結(jié)符提供一個(gè)處理其邏輯的函數(shù),通過函數(shù)分析對(duì)應(yīng)非終

6、結(jié)符的產(chǎn)生式,并將結(jié)果保存為節(jié)點(diǎn)添加到抽象語法樹上合適的位置。通過每個(gè)函數(shù)的遞歸調(diào)用最后就可以產(chǎn)生整個(gè)程序的抽象語法樹。根節(jié)點(diǎn)為Program;3. 打印語法樹,采用前序遍歷的方式將節(jié)點(diǎn)中的str成員打印出來,一旦出現(xiàn)語法錯(cuò)誤就將錯(cuò)誤處理信息直接附在str中。主要有以下幾個(gè)方法:1./* 啟動(dòng)逐Token的語法分析 */ public string run(ArrayList tokenAL) 2./* 打印語法樹 */ public string dump(Node node, string space)3./* 匹配單詞 */ public void match(Scanner.Token

7、Type type) public void match(string s)PS:對(duì)應(yīng)每個(gè)語法樹節(jié)點(diǎn)都有一個(gè)相應(yīng)的處理方法,例如:對(duì)于分析賦值語句有ParseAssignment方法,對(duì)于分析變量有ParseVariable方法。每個(gè)方法的返回類型都是Node,也就是調(diào)用后都會(huì)生成一個(gè)相應(yīng)的語法樹結(jié)點(diǎn)。4.5.6. 語義利用符號(hào)表在語法分析的基礎(chǔ)上,主要檢查了以下幾種語義錯(cuò)誤,并同時(shí)生成了中間代碼。檢測(cè)的語義錯(cuò)誤:1. 使用了未定義的變量;2. 在同一層對(duì)變量進(jìn)行了重復(fù)定義;3. 聲明的數(shù)組長度不為正整數(shù);注:1. 由于每個(gè)聲明之后會(huì)自動(dòng)得到初始值0,所以不存在變量聲明后未初始化就使用的問題。

8、2. 本程序中檢查類型的轉(zhuǎn)換只是會(huì)在real類型轉(zhuǎn)換為int類型時(shí)有精讀丟失,但不將其定義為語義錯(cuò)誤。在生成的語法樹基礎(chǔ)上,具體在類GramParser中實(shí)現(xiàn):主要有以下幾個(gè)方法:1./* 在總表中查詢某變量,如果找到返回該符號(hào)表項(xiàng),否則返回null */ public SymItem LookUp(string s) 2./* 檢查當(dāng)前符號(hào)表中是否已經(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è)由若干符

9、號(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è)屬性:名字、類型和值。程序中含有兩個(gè)類:SymItem和Symtable,分別對(duì)應(yīng)著符號(hào)表項(xiàng)和符號(hào)分表。中間代碼說明:表示當(dāng)前值, 具體在類GramParser中實(shí)現(xiàn),該類中有一個(gè)string類型的鏈表intercode,用于存放生成的中間代碼。另外有一個(gè)gen方法,將輸入的字符串存入intercode鏈表。1. 輸入語句gen(read, item.Type.ToString(), _, item.Name);2. 輸出語句gen(write, ”result”,

10、 _, outstream);3. If語句設(shè)置一個(gè)整數(shù)變量ifLevel,用于記錄if語句鑲嵌層次gen(judge,if,result,ifLevel.ToString();gen(judge,if,start,ifLevel.ToString();gen(mark,if,end,ifLevel.ToString();gen(judge,else,start,ifLevel.ToString();gen(mark,else,end,ifLevel.ToString();4. While語句設(shè)置一個(gè)整數(shù)變量whileLevel,用于記錄while語句鑲嵌層次gen(mark,while,be

11、gin,whileLevel.ToString();gen(judge,while,result,whileLevel.ToString();gen(mark,while,end,whileLevel.ToString();5. 賦值語句 gen(assign,item.Type.ToString(),result,item.Name);6. 聲明語句在獲得int或者real關(guān)鍵字后,登錄符號(hào)表,創(chuàng)建一個(gè)符號(hào)表項(xiàng): gen(new, item, _, table)然后對(duì)生成的item的類型進(jìn)行相應(yīng)的賦值: gen(assign, type, INT, item)或者gen(assign, ty

12、pe, REAL, item);如果存在賦值,則在進(jìn)行賦值操作:gen(assign, type, tempType.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(),num1.ToString(),value);gen(add,num2.ToString(),num1.ToSt

13、ring(),value);gen(sub,num2.ToString(),num1.ToString(),value);gen(mul,num2.ToString(),num1.ToString(),value);gen(div,num2.ToString(),num1.ToString(),value);中間代碼的解釋執(zhí)行具體在類Interpreter中實(shí)現(xiàn):將語義分析生成的結(jié)果intercode作為參數(shù)傳入Interpreter的run方法中,然后將其中的字符串每四個(gè)取一次,進(jìn)行解釋。主要程序流程在一個(gè)swith-case語句中,針對(duì)各種中間代碼類型進(jìn)行相應(yīng)解釋。4、 測(cè)試用例和測(cè)試結(jié)果測(cè)試用例分別包括錯(cuò)誤測(cè)試用例和正確測(cè)試用例:錯(cuò)誤測(cè)試:1,遺漏分號(hào):2,標(biāo)識(shí)符合法性檢測(cè):3,引用未聲明變量:4,重復(fù)聲明: 正確測(cè)試:1,注釋:2,單條語句(包括int,real,wri

溫馨提示

  • 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)論