语义分析和中间代码生成

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
整理课件
7.1 中 间 语 言
本书常用的三地址语句
• 赋值语句x := y op z, x := op y, x := y
• 无条件转移goto L • 条件转移if x relop y goto L • 过程调用param x 和call p , n • 过程返回 return y • 索引赋值x := y[i]和 x[i] := y • 地址和指针赋值x := &y,x := y和x := y
7.2 说 明 语 句
处理嵌套过程中的说明语句
P M D {addwidth (top (tblptr), top (offset) ); pop(tblptr); pop (offset) }
M {t := mktable (nil); push(t, tblprt); push (0, offset) }
• (3)
x: integer;
• (4)
procedure readarray
• (5)
var i: integer;
• (6)
begin…a…end{readarray}
• (7)
procedure exchange(i,j:integer);
• (8)
begin
• (9)
x:=a[i]; a[i]:=a[j]; a[j]:=x
二维数组 • 列为主
A[1, 1], A[2, 1], A[1, 2], A[2, 2], A[1, 3], A[2, 3]
整理课件
7.3 赋 值 语 句
二维数组 • 列为主
A[1, 1], A[2, 1], A[1, 2], A[2, 2], A[1, 3], A[2, 3] • 行为主
E E1 +E2 E.nptr := mknode( ‘+’, E1.nptr, E2.nptr)
E E1 E2 E.nptr := mknode( ‘’, E1.nptr, E2.nptr)
E E1 E.nptr := mkunode( ‘uminus’, E1.nptr)
E (E1) E.nptr := E1.nptr
D D1 ; D2 D proc id ; N D1; S { t := top(tblptr);
addwidth(t, top(offset) ); pop(tblptr); pop(offset); enterproc(top(tblptr), , t ) } Did : T {enter(top(tblptr), , T.type, top(offset));
整理课件
T1:=y*z T2:=x+T1
• • • • • • • 图7.5
T1:=-c
T1:=-c
T2:=b*T1 T3:=-c
T2:=b*T1 T5:=T2+#43;T4
a:=T5 相应于图7.3的树和DAG的三地址代码
• (a)对于抽象语法树的代码;(b)对于DAG的 代码
L {t := mktable (nil); push(t, tblprt); push(0, offset) }
整理课件
7.3 赋 值 语 句
7.3.1 简单算术表达式及赋值语句 S id := E {p := lookup();
if p nil then emit ( p,‘:=’, E.place)
a := (b + cd ) + cd 语法树的代码 DAG的代码
t1 := b t2 := c d t3 := t1 + t2 t4 := c d t5 := t3 + t4 a := t5
t1 := b t2 := c d t3 := t1 + t2 t4 := t3 + t2 a := t4
7.2.2 作用域信息的保存 • 所讨论语言的文法
PDS D D ; D | id : T | proc id ; D ; S
• 语义动作用到的函数 mktable(previous) enter(table, name, type, offset) addwidth(table, width) enterproc(table, name,整n理e课w件table)
句,但很难用栈来描述它的计算
整理课件
7.1 中 间 语 言
7.1.2 图形表示 图表示法包括DAG与抽象语法树 • 语法树是一种图形化的中间表示
assign
a
+
+
uminus c
d
c
d
b
(a) 语法树
a := (b + cd整理)课+件cd的图形表示
7.1 中 间 语 言
7.1.2 图形表示
• 语法树是一种图形化的中间表示
7.1 中 间 语 言
• 后缀式表示法是波兰逻辑学家卢卡西维奇( Lukasiewicz)发明的一种表示表达式的方法 因此又称逆波兰表示法。这种表示法是把运 算量(操作数)写在前面把算符写在后面( 后缀)。
整理课件
7.1 中 间 语 言
把表达式翻译为后缀式的语义规则描述
产生式
E→E1op E2 E→(E1) E→id
整理课件
7.1 中 间 语 言
7.1.1 后缀式 表达式E的后缀式可以如下递归定义
• 如果E是变量或常数,那么E的后缀式就是E本
身。 • 如果E是形式为E1 opE2的表达式,那么E的后
缀式是E1 E2 op,其中E1和E2分别是E1和E2 的后缀式。 • 如果E是形式为(E1)的表达式,那么E1的后缀 表示也是E的后缀式整。理课件
第七章 语义分析和中间代码生成
本章内容
–介绍几种常用的中间表示:后缀表示、图形 表示和三地址代码
–用语法制导定义和翻译方案的方法来说明程 序设计语言的结构怎样被翻译成中间形式
记号 分析 流器
静态 检查 器
中间 代码 生成 器 整理课件
中间 代码
代码 生成 器
7.1 中 间 语 言
7.1.1 后缀式 表达式E的后缀式可以如下递归定义
op arg1 arg2
(0) uminus c
T1 (0) uminus c
(1) *
b T1 T2 (1) *
b (0)
(2) (2)uminus c
T3
(2)uminus c
(3) (3) * (2)
b T3 T4
(3) *
b
(4) (4) + (3)
T2 T4 T5
(4) +
(1)
(5) (5) :=
• (15)
begin…a…
• (16)
…v…
• (17)
…exchange(i,j); …
• (18)
end {partition};
• (19)
begin… end {quicksort};
• (20) begin…end {sort}. 整理课件
7.2 说 明 语 句
sort 空 表头
a x readarray exchange quicksort
指向readarray 指向exchange
readarrary 表头 i
exchange 表头
整理课件
quicksort 表头 k v partition
partition
7.2 说 明 语 句
7.2.3 记录的域名 T record D end
T record L D end {T.type := record (top(tblptr) ); T.width := top(offset); pop(tblptr); pop(offset) }
7.3.2数组元素的地址计算 一维数组A的第i个元素的地址计算
base + ( i low ) w
整理课件
7.3 赋 值 语 句
7.3.3 数组元素的地址计算 一维数组A的第i个元素的地址计算
base + ( i low ) w
重写成 i w + (base low w)
整理课件
7.3 赋 值 语 句
• (10)
end {exchange};
• (11) procedure quicksort(m,n;integer);
• (12)
var k,v: integer;
• (13)
function partition(y,z:integer):integer;
• (14)
var i,j: integer;
• 如果E是变量或常数,那么E的后缀式就是E本
身。
整理课件
7.1 中 间 语 言
7.1.1 后缀表示 表达式E的后缀表示可以如下递归定义
• 如果E是变量或常数,那么E的后缀表示就是E
本身。 • 如果E是形式为E1 opE2的表达式,那么E的后
缀式是E1 E2 op,其中E1和E2分别是E1和E2 的后缀式。
• 有向无环图也是一种中间表示
assign
assign
a
+
a
+
+
uminus c
d
c
d
b
(a) 语法树
+
uminus
c
d
b
(b)DAG
a := (b + cd整理)课+件cd的图形表示
7.1 中 间 语 言
构造赋值语句语法树的语法制导定义
产生式
语义规则
S id :=E S.nptr := mknode(‘assign’, mkleaf (id, id.entry), E.nptr)
{offset := 0}
DD;D
D id : T {enter ( , T.type, offset);
offset := offset + T.width }
T integer {T.type := integer; T.width := 4 }
T real {T.type := real; T.width := 8 }
emit (E.place, ‘:=’, ‘uminus’, E1.place) } E (E1) {E.place := E1.place } E id {p := lookup();
if p nil then E.place := p else error }
整理课件
7.3 赋 值 语 句
F id
E.nptr := m整理k课l件eaf (id, id.entry)
7.1 中 间 语 言
7.1.3 三地址代码 一般形式:x := y op z
表达式x + y z翻译成的三地址语句序列是 t1 := y z t2 := x + t1
整理课件
7.1 中 间 语 言
三地址代码是语法树或DAG的一种线性表示
整理课件
四元式、三元式、间接三元式
• 三地址语句可看成中间代码的一种抽象 形式。编译程序中,三地址代码语句的 具体实现可以用记录表示,记录中包含 表示运算符和操作数的域。通常有三种 表示方法:四元式、三元式、间接三元 式。
整理课件
a:=b*-c+b*-c
四元式
三元式
op arg1 arg2 result
top(offset) := top(offset) + T.width } N {t := mktable(top(tblptr) );
push(t, tblptr); push(0, offset) } 整理课件
• (1) program sort(input,output)
• (2) var a: array[0..10] of integer;
语义规则
E.code :=E1.code || E2.code || op E.code := E1.code E.code :=id
整理课件
7.1 中 间 语 言
• 后缀式不需要括号 (8 4) + 2 的后缀表示是8 4 2 +
• 后缀式的最大优点是便于计算机处理表达式 • 后缀式很容易拓广到含一元算符的表达式 • 后缀式也可以拓广到表示赋值语句和控制语
else error } E E1 + E2
{E.place := newtemp; emit (E.place, ‘:=’, E1.place, ‘+’, E2.place) }
整理课件
7.3 赋 值 语 句
7.3.1 简单算术表达式及赋值语句 E E1 {E.place := newtemp;
T5
a 整理课件
(5) assign a
7.2 说 明 语 句
• 为局部名字建立符号表条目 • 为它分配存储单元 • 符号表中包含名字的类型和分配给它的存储
单元的相对地址等信息
整理课件
7.2 说 明 语 句
7.2.1 过程中的声明
整理课件
7.2 说 明 语 句
计算被声明名字的类型和相对地址
P D
T array [ num ] of T1 {T.type := array (num.val, T1.type); T.width := num.val T1.width}
T T1 {T.type := pointer (T1.type); T.width := 4 } 整理课件
7.2 说 明 语 句
相关文档
最新文档