Contents

编译引论(第六章)

语义分析及中间代码生成

中间代码

  1. 中间代码生成在编译程序中的位置

    https://cdn.jsdelivr.net/gh/adan-ning/images/202405031336814.png

  2. 中间代码

    **即中间语言,独立于机器的,复杂性介于源语言和机器语言之间的一种表示形式。**中间代码是高级程序语言中,各种语法成分的语义结构表示;它介于源语言和目标语言之间。

  3. 采用中间语言的好处

    1. 便于进行与机器无关的代码优化工作
    2. 使编译程序改变目标机更容易;
    3. **使编译程序的结构在逻辑上更为简单明确。**以中间语言为界面,编译前端和后端的接口更清晰。

中间语言-后缀式

  1. 后缀式

    1. 后缀表示法也叫逆波兰表示法,它是最简单一种中间代码表示法,主要用于表示算数表达式。
    2. 即将运算对象写在前面,把运算符写在后面的表示法。
    3. 定义9.1 后缀式的递归定义如下:
      1. 如果E是一个变量或常量,则E的后缀式就是E本身;
      2. 如果E是形如E1 op E2的表达式,其中op是任意的二元运算符 ,那么, E的后缀式为E1’ E2’ op,其中E1’和 E2’分别是E1和E2的后缀式;
      3. 如果E是(E1)形式的表达式,那么,E1的后缀式就是E的后缀式。
  2. 后缀式的例子

    (a+b) *(a+c) 的后缀式为 ab+ac+*

    -a+b+c/d* (a+c) 的后缀式为 a-b+cd/ac+*+

  3. 后缀式的特点

    1. 后缀式形式的表达式计算顺序唯一,无需使用括号来明确计算顺序;

    2. 只要知道每个算符的目数,计算参与运算数的个数,对后缀式从左到右进行扫描,就能对它进行唯一的分解。例如

      https://cdn.jsdelivr.net/gh/adan-ning/images/202405031340017.png

    3. 表达式和与它对应的逆波兰表达式中的运算对象顺序是完全一致的,即表达式中的所有运算对象,均按原序排在其逆波兰表达式中

      -a+b+c/d* (a+c) 的后缀式为 a-b+cd/ac+*+

    4. 后缀式特别适合利用栈的结构进行计算

      1. 自左向右扫描表达式的后缀表示,每遇到一个对象就把它压入栈内
      2. 每遇到一个算符,就从栈顶取出相应个数的运算对象进行计算,再将结果压入栈顶
      3. 最后,栈顶元素就是表达式的运算结果

三地址代码

  1. 三地址代码的一般形式的语句构成的序列

    x:=y op z

    x,y,z: 名字,常数,编译时产生的临时变量;

    op: 运算符号(如定点运算符,浮点运算符,逻辑运算符等)

    称为三地址代码的原因:每条语句通常包含三个地址,两个用来表示操作数,一个用来存放结果。如表达式x+y*z的三地址代码为:

    $T_1$:=y*z

    $T_2$:=x+$T_1$

    具体实现:三地址代码是中间代码的一种抽象形式。在编译过程中,三地址代码语言的具体实现通常有四元式和三元式

    https://cdn.jsdelivr.net/gh/adan-ning/images/202405031343961.png

语法制导翻译

对语法分析后的语法单位要进行语义分析,包括 两个阶段:

  1. 静态语义审查;
  2. 如果静态语义正确,生成中间代码

静态语义审查

  1. 作用:验证语法结构合法的程序是否真正有意义

  2. 包含的内容

    类型检查

    1. 条件表达式的类型是不是布尔型
    2. 验证指针地址访问只作用于指针
    3. 函数必须有正确的参数个数和参数类型

什么是语法制导翻译

https://cdn.jsdelivr.net/gh/adan-ning/images/202405031346838.png

语法制导翻译(syntax_directed translations) 是在语法分析过程中,随着分析(推导或归约)的逐步进 展,每识别出一个语法结构,根据文法的每个规则所对 应的语义子程序进行翻译的方法;核心技术是构造属性翻译文法 —-在原文法产生式中插入语义动作符号,借以指明属性文法中属性求值时机和顺序

通俗地说,所谓语法制导翻译技术,是指

语法分析技术 +属性翻译文法构造技术

