语法制导方法的组成
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
…若id=0,则转label ( JMP1,id,─,label )
…若id=1,则转label
13
8.过程调用 (ENTRY,Label,Size,Level )
………子程序入口 (CALL,f,─,Result )
………过程或函数调用 9.传送参数
VARACT 变参类型 VALACT 值参类型 FUNACT 函数参数 PROACT 过程参数
abc* +
(a+b)*c
ab+c *
逆波兰式的特点:
①逆波兰式中的变量的次序与中缀式中的变量的次序完全一致。
②逆波兰式中无括号。
③逆波兰式中的运算符已按计算顺序排列。
6
后缀式的计算机处理
后缀式的最大优点是易于计算机处理
处理过程:从左到右扫描后缀式,每碰到运算对象 就推进栈;碰到运算符就从栈顶弹出相应目数的运 算对象施加运算,并把结果推进栈。最后的结果留 在栈顶。
•中间代码:是一种复杂性介于源程序语言和目标 语言之间一种语言,中间代码与具体机器无关。
C语言: f (x<y) x=x+15 ; else x=x-15;
四元式中间代码: 1. (LT,x,y,t1) 2. (then,t1,-,-) 3. (addi,x,15,t2) ; 4. (:=,t2,-,x) 5. (else,-,-,-) 6. (subi,x,15,t3) ; 7. (:=,t3,-,x) 8. (ifend,-,-,-)
2.I/O操作 ( READI,─, ─,id )…………整数输入 ( READF ,─,─,id )…………实数输入 ( WRITE,─,─ ,id )…………输出id
11
3.类型转换 ( FLOAT,id1, ─, id2 )
…id2 := float ( id1 ) 4.赋值 ( ASSIG ,id1,-, id2 )
14
例:将下列表达式翻译成四元式序列。
X*2+A*(i+1)/(j+1) 其中i和j为整型变量,其它为实型变量。
1. (FLOAT, 2, _ , t1)
2. (MULTF, X , t1, t2)
3. (ADDI, i, 1, t3)
4. (FLOAT, t3, _ , t4)
5. (MULTF,A, t4, t5)
注: ARG1,ARG2 , RESULT为操作分量和运算结果的抽象地址 表示,应包含相应语义信息。
一般的四元式操作符应包括以下几类:
1.算术、逻辑、关系运算符 ADDI、ADDF、SUBI、SUBF、MULTI、 MULTF、 DIVI、DIVF、MOD、AND、 OR、EQ、NE、GT、GE、LT、LE
例如:语句 a := b * c + b / d
三元式 : 编号 (op,ARG1,ARG2) (1) ( * , b , c ) (2) ( / , b , d ) (3) ( + , (1) , (2)) (4) ( := , (3) , a )
四元式: (op,ARG1,ARG2,RESULT) ( * , b , c , t1 ) ( / , b , d , t2 ) ( + , t1 , t2 , t3 ) ( := , t3 ,-, a )
6. (ADDI, j, 1, t6)
例如: c := a * b + a *b
:=
c
+
**
a ba b
2.3 三地址中间代码
所谓三地址是指操作符的两个运算分量及其该操 作的运算结果的抽象地址。 (op,operand1,operand2,result) 表示 result:=operand1 op operand2
最常见的三地址中间代码有三元式和四元式两种 。
0000 0000 0000 0000 0000 0000 0000 0000
1
1. 生成中间代码的目的
便于优化
让生成的目标代码效率更高 优化不等同于对代码的精简和算法的优化
便于移植
编译前端:与目标机无关 编译后端:与目标机相关
2
前端
后端
中
源 程 序
词 法 分 析
语 法 分 析
语 义 分 析
用Pentium机器语言目标代码:
– 1010 1001 0001 0110 0000 0001 – 0011 1100 0001 1000 0000 0001 – 0111 1100 0000 0101 – 0010 1101 0001 0101 0000 000 – 1110 1010 0000 0011 – 0000 0101 0001 0101 0000 000 – 0101 0011 0001 1000 0000 0001 – …………………..
…id2 := id1 5.地址加 ( AADD ,id1,id2, id3 )
…id3 := addr ( id1 ) + id2
12
6.标号定义 ( LABEL,─,─,label )….定义标号label 7.条件/无条件转移 ( JMP,─,─ ,label )…转向标号label ( JMP0,id,─ ,label )
间 代 码 生 成
中
目
间
标
代
代
目Fra Baidu bibliotek
码
码
标
优
生
程
化
成
序
L1
前端1
后端1
L2
前端2
L3
前端3
M1 M2 M3 M4 M5
3
前端
后端
中
源 程 序
词 法 分
语 法 分
语 义 分
间 代 码 生
析
析
析
成
中
目
间
标
代
代
目
码
码
标
优
生
程
化
成
序
L1
前端1
后端1
L2
后端2
L3
后端3
后端4
后端5
M1 M2 M3 M4 M5
4
2 常用的中间代码结构
后缀式----逆波兰式
–特别是表达式的内部表示
图结构中间代码
–抽象语法树 –有向无环图DAG
三地址中间代码
–三元式 –四元式
5
2.1 后缀式(逆波兰式 )
将运算对象写在前面,把运算符写在后面,因而也称后 缀式。
程序设计语言中的表示 逆波兰表示
a+b
ab+
a+b*c
例:表达式-b+c*d的后缀式 b-cd*+的计值过程
d
c
t2
b
t1
t1
t1
t3
t1= - b
t2= c*d t3= t1+t2
7
2.2 抽象语法树
抽象语法树AGT(Abstract Grammar Tree)可以 显示地表示源程序的结构,是常用的一种标准中 间代码形式。它的应用由开始的表达式已经推广 到了整个程序。
…若id=1,则转label
13
8.过程调用 (ENTRY,Label,Size,Level )
………子程序入口 (CALL,f,─,Result )
………过程或函数调用 9.传送参数
VARACT 变参类型 VALACT 值参类型 FUNACT 函数参数 PROACT 过程参数
abc* +
(a+b)*c
ab+c *
逆波兰式的特点:
①逆波兰式中的变量的次序与中缀式中的变量的次序完全一致。
②逆波兰式中无括号。
③逆波兰式中的运算符已按计算顺序排列。
6
后缀式的计算机处理
后缀式的最大优点是易于计算机处理
处理过程:从左到右扫描后缀式,每碰到运算对象 就推进栈;碰到运算符就从栈顶弹出相应目数的运 算对象施加运算,并把结果推进栈。最后的结果留 在栈顶。
•中间代码:是一种复杂性介于源程序语言和目标 语言之间一种语言,中间代码与具体机器无关。
C语言: f (x<y) x=x+15 ; else x=x-15;
四元式中间代码: 1. (LT,x,y,t1) 2. (then,t1,-,-) 3. (addi,x,15,t2) ; 4. (:=,t2,-,x) 5. (else,-,-,-) 6. (subi,x,15,t3) ; 7. (:=,t3,-,x) 8. (ifend,-,-,-)
2.I/O操作 ( READI,─, ─,id )…………整数输入 ( READF ,─,─,id )…………实数输入 ( WRITE,─,─ ,id )…………输出id
11
3.类型转换 ( FLOAT,id1, ─, id2 )
…id2 := float ( id1 ) 4.赋值 ( ASSIG ,id1,-, id2 )
14
例:将下列表达式翻译成四元式序列。
X*2+A*(i+1)/(j+1) 其中i和j为整型变量,其它为实型变量。
1. (FLOAT, 2, _ , t1)
2. (MULTF, X , t1, t2)
3. (ADDI, i, 1, t3)
4. (FLOAT, t3, _ , t4)
5. (MULTF,A, t4, t5)
注: ARG1,ARG2 , RESULT为操作分量和运算结果的抽象地址 表示,应包含相应语义信息。
一般的四元式操作符应包括以下几类:
1.算术、逻辑、关系运算符 ADDI、ADDF、SUBI、SUBF、MULTI、 MULTF、 DIVI、DIVF、MOD、AND、 OR、EQ、NE、GT、GE、LT、LE
例如:语句 a := b * c + b / d
三元式 : 编号 (op,ARG1,ARG2) (1) ( * , b , c ) (2) ( / , b , d ) (3) ( + , (1) , (2)) (4) ( := , (3) , a )
四元式: (op,ARG1,ARG2,RESULT) ( * , b , c , t1 ) ( / , b , d , t2 ) ( + , t1 , t2 , t3 ) ( := , t3 ,-, a )
6. (ADDI, j, 1, t6)
例如: c := a * b + a *b
:=
c
+
**
a ba b
2.3 三地址中间代码
所谓三地址是指操作符的两个运算分量及其该操 作的运算结果的抽象地址。 (op,operand1,operand2,result) 表示 result:=operand1 op operand2
最常见的三地址中间代码有三元式和四元式两种 。
0000 0000 0000 0000 0000 0000 0000 0000
1
1. 生成中间代码的目的
便于优化
让生成的目标代码效率更高 优化不等同于对代码的精简和算法的优化
便于移植
编译前端:与目标机无关 编译后端:与目标机相关
2
前端
后端
中
源 程 序
词 法 分 析
语 法 分 析
语 义 分 析
用Pentium机器语言目标代码:
– 1010 1001 0001 0110 0000 0001 – 0011 1100 0001 1000 0000 0001 – 0111 1100 0000 0101 – 0010 1101 0001 0101 0000 000 – 1110 1010 0000 0011 – 0000 0101 0001 0101 0000 000 – 0101 0011 0001 1000 0000 0001 – …………………..
…id2 := id1 5.地址加 ( AADD ,id1,id2, id3 )
…id3 := addr ( id1 ) + id2
12
6.标号定义 ( LABEL,─,─,label )….定义标号label 7.条件/无条件转移 ( JMP,─,─ ,label )…转向标号label ( JMP0,id,─ ,label )
间 代 码 生 成
中
目
间
标
代
代
目Fra Baidu bibliotek
码
码
标
优
生
程
化
成
序
L1
前端1
后端1
L2
前端2
L3
前端3
M1 M2 M3 M4 M5
3
前端
后端
中
源 程 序
词 法 分
语 法 分
语 义 分
间 代 码 生
析
析
析
成
中
目
间
标
代
代
目
码
码
标
优
生
程
化
成
序
L1
前端1
后端1
L2
后端2
L3
后端3
后端4
后端5
M1 M2 M3 M4 M5
4
2 常用的中间代码结构
后缀式----逆波兰式
–特别是表达式的内部表示
图结构中间代码
–抽象语法树 –有向无环图DAG
三地址中间代码
–三元式 –四元式
5
2.1 后缀式(逆波兰式 )
将运算对象写在前面,把运算符写在后面,因而也称后 缀式。
程序设计语言中的表示 逆波兰表示
a+b
ab+
a+b*c
例:表达式-b+c*d的后缀式 b-cd*+的计值过程
d
c
t2
b
t1
t1
t1
t3
t1= - b
t2= c*d t3= t1+t2
7
2.2 抽象语法树
抽象语法树AGT(Abstract Grammar Tree)可以 显示地表示源程序的结构,是常用的一种标准中 间代码形式。它的应用由开始的表达式已经推广 到了整个程序。