語義分析和中間代碼生成
1、概述
1畦贸、和語法分析、詞法分析的同時進(jìn)行進(jìn)行詞法檢查、語法檢查一樣薄坏,語義分析也伴隨語義檢查趋厉。
- 動態(tài)語義檢查需要生成相應(yīng)的目標(biāo)代碼,它是在運(yùn)行時進(jìn)行的胶坠。
- 靜態(tài)語義檢查是在編譯時完成的君账,主要涉及類型檢查(與參與運(yùn)算的操作數(shù)類型相容)、控制流檢查(保證控制語句有合法的轉(zhuǎn)向點(diǎn))沈善、一致性檢查(如圖標(biāo)識符在同作用域只說明一次乡数,case語句標(biāo)號不能同等)(語義是上下文有關(guān)的,故形式化困難闻牡,目前用屬性文法和語法制導(dǎo)翻譯)
2净赴、語法制導(dǎo)翻譯:為每個產(chǎn)生式配上一個翻譯子程序,并在語法分析同時執(zhí)行這些子程序罩润。
- 自底向上語法制導(dǎo)翻譯:(規(guī)約時調(diào)用翻譯子程序玖翅,每個產(chǎn)生式語義子程序執(zhí)行之后,某些結(jié)果必須作為產(chǎn)生式左部符號語義值暫時保存下來)割以,原LR分析棧擴(kuò)充一項(xiàng)為語義值烧栋。
- 可以輕易畫出語法樹,但是語義分析和計(jì)算過程不太會
2拳球、屬性文法
1、文法符號的屬性:(可以根據(jù)語法樹找珍特,注意復(fù)習(xí))
- 繼承屬性 :從上向下傳遞祝峻,由父節(jié)點(diǎn)屬性計(jì)算得到,由根節(jié)點(diǎn)到分支子結(jié)點(diǎn)扎筒,反映對上下文依賴的特性莱找。(方便地表示程序上下文結(jié)構(gòu)關(guān)系)
- 綜合屬性 :自底向下傳遞,由子節(jié)點(diǎn)屬性計(jì)算得到嗜桌,傳遞方向與綜合屬性相反奥溺。
3、常見的中間語言
1骨宠、抽象語法樹
- 葉節(jié)點(diǎn)表示諸如常量或變量這樣的運(yùn)算對象浮定,其它內(nèi)部節(jié)點(diǎn)表示運(yùn)算符
-
語法規(guī)則中非本質(zhì)部分去掉,得到抽象語法規(guī)則层亿,舉例如下桦卒。
yfs.jpg
2、逆波蘭表示法
-
表達(dá)式的逆波蘭表示:書106
nbl.jpg -
程序語句的逆波蘭表示:
- 賦值語句:x=a+b*c 逆波蘭:xabc*+= (左部匿又,表達(dá)式方灾,=)
- GOTO語句:GOTO<語句標(biāo)號> <語句標(biāo)號>BL
- 條件語句:<順序號>BR表示無條件轉(zhuǎn)移到BR,BT和BF則是條件e真或假轉(zhuǎn)移到順序號。<布爾表達(dá)式e的逆波蘭式><順序號>BT
- 循環(huán)語句:轉(zhuǎn)換為條件語句
練習(xí):
pracnbl.jpg
3裕偿、 三地址代碼:三地址代碼是中間代碼的一種抽象形式洞慎。通常有四元式、三元式和間接三元式三種表示方法嘿棘。(三地址代碼通常包含三個地址劲腿,兩個存運(yùn)算對象,一個存運(yùn)算結(jié)果)
- 四元式:(op,arg1,arg2,result),op是運(yùn)算符蔫巩,arg和result是指針谆棱,可以空缺,單變量只用arg1圆仔。
常用:
四元式.jpg
- 三元式:(op,arg1,arg2)沒有結(jié)果地址垃瞧,三元式標(biāo)號代表結(jié)果地址
- 間接三元式:只記錄不同的三元式,運(yùn)算順序用間接碼表表示
舉例:三元式.jpg
4坪郭、表達(dá)式及賦值語句的翻譯
- 為了實(shí)現(xiàn)由表達(dá)式到四元式的翻譯个从,需要給文法加上語義子程序,以便在規(guī)約的同時執(zhí)行對應(yīng)的語義子程序歪沃,語義子程序所涉及的語義變量嗦锐、語義函數(shù)說明如下:
- 非終結(jié)符E.place表示存放E值的變量名在符號表中的入口地址或臨時變量名的整數(shù)碼。
- 語義函數(shù)newtemp()沪曙,調(diào)用后回送一個代表新臨時變量的整數(shù)碼奕污,臨時變量名按順序可設(shè)為T1、T2......
- emit(op液走,arg1碳默,arg2,result)產(chǎn)生四元式并填入四元式表中缘眶。
- 定義lookup(i.name)是審查i.name是否出現(xiàn)在符號表中嘱根,是返回i.name在符號表中的入口指針,否則返回NULL
一套語義翻譯:ytyyfx0.jpg
ytyyfx1.jpgytyyfy2.jpg
注意語義棧與規(guī)約同步巷懈,狀態(tài)棧轉(zhuǎn)換斜對角法
ytyyfy3.jpg
最后再進(jìn)行手寫演算
- 布爾表達(dá)式的翻譯
- 布爾表達(dá)式一般由運(yùn)算符與運(yùn)算對象組成该抒,運(yùn)算符為布爾運(yùn)算符,(非顶燕,與凑保,或)。運(yùn)算對象也可以為布爾變量割岛,也可為常量或關(guān)系表達(dá)式愉适。關(guān)系表達(dá)式的運(yùn)算對象為算術(shù)表達(dá)式
- 確定一個表達(dá)式的真假出口:
-
例子:布爾表達(dá)式四元式.jpg
-
自己試試:自己嘗試.jpg
-
嘗試?yán)斫猓?div id="5v7jvht" class="image-package">
819759651.jpg