kN_編譯原理_3


大學(xué)期間的筆記補(bǔ)全铅歼。編譯原理內(nèi)容太多分幾次公壤。
課本《編譯原理》第三版,陳火旺等編著谭贪。
筆記總目錄:
一境钟、引論
二、高級語言及其語法描述
三俭识、詞法分析
四慨削、語法分析——自上而下分析
五、語法分析——自下而上分析
六套媚、屬性文法和語法制導(dǎo)翻譯
七缚态、語義分析和中間代碼生成
八、優(yōu)化
九堤瘤、目標(biāo)代碼生成


編譯原理結(jié)束玫芦!

六、屬性文法和語法制導(dǎo)翻譯

6.1 屬性文法

上下文無關(guān)文法的基礎(chǔ)上本辐,在描述語義動作時桥帆,為每個文法符號(終結(jié)符和非終結(jié)符)配備若干相關(guān)的“值”,如“類型”慎皱,“地址”等老虫,稱為屬性

對文法的每個產(chǎn)生式配備一組屬性計算規(guī)則稱為語義規(guī)則茫多。

每個文法符號聯(lián)系于一組屬性祈匙,且對每個產(chǎn)生式都給出其語義規(guī)則的文法稱為屬性文法

6.1.1 屬性和語義規(guī)則

  1. 屬性的特征

    • 代表與文法符號相關(guān)信息天揖,如類型夺欲、值、代碼序列今膊、符號表內(nèi)容等些阅;
    • 可以進(jìn)行計算和傳遞;
  2. 屬性的分類

    • 綜合屬性
    • 繼承屬性


      繼承屬性

    對于一些產(chǎn)生式中的屬性而言斑唬,

    任意一個產(chǎn)生式左邊的非終結(jié)符帶有的屬性是:

    • 綜合屬性:產(chǎn)生式右邊包含語法生成樹子節(jié)點(diǎn)的屬性扑眉,
    • 繼承屬性:產(chǎn)生式右邊僅僅由語法生成樹兄弟節(jié)點(diǎn)或父節(jié)點(diǎn)屬性構(gòu)成。

    若所有產(chǎn)生式(不再有還未寫出的產(chǎn)生式)赖钞,屬性僅在產(chǎn)生式右邊的非終結(jié)符出現(xiàn),則是繼承屬性聘裁。

  3. 注意:

    • 終結(jié)符只有綜合屬性雪营,由詞法分析器提供。

    • 非終結(jié)符既可有綜合屬性也可有繼承屬性衡便,文法開始符號的所有繼承屬性作為屬性計算前的初始值献起。

    • 對出現(xiàn)在產(chǎn)生式右邊的繼承屬性和出現(xiàn)在產(chǎn)生式左邊的綜合屬性都必須提供一個計算規(guī)則洋访。屬性計算規(guī)則中只能使用相應(yīng)產(chǎn)生式中的文法符號的屬性;

      出現(xiàn)在產(chǎn)生式左邊的繼承屬性和出現(xiàn)在產(chǎn)生式右邊的綜合屬性不由所給的產(chǎn)生式的屬性計算規(guī)則進(jìn)行計算谴餐,它們由其它產(chǎn)生式的屬性規(guī)則計算或者由屬性計算器的參數(shù)提供姻政。

      這也是為什么之前說的時候前提是 “對于一個產(chǎn)生式中的屬性而言“。

  4. S-屬性文法

    僅僅使用綜合屬性的屬性文法岂嗓。

    • 在語法樹中汁展,一個結(jié)點(diǎn)的綜合屬性的值由其子結(jié)點(diǎn)的屬性值確定。
    • 使用自底向上的方法在每一個結(jié)點(diǎn)處使用語義規(guī)則計算綜合屬性的值厌殉。

    S-屬性文法非常適合配合LR分析法進(jìn)行計算食绿。

  5. L-屬性文法

    如果每個產(chǎn)生式A→X_1...X_i,X_{i+1},...X_n的每條語義規(guī)則計算的屬性 A 的綜合屬性;或者是 X_i 的繼承屬性公罕,但它僅依賴:

    • 該產(chǎn)生式中 X_i 左邊符號 X_1,X_2,...X_{i-1} 的屬性器紧;
    • A 的繼承屬性

    S-屬性文法屬于L-屬性文法。

    左遞歸文法不可用LR(1)分析法楼眷。

6.2 語法制導(dǎo)翻譯

直觀上說就是為每個產(chǎn)生式配上一個翻譯子程序(稱語義動作或語義子程序)铲汪,并且在語法分析的同時執(zhí)行它。

語義動作一方面規(guī)定了產(chǎn)生式產(chǎn)生的符號串的意義罐柳,另一方面又按照這種意義規(guī)定了生成中間代碼應(yīng)做的基本動作掌腰。

