笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

十六讲-语义分析与中间代码生成一

16.1中间语言

中间语言的特点和作用

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

16.2 常用的中间语言

  • 后缀式,逆波兰表示
  • 图表示:抽象语法树(AST)、有向无环图(DAG)
  • 三地址代码 三元式 四元式 间接三元式

16.2.1 后缀式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

将表达式翻译成后缀式的属性文法

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

中缀表达式翻译成后缀式的翻译模式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

以上为 a+b+c 翻译成后缀式的例子

16.2.2 图表示法

  • 抽象语法树(AST)
  • 有向无环图(DAG)

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

抽象语法树vs. 有向无环图

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

赋值语句翻译成抽象语法树的属性文法

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

16.3 三地址代码

三地址代码 x:=y op z

三地址代码可以看成是抽象语法树或有向无环 图的一种线性表示

抽象语法树vs. 三地址代码

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

有向无环图vs. 三地址代码

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

优化一棵公用子树

三地址语句的种类

  • x:=yopz
  • x:=opy 、
  • x:=y
  • goto L
  • ifxrelopygotoL或ifagotoL
  • 传参、转子:paramx、callp,n
  • 返回语句:returny
  • 索引赋值:x:=y[i]、x[i]:=y
  • 地址和指针赋值:x:=&y、x:=*y、*x:=y

三地址语句——四元式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成
通过引用语句的位置来简化:
笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

=======
笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

三地址语句——间接三元式

  • 三元式表+间接码表
  • 间接码表
  • 一张指示器表,按运算的先后次序列出有关三元式 在三元式表中的位置
  • 优点 方便优化,节省空间

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

十七讲-语义分析与中间代码生成二

17.1 赋值语句的翻译

17.1.1 简单算术表达式及赋值语句

  • 赋值语句的形式 id:=E
  • 赋值语句的意义(功能) 对表达式E求值并置于变量T中 、id.place:=T

17.1.2 赋值语句生成三地址代码的S-属性文法

  • 非终结符号S有综合属性S.code,它代表赋值 语句S的三地址代码
  • 非终结符号E有两个属性
    • E.place表示存放E值的单元的名字(地址)
    • E.code表示对E求值的三地址语句序列
  • 函数newtemp的功能是,每次调用它时,将返 回一个不同的临时变量名字,如T1,T2,…

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

17.1.3 产生赋值语句三地址代码的翻译模式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

17.2 数组元素引用的翻译

17.2.1 数组元素的引用

数组元素地址的计算 :

  • X:=A[i 1,i2,…,ik]+Y
  • A[i1,i2,…,ik]:=X+Y

数组元素地址计算:

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

17.2.2 带数组元素引用的赋值语句

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

带数组元素引用的赋值语句翻译模式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成
笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

17.3 类型转换

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

产生式E→E1+E2 的语义动作

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

十八讲-语义分析与中间代码生成三

18.1 布尔表达式及其计算

18.1.1 布尔表达式的简介

  • 文法 E → E orE | E and E | notE | (E) | iropi| i
  • 用途 用于逻辑演算,计算逻辑值 用于控制语句的条件式

18.2.1 计算布尔表达式的两种方法

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

18.2 按数值表示法翻译

18.2.1 数值表示法

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

18.2.2 关于布尔表达式的数值表示法的翻译模式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

18.3 带优化翻译布尔表达式

18.3.1 作为条件控制的布尔式翻译

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

条件语句的翻译

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

18.3.2 布尔表达式的属性文法

产生布尔表达式三地址代码的属性文法

  • 语义函数newlabel,返回一个新的符号标号
  • 对于一个布尔表达式E,设置两个继承属性
    • E.true是E为‘真’时控制流转向的标号
    • E.false是E为‘假’时控制流转向的标号
  • E.code记录E生成的三地址代码序列

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

18.3.3 根据属性文法翻译布尔表达式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

18.3.4 布尔表达式的翻译

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

18.3.5 布尔表达式的一遍扫描翻译模式

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

布尔表达式的文法

  • E → E1or E2
  • E → E1and E2

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

布尔表达式的翻译模式:

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成
按照本节所讲的一遍扫描的翻译模式工作,当一个布尔表达式规约分析翻译完成时,该布尔表达式生成的所有四元式都是完整的,没有需要回填的四元式。(错)
笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

十九讲-语义分析和中间代码生成四

19.1 常用的控制语句

  • S → if E then S1
  • S → if E then S1else S2
  • S → while E do S1
  • 其中E为布尔表达式

19.2 控制语句的属性文法

19.2.1 if语句的属性文法

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

19.2.2 while语句的属性文法

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成

19.3 控制语句的属性计算

(建议这章的内容看视频,,,推导过程太多了。。

笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成