freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于gui的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文(編輯修改稿)

2024-10-03 19:18 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 (label_2:, _, _, _) (+, i, 1, i) // 迭代 (jmp, label_0, _, _) (label_3:, _, _, _) 每個(gè) for 語(yǔ)句會(huì)產(chǎn)生四個(gè)標(biāo)號(hào),一個(gè)表示類似“ i = 0”的初始化,一個(gè)表示類似“ i 3”的條件判斷,一個(gè)表示 body,一個(gè)表示類似“ i++”的表達(dá)式。 ? ifelse 語(yǔ)句 if(a b) 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 12 c = a。 else c = b。 = (, a, b, temp_0) (jtrue, label_1, temp_0, _) (jmp, label_0, _, _) (label_1:, _, _, _) (=, a, _, c) (jmp, label_2, _, _) (label_0:, _, _, _) (=, b, _, c) (label_2:, _, _, _) 一個(gè) ifelse 語(yǔ)句會(huì)產(chǎn)生 3 個(gè)標(biāo)號(hào),一個(gè)表示條件為真時(shí)的執(zhí)行語(yǔ)句,一個(gè)表示條件為假的執(zhí)行語(yǔ)句,一個(gè)表示跳出 ifelse 語(yǔ)句。 ? while 語(yǔ)句 while(a b) a = a + 1。 = (label_0:, _, _, _) (, a, b, temp_0) (jtrue, label_1, temp_0, _) (jmp, label_2, _, _) (label_1:, _, _, _) (+, a, 1, temp_1) (=, temp_1, _, a) (jmp, label_0, _, _) (label_2:, _, _, _) 每個(gè) while 語(yǔ)句產(chǎn)生 3 個(gè)標(biāo)號(hào),一個(gè)表示類似“ a = 0”的初始化,一個(gè)表示類似“ a b”的條件判斷,一個(gè)表示 body。 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 13 ? switch 語(yǔ)句 switch(i) { case 1: a = a + 1。 break。 default: a = a + 2。 } = (jmp, label_0, _, _) (label_3:, _, _, _) (+, a, 1, temp_0) (=, temp_0, _, a) (jmp, label_2, _, _) (label_1:, _, _, _) (+, a, 2, temp_1) (=, temp_1, _, a) (jmp, label_2, _, _) (label_0:, _, _, _) (==, i, 1, temp_2) (jtrue, label_3, temp_2, _) (jmp, label_1, _, _) (label_2:, _, _, _) 每個(gè) switch 語(yǔ)句會(huì) 針對(duì)相應(yīng)的 case 和 default 產(chǎn)生標(biāo)號(hào),同時(shí),還會(huì)產(chǎn)生跳出 switch的標(biāo)號(hào)。 ? 函數(shù)調(diào)用 int add(int a, int b) { return a + b。 } void main() 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 14 { int a = 1, b = 1, c。 c = add(a, b)。 } = (add:, _, _, _) (enter, 16, _, _) (+, a, b, temp_0) (return, temp_0, _, _) (return, _, _, _) (main:, _, _, _) (enter, 16, _, _) (=, 1, _, a) (=, 1, _, b) (param, b, _, _) (param, a, _, _) (call, add, _, temp_1) (incStackPtr, 8, _, _) (=, temp_1, _, c) (return, _, _, _) 每個(gè)函數(shù)調(diào)用會(huì)針對(duì)主調(diào)函數(shù)和被調(diào)函數(shù)產(chǎn)生相應(yīng)的標(biāo)號(hào)。 以上只是列舉了一些簡(jiǎn)單情況下的示例,對(duì)于復(fù)雜的源程序,翻譯成的四元式集是以上常見(jiàn)四元式結(jié)構(gòu)組合的結(jié)果。 符號(hào)表 符號(hào)表是一種供編譯器用于保存有關(guān)源程序構(gòu)造的各種信息的數(shù)據(jù)結(jié)構(gòu),這些信息在編譯器的分析階段被逐步收集并放入符號(hào)表 [11]。編譯器用符號(hào)表跟蹤作用域及名字綁定的相關(guān)信息。在源程序 中每次遇到名字都會(huì)去搜索符號(hào)表。如果新的名字出現(xiàn)或關(guān)于一個(gè)已存在名字新的信息出新,要對(duì)符號(hào)表進(jìn)行更新。 符號(hào)表?xiàng)l目可在詞法分析階段、語(yǔ)法分析階段和語(yǔ)義分析階段創(chuàng)建(如圖 )。在基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 15 本設(shè)計(jì)中,由語(yǔ)法分析器來(lái)創(chuàng)建這些條目。因?yàn)橄鄬?duì)于詞法分析器而言,語(yǔ)法分析器知道一個(gè)程序的語(yǔ)法結(jié)構(gòu),它可以更好地區(qū)分一個(gè)詞法單元的實(shí)際意義,因此常更適合創(chuàng)建符號(hào)表?xiàng)l目。 圖 符號(hào)表 符號(hào)表通常用哈希表實(shí)現(xiàn)。 KEY:詞素( lexeme), VALUE:符號(hào)( symbol)。 作用域 在靜態(tài)類型編程語(yǔ)言中,變量在使用之前必須聲明,聲明提供了變量的類型。如:int a。 char c。 通常,聲明只在它的作用域內(nèi)有效。 ? 函數(shù)作用域:每個(gè)變量在函數(shù)內(nèi)部定義。 ? 塊作用域:變量只在代碼塊內(nèi)有效。 float foo(int a, float b) { int c。 // c 為局部作用域中變量。 { int b = 100。 // 塊作用域中定義的 b 將參數(shù) b 覆蓋。 c = a + b。 // 將參數(shù) a 的值與新定義的 b 值之和賦值給 c。 } return float(c) / b // 此處的 b 為參數(shù) b。 } 為防止引用變量產(chǎn)生沖突,須為每個(gè)作用域設(shè)置一個(gè)符號(hào)表。 前端 詞法分析器 語(yǔ)法分析器 中間代碼生成器 符號(hào)表 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 16 局部變量名的存儲(chǔ)布局 從變量類型可以知道該變量在運(yùn)行時(shí)刻需要的內(nèi)存數(shù)量。在編譯時(shí)刻,可以使用這些數(shù)量為每個(gè)名字分配一個(gè)相對(duì)地址。名字的類型和相對(duì)地址信息保存在相應(yīng)的符號(hào)表?xiàng)l目中 [12]。 數(shù)據(jù)對(duì)象的存儲(chǔ)布局受目標(biāo)機(jī)器的尋址約束的影響。比如,將整數(shù)相加的指令往往希望整數(shù)能夠?qū)R( aligned),也就是說(shuō),希望它們被放在內(nèi)存中特定的位置上,比如地址能夠被 4 整除的位置上。 類型的寬度( width)是指該類型的一個(gè)對(duì)象所需的存儲(chǔ)單元的數(shù)量。一般情況下,字符類型( char)占用一個(gè)字節(jié),整型( int)占用 4 個(gè)字節(jié)。 可以使用一個(gè)變量,比如 offset,來(lái)跟蹤下一個(gè)可用的相對(duì)地址。 在考慮第一個(gè)聲明之前, offset 被設(shè)置為 0。每處理一個(gè)變量 x 時(shí), x 被加入符號(hào)表,它的相對(duì)地址被設(shè)置為 offset 的當(dāng)前值,隨后, x 類型的寬度被加到 offset 上。 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 17 3 設(shè)計(jì)與實(shí)現(xiàn) C 子語(yǔ)言 本設(shè)計(jì)將一個(gè)用 C 子語(yǔ)言編寫的源程序翻譯成中間代碼,該C子語(yǔ)言描述如下: 數(shù)據(jù)類型 該 子語(yǔ)言支持兩種數(shù)據(jù)類型: ? int: 32 位有符號(hào)整型。 ? char: 8 位無(wú)符號(hào)整型。 只支持靜態(tài)數(shù)組。 如果 傳遞一個(gè)數(shù)組給函數(shù),數(shù)組將會(huì)以指針形式傳遞,所以對(duì)于數(shù)組的任何更改,將會(huì)影響調(diào)用函數(shù)傳 遞的數(shù)組。另外,如果超過(guò)了數(shù)組的長(zhǎng)度,調(diào)用函數(shù)的棧結(jié)構(gòu)將會(huì)被破壞 。 每個(gè)作用域中的局部變量應(yīng)該在該作用域塊的開始即任何其他語(yǔ)句之前進(jìn)行聲明,就像以前的 C98 標(biāo)準(zhǔn)那樣。 字面值 ? 整型,如: 2343, 123 ? 字符串, 如:“ Hi, my name is XiKangjie\n” ? 字符, 如: ’a’, ‘\n’ 表達(dá)式 表達(dá)式中只支持以下運(yùn)算符: +, ,后綴 ++和 , *, /, %, , =, , =, ==, ||, amp。amp。 布爾表達(dá)式中不支持短路代碼。 在短路代碼中,布爾運(yùn)算符 amp。amp。、 ||和!被翻譯成跳轉(zhuǎn)指令。運(yùn)算符本身不出現(xiàn)在代碼中,布爾表達(dá)式的值是通過(guò)代碼序列中的位置來(lái)表示的。 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 18 語(yǔ)句 ? ifelse 語(yǔ)句 ? switch 語(yǔ)句 ? while 語(yǔ)句 ? dowhile 語(yǔ)句 ? for 語(yǔ)句 ? break 和 continue 語(yǔ)句 函數(shù) 有幾個(gè)內(nèi)建的函數(shù)用來(lái)基本的輸入輸出,它們是: printStr(char str[])。 printStr(string)。 在標(biāo)準(zhǔn)輸出中打印一個(gè)以 null 結(jié)尾的字符串。 printChar(char c)。 printInt(int n)。 readStr(char buffer[], int bufferSize)。 readInt(int n) 這些函數(shù)會(huì)調(diào)用標(biāo)準(zhǔn) C 輸入輸出函數(shù),如 printf 和 scanf,另外,這些函數(shù)名被視為關(guān)鍵字,所以它們是該語(yǔ)言語(yǔ)法的一部 分。 可以自定義函數(shù)。但是,需要知道這里不支持函數(shù)的前向聲明 : int f(int x)。 所以應(yīng)該注意定義函數(shù)的順序,當(dāng) 定義了很多相互調(diào)用的函數(shù) ,會(huì)使程序變得復(fù)雜 。 另外,本子語(yǔ)言 盡可能合理地去實(shí)現(xiàn)作用域,局部變量的作用域和生存周期就像 C語(yǔ)言那樣,但是沒(méi)有全局作用域 ,也就是說(shuō)不能定義全局變量??墒牵诤瘮?shù)內(nèi)部, 可以自由嵌套作用域。比如: void foo() { int x, y。 // 嵌套塊,產(chǎn)生一個(gè)新的內(nèi)部作用域。 { 基于 GUI 的交互式編譯系統(tǒng)之中間代碼生成器的設(shè)計(jì)與實(shí)現(xiàn) 19 int x。 // 嵌套作用域中的定義的 x,它會(huì)將外部作用域中 x 覆蓋。 if (true) { int x。 // if 塊中定義的變量 x, 它會(huì)將外部作用域中 x 覆蓋。 } } } 在這個(gè)子語(yǔ)言中有很 多的限制,比如沒(méi)有類型檢測(cè),只有少量的語(yǔ)義分析等等。所以在此 不是創(chuàng)建一種新的語(yǔ)言,而是以此子語(yǔ)言為例編寫一個(gè)編譯器前端。 符號(hào)表 一個(gè)符號(hào)表必須允許添加新項(xiàng),查找已存在項(xiàng),支持在編譯期間動(dòng)態(tài)增長(zhǎng)符號(hào)表。符號(hào)表可以實(shí)現(xiàn)為線性表和哈希表,線性表雖然容易實(shí)現(xiàn),但表很大時(shí)性能會(huì)很差,所以本設(shè)計(jì)采用哈希表。 本設(shè)計(jì)的符號(hào)表由類 SymbolTable 實(shí)現(xiàn),其內(nèi)部存儲(chǔ)結(jié)構(gòu)由哈希表實(shí)現(xiàn)(這里使用標(biāo)準(zhǔn)容器 unordered_map), KEY 代表詞素( lexeme), VALUE 代表與該詞素對(duì)應(yīng)的符號(hào)( Symbol)。符號(hào)由類 Symbol 實(shí)現(xiàn)。 由于作用域可以嵌套,同時(shí)又要為每個(gè)作用域創(chuàng)建一個(gè)符號(hào)表,所以在類SymbolTable 中,容器 inner_scopes_存儲(chǔ)嵌套的內(nèi)部作用域,容器中的每個(gè)元素為指向內(nèi)部作用域符號(hào)表的指針。指針 outer_scope_指向外部作用域符號(hào)表。在創(chuàng)建一個(gè)符號(hào)表時(shí),要為其傳遞外部作用域符號(hào)表參數(shù),若當(dāng)前創(chuàng)建的符號(hào)表為根符號(hào)表,則默認(rèn)為其傳遞參數(shù) NULL。 在符號(hào)表中插入新項(xiàng)有兩種方式。一是插入 Symbol,二是插入詞素和詞法單元標(biāo)記。 通過(guò)詞素獲取相應(yīng)的符號(hào),由重載運(yùn)算符 []實(shí)現(xiàn)。 class SymbolTable { public: SymbolTable(SymbolTable* prev = NULL
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1