定義:在語法分析過程中,當(dāng)一個產(chǎn)生式獲得匹配(自上而下分析)或用于歸約(自下而上分析)時硝清,此產(chǎn)生式對應(yīng)的語義子程序進(jìn)入工作辅斟,完成既定翻譯任務(wù),產(chǎn)生中間代碼芦拿。

  1. 作用

    • 如果語義動作不是簡單的計值程序士飒,而是某種中間代碼的產(chǎn)生程序,那么隨著語法分析的進(jìn)展蔗崎,這種代碼也逐步生成酵幕。

    • 語法制導(dǎo)翻譯的作用

      • 產(chǎn)生中間代碼
      • 產(chǎn)生目標(biāo)指令
      • 對輸入串進(jìn)行解釋執(zhí)行

七、語義分析和中間代碼產(chǎn)生

7.1 中間語言

中間語言(復(fù)雜性界于源語言和目標(biāo)語言之間)的好處:

  • 便于進(jìn)行與機(jī)器無關(guān)的代碼優(yōu)化工作
  • 易于移植
  • 使編譯程序的結(jié)構(gòu)在邏輯上更為簡單明確

7.1.1 常用中間語言

  1. 后綴式缓苛,逆波蘭表示

    • 表達(dá)式:-(a+b)*(c+d)-(a+b+c)
    • 后綴式:ab+-cd+*ab+c+-
  2. 圖表示

    • DAG
    • 抽象語法樹
  3. 三地址代碼

    • 三元式
    • 四元式
    • 間接三元式

7.1.2 三地址代碼

  1. 四元式

    一個帶有四個域的記錄結(jié)構(gòu)芳撒,這四個域分別稱為op, arg1, arg2及result。

    例子:計算a:=b*(-c)+b*(-c):


    計算過程
    • 四元式之間的聯(lián)系通過臨時變量實(shí)現(xiàn)未桥。
    • 單目運(yùn)算只用arg1域笔刹,轉(zhuǎn)移語句將目標(biāo)標(biāo)號放入result域。
    • arg1,arg2,result通常為指針冬耿,指向有關(guān)名字的符號表入口舌菜,且臨時變量填入符號表。

7.2 說明語句

7.3 賦值語句的翻譯

翻譯模式

7.4 布爾表達(dá)式的翻譯

  • 布爾表達(dá)式:用布爾運(yùn)算符把布爾量亦镶、關(guān)系表達(dá)式聯(lián)結(jié)起來的式子日月。

    • 布爾運(yùn)算符:and, or, not 袱瓮;
    • 關(guān)系運(yùn)算符 <,≤,=, ≠,> ,≥
  • 布爾表達(dá)式的兩個基本作用:

    • 用于邏輯演算,計算邏輯值;
    • 用于控制語句的條件式.
  • 產(chǎn)生布爾表達(dá)式的文法:

    • E→E or E | E andE | ?E | (E) | id rop id | id
    • 運(yùn)算符優(yōu)先級:布爾運(yùn)算由高到低:not > and > or爱咬,同級左結(jié)合關(guān)系運(yùn)算符同級尺借,且高于布爾運(yùn)算符
  • 兩種計算方法:

    1. 計算邏輯值

      • 如同計算算術(shù)表達(dá)式一樣,一步步算
      • 采用優(yōu)化措施(短路計算)
    2. 作為條件控制

      條件語句 if E then S1 else S2 。賦予 E 兩種出口:一真一假精拟。

      6-3.png

      if語句(條件語句)的四元式怎么寫燎斩?

      • B.trueB.false:因為在歸約B的時候并不知道 S_1,S_2 以及他們的入口地址,跳轉(zhuǎn)位置不明確串前,所以必須要把跳轉(zhuǎn)信息記錄下來等待之后補(bǔ)充具體跳轉(zhuǎn)的地址瘫里。故將跳轉(zhuǎn)信息存入 B.true/B.false

      • 兩遍掃描

        • 為給定的輸入串構(gòu)造一棵語法樹荡碾;
        • 對語法樹進(jìn)行深度優(yōu)先遍歷谨读,進(jìn)行語義規(guī)則中規(guī)定的翻譯。
      • 如何一遍掃描坛吁?

        四元式merge時改變的第四位的數(shù)值不是表示跳轉(zhuǎn)劳殖,而是表示(暫時的)鏈接,便于之后找到了跳轉(zhuǎn)地址全部遍歷重寫拨脉。

        四元式序列求解過程

        思路總結(jié)_1

        思路總結(jié)_2

        思路總結(jié)_3

7.5 控制語句的翻譯

控制語句在歸約的時候:

  • if-then-else:只有N的時候會產(chǎn)生jump中間語句哆姻,其他操作都只是改變跳轉(zhuǎn)地址
  • while-do:只需要在最后生成新的jump中間語句,其他操作都只是改變跳轉(zhuǎn)地址
If語句的翻譯
if語句翻譯
  • N的作用:為了在if-then-else歸約時不需要在兩種結(jié)果之間加上強(qiáng)制跳出的中間代碼玫膀。
while語句的翻譯
while語句翻譯
  • 不需要N矛缨,因為跳轉(zhuǎn)語句插入在末尾,不需要復(fù)雜的操作帖旨。
  • while-do語句在歸約為 S 時要產(chǎn)生一條中間代碼箕昭,用戶在do的內(nèi)容執(zhí)行完之后跳回while的開始重新循環(huán)
  • while-do語句歸約后false的出口地址寫成 S.next
  • 只要是 S(Statement)歸約出來時解阅,一定會產(chǎn)生一個空鏈表指向next(但不會產(chǎn)生中間代碼)
goto語句
  • goto L1 有兩種情況:

    1. 先定義L1落竹,再出現(xiàn)goto L1
    2. 先出現(xiàn)goto L1(L1地址未知),再出現(xiàn)L1
  • 解決:符號表

    當(dāng)出現(xiàn)情況1货抄,掃描到L1時先將L1的信息填入符號表述召,定義否為“是”,地址為L1的起始地址

    當(dāng)出現(xiàn)情況2蟹地,每當(dāng)掃描到goto卻沒有L1积暖,先將L1插入,定義否為“否”怪与,地址為goto語句的next信息夺刑;直到掃描到L1,將定義否改為“是”琼梆,為地址中g(shù)oto語句的next信息賦值性誉,再將地址改為L1的起始地址。

    名字 類型 定義否 地址
    L1 標(biāo)號 是/否 L1起始地址 / 傳遞的goto語句的next
case語句
  • 翻譯法1:L1-if-goto-L2-if-goto-......
  • 翻譯法2:L1-L2-......-if-goto-if-goto-......

7.6 過程調(diào)用的處理

  • 過程調(diào)用文法:
    • S -> call id (Elist) :for隊列queue中的每一項p茎杂,有emit('param' p)错览;循環(huán)之后emit('call' id.place)
    • Elist -> Elist, E :將E.place加入到queue的隊尾
    • Elist -> E :初始化queue僅包含E.place

八、優(yōu)化

優(yōu)化:對程序進(jìn)行等價變換煌往,使得從優(yōu)化后的程序出發(fā)倾哺,能生成更有效的目標(biāo)代碼。

8.1 概述

  1. 優(yōu)化原則:
    • 等價原則:優(yōu)化前后不改變程序運(yùn)行結(jié)果
    • 有效原則:使優(yōu)化后產(chǎn)生的目標(biāo)代碼運(yùn)行時間較短刽脖,占用儲存空間較小
    • 合算原則:較低的代價取得較好的效果
  2. 三個不同級別
    • 局部
    • 循環(huán)
    • 全局
  3. 優(yōu)化的種類
    • 刪除多余運(yùn)算(刪除公用子表達(dá)式)
    • 復(fù)寫傳播
    • 刪除無用賦值
    • 代碼外提(循環(huán)等)
    • 強(qiáng)度消弱(如:冪運(yùn)算->乘法運(yùn)算羞海,乘除->加減)
    • 變換循環(huán)控制條件
    • 合并已知量(包括一些簡單的預(yù)計算)

8.2 局部優(yōu)化

  1. 基本塊:

    指程序中一順序語句執(zhí)行序列,其中只有一個入口(第一條語句)和一個出口(最后一條(goto)語句)

    一條三地址語句x:=y+z曲管,則稱x定值引用y和z却邓。

    活躍:某個變量是活躍的,意味著這個變量在之后的程序(此基本塊或其他基本塊)中被引用院水。

    • 劃分基本塊:

      • 求出入口語句

        • 第一個語句

        • 能由條件轉(zhuǎn)移/無條件轉(zhuǎn)移語句轉(zhuǎn)移到的語句

        • 緊跟在條件轉(zhuǎn)移語句后面的語句

          無條件轉(zhuǎn)移后面的語句不作為入口語句原因:下一句除非有別的語句跳轉(zhuǎn)(在跳轉(zhuǎn)邏輯被作為入口)腊徙,否則永遠(yuǎn)都無法被訪問到,不需要作為入口語句檬某。

      • 確定基本塊

        • | 入口語句 -> |下一個入口語句
        • | 入口語句 -> 轉(zhuǎn)移語句 |
        • | 入口語句 -> 停語句 |
      • 未被納入某一基本塊的語句從程序中刪除

  2. 基本塊中的優(yōu)化措施

    • 刪除公共子表達(dá)式
    • 刪除無用賦值
    • 合并已知量
    • 臨時變量改名
    • 交換語句的位置
    • 代數(shù)變換
  3. 基本塊的DAG表示

    基本塊的DAG是一種帶有下述標(biāo)記附加信息的DAG

    • 葉節(jié)點(diǎn)以一標(biāo)識符或常數(shù)作為標(biāo)記撬腾,表示該點(diǎn)代表該變量或常數(shù)的值

    • 內(nèi)部節(jié)點(diǎn)以一運(yùn)算符作為標(biāo)記,表示該節(jié)點(diǎn)應(yīng)用該運(yùn)算符對其后繼節(jié)點(diǎn)的值進(jìn)行運(yùn)算

    • 任意節(jié)點(diǎn)可能附加一個或多個標(biāo)識符恢恼,表示這些變量具有該節(jié)點(diǎn)所代表的值


      構(gòu)建DAG_1
      構(gòu)建DAG_2
      構(gòu)建DAG_3

8.3 循環(huán)優(yōu)化

九民傻、目標(biāo)代碼生成

9.1 基本問題

代碼生成是把語法分析或優(yōu)化后的中間代碼變換成目標(biāo)代碼。

著重考慮的問題:

  • 目標(biāo)代碼長度
  • 充分利用寄存器场斑,減少訪問貯存器的次數(shù)
  • 充分利用指令系統(tǒng)的特點(diǎn)

代碼生成器的輸入:源程序中間代碼漓踢,符號表的信息

代碼生成器的輸出:目標(biāo)代碼(3種形式:立即執(zhí)行的機(jī)器語言代碼、待裝配的機(jī)器語言模塊和簸、匯編語言代碼)

考慮方法:

  1. 指令選擇
  2. 寄存器分配
  3. 計算順序選擇

9.2 目標(biāo)機(jī)器模型

機(jī)器指令_1
機(jī)器指令_2

9.3 一個簡單的代碼生成器

簡單的代碼生成器_1
簡單的代碼生成器_2
  1. 計算信息

    計算信息_1
    計算信息_2
    計算信息_3
  2. 分配寄存器

    盡量延遲 STORE 的時間彭雾。


    寄存器分配
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锁保,隨后出現(xiàn)的幾起案子薯酝,更是在濱河造成了極大的恐慌,老刑警劉巖爽柒,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吴菠,死亡現(xiàn)場離奇詭異,居然都是意外死亡浩村,警方通過查閱死者的電腦和手機(jī)做葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來心墅,“玉大人酿矢,你說我怎么就攤上這事榨乎。” “怎么了瘫筐?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵蜜暑,是天一觀的道長。 經(jīng)常有香客問我策肝,道長肛捍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任之众,我火速辦了婚禮拙毫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棺禾。我一直安慰自己缀蹄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布帘睦。 她就那樣靜靜地躺著袍患,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竣付。 梳的紋絲不亂的頭發(fā)上诡延,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音古胆,去河邊找鬼肆良。 笑死,一個胖子當(dāng)著我的面吹牛逸绎,可吹牛的內(nèi)容都是我干的惹恃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼棺牧,長吁一口氣:“原來是場噩夢啊……” “哼巫糙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颊乘,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤参淹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萝映,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了开呐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖筐付,靈堂內(nèi)的尸體忽然破棺而出卵惦,到底是詐尸還是另有隱情,我是刑警寧澤瓦戚,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布鸵荠,位于F島的核電站,受9級特大地震影響伤极,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姨伤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一哨坪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乍楚,春花似錦当编、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至臊泌,卻和暖如春鲤桥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渠概。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工茶凳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人播揪。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓贮喧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親猪狈。 傳聞我的和親對象是個殘疾皇子箱沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 大學(xué)期間的筆記補(bǔ)全。編譯原理內(nèi)容太多分幾次雇庙。課本《編譯原理》第三版谓形,陳火旺等編著。筆記總目錄:一状共、引論二套耕、高級語言...
    嘟嚕嘟嚕啪閱讀 1,172評論 0 0
  • 個人學(xué)習(xí)批處理的初衷來源于實(shí)際工作;在某個迭代版本有個BS(安卓手游模擬器)大需求峡继,從而在測試過程中就重復(fù)涉及到...
    Luckykailiu閱讀 4,702評論 0 11
  • 特別說明冯袍,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 457評論 0 0
  • 大學(xué)期間的筆記補(bǔ)全。編譯原理內(nèi)容太多分幾次康愤。課本《編譯原理》第三版儡循,陳火旺等編著。筆記總目錄:一征冷、引論二择膝、高級語言...
    嘟嚕嘟嚕啪閱讀 746評論 0 1
  • 爸爸去遠(yuǎn)方為我打拼肴捉,媽媽一人在家。 在我上學(xué)期間叔收,唯一擔(dān)心的是媽媽一人在家齿穗,她會孤獨(dú),會無聊饺律。 這次回家過年窃页,教媽...
    007王小草閱讀 151評論 0 1