笔记-编译原理-第16、17、18、19章-语义分析与中间代码生成
十六讲-语义分析与中间代码生成一
16.1中间语言
中间语言的特点和作用
16.2 常用的中间语言
- 后缀式,逆波兰表示
- 图表示:抽象语法树(AST)、有向无环图(DAG)
- 三地址代码 三元式 四元式 间接三元式
16.2.1 后缀式
将表达式翻译成后缀式的属性文法
中缀表达式翻译成后缀式的翻译模式
以上为 a+b+c
翻译成后缀式的例子
16.2.2 图表示法
- 抽象语法树(AST)
- 有向无环图(DAG)
抽象语法树vs. 有向无环图
赋值语句翻译成抽象语法树的属性文法
16.3 三地址代码
三地址代码 x:=y op z
三地址代码可以看成是抽象语法树或有向无环 图的一种线性表示
抽象语法树vs. 三地址代码
有向无环图vs. 三地址代码
优化一棵公用子树
三地址语句的种类
- 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
三地址语句——四元式
通过引用语句的位置来简化:
=======
三地址语句——间接三元式
- 三元式表+间接码表
- 间接码表
- 一张指示器表,按运算的先后次序列出有关三元式 在三元式表中的位置
- 优点 方便优化,节省空间
十七讲-语义分析与中间代码生成二
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,…
17.1.3 产生赋值语句三地址代码的翻译模式
17.2 数组元素引用的翻译
17.2.1 数组元素的引用
数组元素地址的计算 :
- X:=A[i 1,i2,…,ik]+Y
- A[i1,i2,…,ik]:=X+Y
数组元素地址计算:
17.2.2 带数组元素引用的赋值语句
带数组元素引用的赋值语句翻译模式
17.3 类型转换
产生式E→E1+E2 的语义动作
十八讲-语义分析与中间代码生成三
18.1 布尔表达式及其计算
18.1.1 布尔表达式的简介
- 文法 E → E orE | E and E | notE | (E) | iropi| i
- 用途 用于逻辑演算,计算逻辑值 用于控制语句的条件式
18.2.1 计算布尔表达式的两种方法
18.2 按数值表示法翻译
18.2.1 数值表示法
18.2.2 关于布尔表达式的数值表示法的翻译模式
18.3 带优化翻译布尔表达式
18.3.1 作为条件控制的布尔式翻译
条件语句的翻译
18.3.2 布尔表达式的属性文法
产生布尔表达式三地址代码的属性文法
- 语义函数newlabel,返回一个新的符号标号
- 对于一个布尔表达式E,设置两个继承属性
- E.true是E为‘真’时控制流转向的标号
- E.false是E为‘假’时控制流转向的标号
- E.code记录E生成的三地址代码序列
18.3.3 根据属性文法翻译布尔表达式
18.3.4 布尔表达式的翻译
18.3.5 布尔表达式的一遍扫描翻译模式
布尔表达式的文法
- E → E1or E2
- E → E1and E2
布尔表达式的翻译模式:
按照本节所讲的一遍扫描的翻译模式工作,当一个布尔表达式规约分析翻译完成时,该布尔表达式生成的所有四元式都是完整的,没有需要回填的四元式。(错)
十九讲-语义分析和中间代码生成四
19.1 常用的控制语句
- S → if E then S1
- S → if E then S1else S2
- S → while E do S1
- 其中E为布尔表达式