语法制导翻译的基本思想

  1. 如何表示语义信息
    1. 为CFG的文法符号设置语义属性,用来表示语法成分对应的语义信息
  2. 如何计算语义属性
    1. 文法符号的语义属性值是用来与文法符号所在产生式(语法规则)相关联的语义规则来计算
    2. 对于给定的输入串x,构建x的语法分析树,并利用与产生式(语法规则)相关联的语义规则来计算分析树中各结点对应的语义属性值

两个概念

  1. 语义规则语法规则(产生式)联系起来要涉及两个概念
    1. 语义制导定义
    2. 语法制导翻译方案

语法制导定义

  1. SDD是对CFG的推广

    1. 将每个文法符号和一个语义属性集合相关联
    2. 将每个产生式和一组语义规则相关联,这些规则用于计算该产生式中各文法符号的属性值

    https://cdn.jsdelivr.net/gh/adan-ning/images/202405031357727.png

  2. 如果X是一个文法符号,a是X的一个属性,则用X,a表示属性a在某个标号为X的分析树结点上的值

语法制导翻译方案

  1. SDT是在产生式右部嵌入了程序片段的CFG,这些程序片段称为语义动作。按照惯例,语义动作放在花括号内

    https://cdn.jsdelivr.net/gh/adan-ning/images/202405031359972.png

    一个语义动作在产生式中的位置决定了这个动作的执行时间

SDD与SDT

  1. SDD
    1. 是关于语言翻译的高层次规格说明
    2. 隐蔽了许多具体实现细节,使用户不必显式地说明翻译发生的顺序
  2. SDT
    1. 可以看作是对SDD的一种补充,是SDD的具体实施方案
    2. 显式地指明了语义规则的计算顺序,以便说明某些实现细节

语法制导定义SDD

  1. 语法制导定义SDD是对CFG的推广
    1. 将每个文法符号和一个语义属性集合相关联
    2. 将每个产生式和一组语义规则相关联,用来计算该产生式中各文法符号的属性值
  2. 文法符号的属性
    1. 综合属性(synthesized attribute)
    2. 继承属性(inherited attribute)

综合属性(synthesized attribute)

  1. 在分析树结点N上的非终结符A的综合属性只能通过N的子结点或N本身的属性值来定义

    1. https://cdn.jsdelivr.net/gh/adan-ning/images/202405031406259.png
  2. 终结符可以具有综合属性。终结符的综合属性值是由词法分析器提供的词法值,因此在SDD中没有计算终结符属性值的语义规则

  3. 带有综合属性的SDD

    https://cdn.jsdelivr.net/gh/adan-ning/images/202405031409241.png

继承属性(inherited attribute)

  1. 在分析树结点N上的非终结符A的继承属性只能通过N的父结点、N的兄弟结点或N本身的属性值来定义

    1. https://cdn.jsdelivr.net/gh/adan-ning/images/202405031407467.png
  2. 终结符没有继承属性。终结符从词法分析器处获得的属性值被归为综合属性值

  3. 带有继承属性的SDD

    https://cdn.jsdelivr.net/gh/adan-ning/images/202405031409416.png

属性文法(Attribute Grammar)

  1. 一个没有副作用的SDD有时也称为属性文法
    1. 属性文法的规则仅仅通过其它属性值和常量来定义一个属性值
    2. https://cdn.jsdelivr.net/gh/adan-ning/images/202405031411354.png

语法制导翻译方案SDT

  1. 语法制导翻译方案(SDT)是在产生式右部中嵌入了程序片段(称为语义动作)的CFG
    1. https://cdn.jsdelivr.net/gh/adan-ning/images/202405031412121.png
  2. SDT可以看作是SDD的具体实施方案
  3. 本节主要关注如何使用SDT来实现两类重要的SDD,因为在这两种情况下,SDT可在语法分析过程中实现>基本文法可以使用LR分析技术,且SDD是S属性的
  4. 基本文法可以使用LL分析技术,且SDD是L属性的

将S-SDD转换为SDT

  1. 将一个S-SDD转换为SDT的方法:将每个语义动作都放在产生式的最后
    1. https://cdn.jsdelivr.net/gh/adan-ning/images/202405031414560.png

算术表达式四元式属性翻译文法设计

  1. 算术表达式四元式属性翻译文法设计

    1. https://cdn.jsdelivr.net/gh/adan-ning/images/202405031415080.png

      https://cdn.jsdelivr.net/gh/adan-ning/images/202405031415284.png

      https://cdn.jsdelivr.net/gh/adan-ning/images/202405031416887.png