编译原理-中间代码生成

 

1.概述

1.1 定义

    源程序的一种内部表示,不依赖目标机的结构,易于机械生成目标代码的中间表示。如果不生成中间代码而是直接生成机器语言或者汇编语言形式的目标代码,优点是编译时间短,缺点是目标代码执行效率和质量都比较低,移植性差。

1.2 表示形式

    逆波兰式(后缀式)、三地址码(三元式、四元式)、抽象语法树、有向无环图。

1.3 地位

    如下所示:

 

2.逆波兰式

2.1 定义

      把运算量(操作数)写在前面,把运算符写在后面,因此又称为后缀表示法

2.2 案例

      如下所示:

表达式语句 逆波兰式
a+b ab+
(a+b)*c ab+c*
a+b*c abc*+
a=b*c+b*d abc*bd*+=

 

3.三元地址

3.1 定义

    指每条代码包含一个运算和三个地址,两个地址用于存放运算对象,一个地址用于存放运算结果。其一般形式为

x=y op z。

3.2 四元式

3.2.1 定义

    一个四元式具有四个域的记录结构,表示为:(op,arg1,arg2,result)。op为运算符;result存放运算结果;arg为运算对象,如果为空,则使用空格,留出位置。

3.2.2 案例

例:将 a=b*c+b*d用四元式形式
写成三地址码的赋值语句形式如下:
    1) t1 = b*c
    2) t2 = b*d
    3) t3 =t1+t2
    4) a = t3
写成四元形式如下:
    1) (*,b,c,t1)
    2) (*,b,d,t2)
    3) (+,t1,t2,t3)
    4) (=,t3, ,a)

3.3 三元式

3.3.1 定义

       一个三元式具有三个域的记录结构,表示为:(op,arg1,arg2)。

3.3.2 案例

例:将 a=b*c+b*d用三元形式
(1) (*,b,c)
(2) (*,b,d)
(3) (+,(1),(2))
(4) (=,(3),a)

3.4 抽象语法树

3.4.1 定义

     抽象语法树(Abstract Syntax Code,AST)是语法树的一种简化形式,是源程序的抽象语法结构的树状表示,树的每个节点都表示源代码中的一种结构。

3.5 有向无环图

3.5.1 定义

   有向无环图(Directed Acyclic Graph,简称DAG)对表达式中的每个子表达式都有一个结点,内部结点表示运算符,它的孩子代表运算分量。DAG中代表公共子表达式的结点只出现一次,具有多个父结点。

 

 

 

 

 

你可能感兴趣的:(编译原理)