編譯原理系列之九 中間代碼生成


中間代碼生成

  • 中間代碼也與機器無關。

  • 常見中間表示形式

    1. 逆波蘭式:

    2869373-254d1eeab17fa4c9.png

    逆波蘭式

    中綴表達式轉逆波蘭式:按照算術表達式的計算順序 根據操作數1、(操作數2)、運算符的順序化成一個部分的后綴式,將這個后綴式在算術表達式中看成一個操作數繼續按照上面方法分析。

    逆波蘭式轉中綴表達式:根據逆波蘭式的序列從左向右找運算符,找到后從這個運算符開始向前找出緊鄰的操作數2、操作數1並化成算術表達式,將這個算術表達式看成一個操作數,繼續往后尋找操作符,重復以上步驟。

    注意:操作數均由一個字母表示。

    1. 抽象語法樹AST:

      抽象語法樹中每一個子樹的根結點都對應一種動作或運算,它的所有子結點對應該動作或運算的參數或運算數。
      參數或運算數也可以是另一子樹,代表另一動作或運算。

      將AST中相同的子樹合並,這種改進的AST叫做有向無環圖DAG;

    2869373-7adaf4e6dd7bb33e.png

    AST與DAG

  1. 三地址碼TAC

    x=y op z或者四元組的形式(op,y,z,x)

2869373-ca9985708ef9937b.png

TAC

2869373-3d8391b3c2c2e7cc.png

其他TAC語句

  • 常用語句的語法制導翻譯 :

    語義過程GEN表示產生一個TAC或四元式,並且填入TAC或四元式表中。
    語義過程Newtemp表示生成一個臨時變量,每調用一次,生成一新的臨時變量。
    語義變量E. place,用來存放 E 的值的存儲位置。
    語義變量id.place , id 對應的存儲位置。

    1. 簡單賦值語句的翻譯 :

    2869373-87b61fcf823c01ba.png

    賦值語句

  1. 布爾表達式的翻譯 :

    2869373-e04f6929a9d2cf69.png

    布爾表達式

    拉鏈與回填:

     

    2869373-2a22189e8b3d2171.png

    拉鏈與回填

2869373-a6850c37f0430fd0.png

=拉鏈與回填


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM