中间代码(精)

合集下载

07-第7章-中间代码生成-编译原理PDF精讲课件-中国科技大学(共13讲)

07-第7章-中间代码生成-编译原理PDF精讲课件-中国科技大学(共13讲)
编译原理和技术
中国科学技术大学 计算机科学与技术学院 陈意云
第七章 中间代码生成
记号 分析 流 器 本章内容
–介绍几种常用的中间表示:后缀表示、图形表示 和三地址代码 –用语法制导定义和翻译方案来说明源语言的各种 构造怎样被翻译成中间形式
静态 检查 器
中间 代码 中间 代码 生成 代码 生成 器 器
7.1 中 间 语 言
7.1.2 图形表示 • 语法树是一种图形化的中间表示 • 有向无环图也是一种中间表示
assign a + + a assign +
+ c uminus d uminus c c d d b b (b) DAG (a) 语法树 a = (b + cd) + cd的图形表示
7.1 中 间 语 言
7.1.4 静态单赋值形式 • 一种便于某些代码优化的中间表示 • 和三地址代码的主要区别
– 所有赋值指令都是对不同名字的变量的赋值 – 一个变量在不同路径上都定值的解决办法 if (flag) x = 1; else x = 1; y = x a; 改成 if (flag) x1 = 1; else x2 = 1; x3 = (x1, x2); //由flag的值决定用x1还是x2
E E1 E2 E.nptr = mkNode( ‘’, E1.nptr, E2.nptr) E.nptr = mkUNode( ‘uminus’, E1.nptr) E E1 E (E1) F id E.nptr = E1.nptr E.nptr = mkLeaf (id, id.entry)
符号表实例
7.2 声 明 语 句
• 符号表的特点
–各过程有各自的符号表 –符号表之间有双向链 –构造符号表时需要符号表栈 –构造符号表需要活动记录栈 sort var a:…; x:…; readarray var i:…; exchange quicksort var k, v:…; partition var i, j:…;

中间代码生成

中间代码生成

:
T integer
T.type=integer T.width=4
enter(x,real,0)
enter(i,integer,8)
例 8-4 x:real; i:integer 的翻译
P{offset:=0}D {offset:=0}D;D {offset:=0}x:T{enter(x,T.type,offset);offset:=offset+T. width};D {offset:=0}x:real{T.type:=real;T.width:=8} {enter(x,T.type,offset);offset:=offset+T.width};D x:real{(x,real,0);offset:=8};D x:real{(x,real,0);offset:=8};i:T{enter(,T.type,o ffset); offset:=offset+T.width} x:real{(x,real,0);offset:=8};i:integer{T.type:=integer; T.width:=4}{enter(i,T.type,offset);offset:=offset+T.wid th} x:real{(x,real,0)};i:integer{(i,integer,8);offset:=12}

全局变量表示为静态数据区的偏移值(offset) 局部变量表示为局部数据区(活动记录部分)的偏移值 两种数据区
例 8-3:相对地址举例
begin real x[8]; integer i, j; …… end 名字 相对地址 x 0 i 64 j 68
0 8 X[1] X[2]
作用域信息的保存

编译方法实验报告(中间代码生成器)

编译方法实验报告(中间代码生成器)

编译方法实验报告2011年10月一、实验目的熟悉算术表达式的语法分析与中间代码生成原理。

二、实验内容(1)设计语法制导翻译生成表达式的四元式的算法;(2)编写代码并上机调试运行通过。

输入——算术表达式;输出——语法分析结果;相应的四元式序列。

(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法, 并根据这些属性翻译文法, 使用扩展的语法分析器实现语法制导翻译。

三、实验原理及基本步骤●算术表达式文法:G(E): E ( E ω0 T | TT →T ω1 F | FF → i | (E)●文法变换:G’(E) E →T {ω0 T}T →F {ω1 F}F → i | (E)●属性翻译文法:E →T {ω0“push(SYN, w)” T “QUAT”}T →F {ω1“push(SYN, w)” F “QUAT”}F →i “push(SEM, entry(w))” | (E)其中:push(SYN, w) —当前单词w入算符栈SYN;push(SEM, entry(w)) —当前w在符号表中的入口值压入语义栈SEM;QUAT —生成四元式函数i. T = newtemp;ii. QT[j] =( SYN[k], SEM[s-1], SEM[s], T);j++;iii. pop( SYN, _ ); pop( SEM, _ ); pop( SEM, _ );push( SEM, T );●递归下降子程序:数据结构: SYN —算符栈;SEM —语义栈;四、数据结构设计使用递归的结构进行四元式的设计, 同时, 运用堆栈结构将四元式的输出序列打印出来while ( exp[i]=='+' || exp[i]=='-'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)T();quat();}while ( exp[i]=='*' || exp[i]=='/'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)F();quat();}void quat(){strcpy(qt[j],"(, , , )"); //QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);qt[j][1]=syn[i_syn];qt[j][3]=sem[i_sem-1];qt[j][5]=sem[i_sem];qt[j][7]=temp;j++;i_syn--; //pop(SYN);i_sem--; //pop(SEM);i_sem--; //pop(SEM);sem[++i_sem]=temp; //push(SEM,temp);temp++;}五、关键代码分析(带注释)及运行结果#include <iostream>#include "string.h"#include "stdio.h"using namespace std;char syn[10]; //文法符号栈int i_syn;char sem[10]; //运算对象栈int i_sem;char exp[50]; //算术表达式区int i;char qt[30][15]; //四元式区int j=0;char temp='q'; //临时变量, 取值为r--zint E();int T();int F();void quat(); //生成四元式函数int main(int argc, char* argv[]){printf("please input your expression:");scanf("%s",exp); //输入四元式i=0; //read(w)E();if (exp[i]=='\0')for (i=0;i<j;i++) //输出四元式序列printf("%s\n",qt[i]);elseprintf("err");return 0;}int E(){T();while ( exp[i]=='+' || exp[i]=='-'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)T();quat();}return 1;}int T(){F();while ( exp[i]=='*' || exp[i]=='/'){syn[++i_syn]=exp[i]; //push(SYN,w)i++; //read(w)F();quat();}return 1;}int F(){if ( exp[i]=='('){i++; //read(w)E();if ( exp[i]!=')'){printf("err");return 0;}}else if ((exp[i]>='a' && exp[i]<='p')||(exp[i]>='0' && exp[i]<='9')){ sem[++i_sem]=exp[i]; } //push(SEM,w) else{printf("err");return 0;}i++; //read(w)return 1;}void quat(){strcpy(qt[j],"( , , , )"); //QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);qt[j][1]=syn[i_syn];qt[j][3]=sem[i_sem-1];qt[j][5]=sem[i_sem];qt[j][7]=temp;j++;i_syn--; //pop(SYN);i_sem--; //pop(SEM);i_sem--; //pop(SEM);sem[++i_sem]=temp; //push(SEM,temp);temp++;}六、总结与分析我们知道, 定义一种语言除了要求定义语法外, 还要求定义语义, 即对语言的各种语法单位赋予具体的意义。

编译原理面试知识点

编译原理面试知识点

编译原理面试知识点1. 什么是编译原理?编译原理是计算机科学中的一个重要领域,研究如何将高级语言(源语言)翻译成低级语言(目标语言),以便计算机能够理解和执行程序。

编译原理涉及的主要内容包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。

2. 词法分析词法分析是编译过程的第一步,其主要任务是将源代码分解为一个个的词法单元,也称为记号。

词法单元可以是关键字、标识符、运算符、分隔符等。

3. 语法分析语法分析是将词法单元流转化为抽象语法树的过程。

抽象语法树是一种树形结构,用于表示程序的语法结构。

语法分析器根据给定的语法规则,对词法单元进行语法分析,检查程序是否符合语法规则。

4. 语义分析语义分析是编译过程中的重要环节,主要任务是对抽象语法树进行静态语义检查和语义动作的执行。

静态语义检查用于检查程序中是否有语法错误,如类型错误、未声明的变量等。

语义动作则是执行一些语义规则,如类型转换、变量赋值等。

5. 中间代码生成中间代码是一种抽象的低级语言,它介于源语言和目标语言之间。

中间代码生成将抽象语法树转化为中间代码,目的是简化目标代码生成的复杂度,并进行一些代码优化。

6. 代码优化代码优化是在保持程序功能不变的前提下,通过改变代码的结构和算法,使程序更加高效、节省资源。

常见的代码优化技术包括常量折叠、循环优化、内联函数等。

7. 目标代码生成目标代码生成将中间代码转化为机器语言或汇编语言,使计算机能够执行程序。

目标代码生成需要考虑目标机器的特性和限制,如寄存器分配、内存管理等。

8. 常见的编译器构建工具•Flex:用于生成词法分析器。

•Bison:用于生成语法分析器。

•LLVM:开源的编译器基础设施,提供了多种编译器相关工具和库。

•GCC:GNU编译器套件,包括编译器、调试器、性能分析器等。

9. 常见的编程语言特性和编译优化技术•静态类型检查:在编译期间检查变量的类型是否匹配,提前发现类型错误。

传奇及时雨脚合成脚本_中间代码(只存不合)

传奇及时雨脚合成脚本_中间代码(只存不合)
返回
<衣服修理>
系统显示[衣服修理]
找到NPC[比奇老兵,0,328,267]
对话[比奇老兵]
如果[自己][衣服][名称]="$衣服"
那么特修[衣服]
否则特修[$衣服]装备到[衣服]
返回
<武器修理>
系统显示[武器修理]
找到NPC[比奇老兵,0,328,267]
对话[比奇老兵]
如果[雷霆护腕][数量]>0
那么调用<存雷霆护腕>
如果[雷霆战戒][数量]>0
那么调用<存雷霆战戒>
如果[待存物品][数量]>0
那么调用<自动存物>
如果[自己][衣服][持久]<2
那么调用<衣服修理>
如果[自己][武器][持久]<2
那么调用<武器修理>
如果[自己][马牌][持久]<2
$衣服="雷霆战甲(男)+1"
$武器="开天+1"
$马牌="荣誉勋章43号"
$项链="雷霆项链+2"
$头盔="圣龙盔"
$左手镯="雷霆护腕+2"
$右手镯="雷霆护腕"
$左戒指="雷霆战戒+1"
$右戒指="雷霆战戒+1"
$腰带="雷霆腰带+1"
$靴子="雷霆战靴+1"
$宝石="雷霆神石"

第七章 语义分析和中间代码产生(第九周)

第七章 语义分析和中间代码产生(第九周)

源语言 程序
Compiler Front End
中间语 言程序
Compiler Back End
目标语 言程序
内容线索

中间语言 说明语句


赋值语句的翻译
布尔表达式的翻译


控制语句的翻译
过程调用的处理
中间语言

常用的中间语言
后缀式,逆波兰表示 图表示

DAG 抽象语法树
三地址代码
7. 2 中间语言
1. 后缀式
后缀式表示法又称逆波兰表示法,是一种表示表达式的 方法,它把运算量(操作数)写在前面,算符写在后面 例:中缀表示: a+b,a+b*c,m=1,(a+b)*c, (a+b)*(c-d) 后缀表示: ab+, abc*+, m1=,ab+c*, ab+cd-* 特点: 运算分量的个数与先后次序不变; 运算符的个数不变, 但其出现顺序即为执行顺序 无括号;
一个表达式E的后缀式可如下定义:



(1)如果E是一个变量或常数,则E的后缀式是E 自身; (2)如果E是E1opE2形式的表达式,op是二元操 作符,则E的后缀式为E1’E2’op, E1’和E2‘分 别为E1和E2的后缀式; (3)如果E是(E1)形式的表达式,则E1的后缀式 就是E的后缀式

3*5+4
+
if_then_else
*
B S1 S2 3 5
4
建立表达式的抽象语法树

mknode (op,left,right) 建立一个运算符号结点, 标号是op,两个域left和right分别指向左子树和 右子树。 mkleaf (id,entry) 建立一个标识符结点,标号为 id,一个域entry指向标识符在符号表中的入口。

常见数控系统G代码大全

常见数控系统G代码大全

常见数控系统G代码大全目录FANUC车床G代码FANUC铣床G代码FANUC M指令代码SIEMENS铣床G代码SIEMENS802S/CM 固定循环SIEMENS802DM/810/840DM 固定循环SIEMENS车床G 代码SIEMENS 801、802S/CT、802SeT 固定循环SIEMENS 802D、810D/840D 固定循环HNC车床G代码HNC铣床G代码HNC M指令KND100铣床G代码KND100车床G代码KND100 M指令GSK980车床G代码GSK980T M指令GSK928 TC/TE G代码GSK928 TC/TE M指令GSK990M G代码GSK990M M指令GSK928MA G代码GSK928MA M指令FANUC车床G代码G代码解释G00 定位(快速移动)G01 直线切削G02 顺时针切圆弧(CW,顺时钟)G03 逆时针切圆弧(CCW,逆时钟)G04 暂停(Dwell)G09 停于精确的位置G20 英制输入G21 公制输入G22 内部行程限位有效G23 内部行程限位无效G27 检查参考点返回G28 参考点返回G29 从参考点返回G30 回到第二参考点G32 切螺纹G40 取消刀尖半径偏置G41 刀尖半径偏置(左侧)G42 刀尖半径偏置(右侧)G50 修改工件坐标;设置主轴最大的RPM G52 设置局部坐标系G53 选择机床坐标系G70 精加工循环G71 内外径粗切循环G72 台阶粗切循环G73 成形重复循环G74 Z 向步进钻削G75 X 向切槽G76 切螺纹循环G80 取消固定循环G83 钻孔循环G84 攻丝循环G85 正面镗孔循环G87 侧面钻孔循环G88 侧面攻丝循环G89 侧面镗孔循环G90 (内外直径)切削循环G92 切螺纹循环G94 (台阶) 切削循环G96 恒线速度控制G97 恒线速度控制取消G98 每分钟进给率G99 每转进给率支持宏程序编程FANUC铣床G代码G代码解释G00 顶位(快速移动)定位(快速移动)G01 直线切削G02 顺时针切圆弧G03 逆时针切圆弧G04 暂停G15/G16 极坐标指令G17 XY 面赋值G18 XZ 面赋值G19 YZ 面赋值G28 机床返回原点G30 机床返回第2和第3原点*G40 取消刀具直径偏移G41 刀具直径左偏移G42 刀具直径右偏移*G43 刀具长度+ 方向偏移*G44 刀具长度- 方向偏移G49 取消刀具长度偏移*G53 机床坐标系选择G54 工件坐标系1选择G55 工件坐标系2选择G56 工件坐标系3选择G57 工件坐标系4选择G58 工件坐标系5选择G59 工件坐标系6选择G73 高速深孔钻削循环G74 左螺旋切削循环G76 精镗孔循环*G80 取消固定循环G81 中心钻循环G82 反镗孔循环G83 深孔钻削循环G84 右螺旋切削循环G85 镗孔循环G86 镗孔循环G87 反向镗孔循环G88 镗孔循环G89 镗孔循环*G90 使用绝对值命令G91 使用增量值命令G92 设置工件坐标系*G98 固定循环返回起始点*G99 返回固定循环R点G50比例缩放G51G68坐标系旋转G69支持宏程序编程FANUC M指令代码M代码说明M00 程序停M01 选择停止M02 程序结束(复位)M03 主轴正转(CW)M04 主轴反转(CCW)M05 主轴停M06 换刀M08 切削液开M09 切削液关M30 程序结束(复位) 并回到开头M48 主轴过载取消不起作用M49 主轴过载取消起作用M94 镜象取消M95 X坐标镜象M96 Y坐标镜象M98 子程序调用M99 子程序结束SIEMENS铣床G代码地址含义D 刀具刀补号F 进给率(与G4 一起可以编程停留时间)G G功能(准备功能字)G0 快速移动G1 直线插补G2 顺时针圆弧插补G3 逆时针圆弧插补CIP 中间点圆弧插补G33 恒螺距的螺纹切削G331 不带补偿夹具切削内螺纹G332 不带补偿夹具切削内螺纹. 退刀CT 带切线的过渡圆弧插补G4 快速移动G63 快速移动G74 回参考点G75 回固定点G25 主轴转速下限G26 主轴转速上限G110 极点尺寸,相对于上次编程的设定位置G110 极点尺寸,相对于当前工件坐标系的零点G120 极点尺寸,相对于上次有效的极点G17* X/Y平面G18 Z/X平面G19 Y/Z平面G40 刀尖半径补偿方式的取消G41 调用刀尖半径补偿, 刀具在轮廓左侧移动G42 调用刀尖半径补偿, 刀具在轮廓右侧移动G500 取消可设定零点偏置G54 第一可设定零点偏置G55 第二可设定零点偏置G56 第三可设定零点偏置G57 第四可设定零点偏置G58 第五可设定零点偏置G59 第六可设定零点偏置G53 按程序段方式取消可设定零点偏置G60* 准确定位G70 英制尺寸G71* 公制尺寸G700 英制尺寸,也用于进给率FG710 公制尺寸,也用于进给率FG90* 绝对尺寸G91 增量尺寸G94* 进给率F,单位毫米/分G95 主轴进给率F,单位毫米/转G901 在圆弧段进给补偿“开”G900 进给补偿“关”G450 圆弧过渡G451 等距线的交点I 插补参数J 插补参数K 插补参数I1 圆弧插补的中间点J1 圆弧插补的中间点K1 圆弧插补的中间点L 子程序名及子程序调用M 辅助功能M0 程序停止M1 程序有条件停止M2 程序结束M3 主轴顺时针旋转M4 主轴逆时针旋转M5 主轴停M6 更换刀具N 副程序段: 主程序段P 子程序调用次数RET 子程序结束S 主轴转速,在G4 中表示暂停时间T 刀具号X 坐标轴Y 坐标轴Z 坐标轴CALL 循环调用CHF 倒角,一般使用CHR 倒角轮廓连线CR 圆弧插补半径GOTOB 向后跳转指令GOTOF 向前跳转指令RND 圆角支持参数编程SIEMENS802S/CM 固定循环循环说明LCYC82 钻削,沉孔加工LCYC83 深孔钻削LCYC840 带补偿夹具的螺纹切削LCYC84 不带补偿夹具的螺纹切削LCYC85 镗孔LCYC60 线性孔排列LCYC61 圆弧孔排列LCYC75 矩形槽,键槽,圆形凹槽铣削SIEMENS802DM/810/840DM 固定循环循环说明CYCLE82 中心钻孔CYCLE83 深孔钻削CYCLE84 性攻丝CYCLE85 铰孔CYCLE86 镗孔CYCLE88 带停止镗孔CYCLE71 端面铣削LONGHOLE 一个圆弧上的长方形孔POCKET4 环形凹槽铣削POCKET3 矩形凹槽铣削SLOT1 一个圆弧上的键槽SLOT2 环行槽SIEMENS车床G 代码地址含义D 刀具刀补号FF 进给率(与G4 一起可以编程停留时间)G G功能(准备功能字)G0 快速移动G1 直线插补G2 顺时针圆弧插补G3 逆时针园弧插补G33 恒螺距的螺纹切削G4 快速移动G63 快速移动G74 回参考点G75 回固定点G17 (在加工中心孔时要求)G18* Z/X平面G40 刀尖半径补偿方式的取消G41 调用刀尖半径补偿, 刀具在轮廓左侧移动G42 调用刀尖半径补偿, 刀具在轮廓右侧移动G500 取消可设定零点偏置G54 第一可设定零点偏置G55 第二可设定零点偏置G56 第三可设定零点偏置G57 第四可设定零点偏置G58 第五可设定零点偏置G59 第六可设定零点偏置G53 按程序段方式取消可设定零点偏置G70 英制尺寸G71* 公制尺寸G90* 绝对尺寸G91 增量尺寸G94* 进给率F,单位毫米/分G95 主轴进给率F,单位毫米/转I 插补参数I1 圆弧插补的中间点K1 圆弧插补的中间点L 子程序名及子程序调用M 辅助功能M0 程序停止M1 程序有条件停止M2 程序结束M30M17M3 主轴顺时针旋转M4 主轴逆时针旋转M5 主轴停M6 更换刀具N 副程序段: 主程序段P 子程序调用次数RET 子程序结束S 主轴转速,在G4 中表示暂停时间T 刀具号X 坐标轴Y 坐标轴Z 坐标轴AR 圆弧插补张角CALL 循环调用CHF 倒角,一般使用CHR 倒角轮廓连线CR 圆弧插补半径GOTOB 向后跳转指令GOTOF 向前跳转指令RND 圆角支持参数编程SIEMENS 801、802S/CT、802SeT 固定循环循环说明LCYC82 钻削,沉孔加工LCYC83 深孔钻削LCYC840 带补偿夹具的螺纹切削LCYC84 不带补偿夹具的螺纹切削LCYC85 镗孔LCYC93 切槽循环LCYC95 毛坯切削循环LCYC97 螺纹切削SIEMENS 802D、810D/840D 固定循环循环说明CYCLE71 平面铣削CYCLE82 中心钻孔YCLE83 深孔钻削CYCLE84 刚性攻丝CYCLE85 铰孔CYCLE86 镗孔CYCLE88 带停止镗孔CYCLE93 切槽CYCLE94 退刀槽形状E..FCYCLE95 毛坯切削CYCLE97 螺纹切削HNC车床G代码G代码解释G00 定位(快速移动)G01 直线切削G02 顺时针切圆弧(CW,顺时钟)G03 逆时针切圆弧(CCW,逆时钟)G04 暂停(Dwell)G09 停于精确的位置G20 英制输入G21 公制输入G22 内部行程限位有效G23 内部行程限位无效G27 检查参考点返回G28 参考点返回G29 从参考点返回G30 回到第二参考点G32 切螺纹G36 直径编程G37 半径编程G40 取消刀尖半径偏置G41 刀尖半径偏置(左侧)G42 刀尖半径偏置(右侧)G53 直接机床坐标系编程G54—G59 坐标系选择G71 内外径粗切循环G72 台阶粗切循环G73 闭环车削复合循环G76 切螺纹循环G80 内外径切削循环G81 端面车削固定循环G82 螺纹切削固定循环G90 绝对值编程G91 增量值编程G92 工件坐标系设定G96 恒线速度控制G97 恒线速度控制取消G94 每分钟进给率G95 每转进给率支持参数与宏编程HNC 铣床G 代码G 代码 组别解释*G00 定位 (快速移动)G01 直线切削 G02 顺时针切圆弧G03 01 逆时针切圆弧G04 00 暂停G07 16 虚轴指定G09 00 准停校验*G17 XY 面赋值G18XZ 面赋值 G19 02 YZ 面赋值G20 英寸输入*G21毫米输入 G22 08 脉冲当量G24 镜像开 *G25 03 镜像关G28 返回到参考点 G29 00 由参考点返回*G40 取消刀具直径偏移G41刀具直径左偏移 G42 07 刀具直径右偏移G43 刀具长度 + 方向偏移G44刀具长度 - 方向偏移 *G49 08 取消刀具长度偏移*G50 缩放关 G51 04 缩放开G52 局部坐标系设定 G53 00 直接机床坐标系编程*G54 工件坐标系1选择G55 工件坐标系2选择G56 工件坐标系3选择 G57 工件坐标系4选择G58 工件坐标系5选择G59 14 工件坐标系6选择G60 00 单方向定位*G61 精确停止校验方式 G64 12 连续方式G68 旋转变换 *G69 05 旋转取消G73 高速深孔钻削循环G74 左螺旋切削循环G76 精镗孔循环*G80 取消固定循环G81 中心钻循环G82 反镗孔循环G83深孔钻削循环 G84 右螺旋切削循环G85 镗孔循环G86 镗孔循环G87 反向镗孔循环G88 镗孔循环G89 09 镗孔循环*G90 使用绝对值命令 G91 03 使用增量值命令G92 00 设置工件坐标系*G94 每分钟进给 G95 14 每转进给*G98 固定循环返回起始点 G99 10 返回固定循环R 点支持参数与宏编程HNC M 指令M 代码 说明 M00 程序停M01 选择停止M02 程序结束(复位)M03 主轴正转 (CW)M04 主轴反转 (CCW)M05 主轴停M06 换刀M07 切削液开M09 切削液关M98 子程序调用M99 子程序结束KND100铣床G 代码G 代码 组别解释G00 定位 (快速移动)G01 直线切削 G02 顺时针切圆弧G03 01 逆时针切圆弧G04 00 暂停G17 XY 面赋值G18XZ 面赋值 G19 02 YZ 面赋值G28 机床返回原点 G29 00 从参考点返回*G40 取消刀具直径偏移G41 刀具直径左偏移G42 07 刀具直径右偏移*G43 刀具长度 + 方向偏移*G44刀具长度 - 方向偏移 G49 08 取消刀具长度偏移*G53 机床坐标系选择G54 工件坐标系1选择G55 工件坐标系2选择G56工件坐标系3选择 G57 工件坐标系4选择G58 工件坐标系5选择G59 14 工件坐标系6选择G73 高速深孔钻削循环G74 左螺旋切削循环G76 精镗孔循环*G80 取消固定循环G81 钻孔循环(点钻)G82 钻孔循环(镗阶梯孔)G83深孔钻削循环 G84 攻丝循环G85 镗孔循环G86 钻孔循环G87 反向镗孔循环G88 镗孔循环G89 09 镗孔循环*G90 使用绝对值命令 G91 03 使用增量值命令G92 00 设置工件坐标系*G98 固定循环返回起始点 *G99 10 返回固定循环R 点KND100车床G 代码G 代码 组别 解释G00 定位 (快速移动)G01 直线切削 G02 顺时针切圆弧 (CW ,顺时钟)G03 01 逆时针切圆弧 (CCW ,逆时钟)G04 暂停 (Dwell) G10 00 偏移值设定G20 英制输入 G21 06 公制输入G27 检查参考点返回G28 参考点返回 G29 从参考点返回G31 00 跳跃机能G32 01 切螺纹G36 X 轴自动刀偏设定G37 Z 轴自动刀偏设定G40 取消刀尖半径偏置G41刀尖半径偏置 (左侧) G42 07 刀尖半径偏置 (右侧)G50 坐标系设定G54工件坐标系 G55---G59 00 工件坐标系G70 精加工循环G71 内外径粗切循环G72 台阶粗切循环G73成形重复循环 G74 端面深孔加工循环G75 外圆、内圆切削循环G76 00 切螺纹循环G90 (内外直径)切削循环G92切螺纹循环 G94 01 (台阶) 切削循环G96 恒线速度控制 G97 12 恒线速度控制取消G98 每分钟进给率 G99 05 每转进给率KND100 M 指令M 代码 说明M00 程序停M01 选择停止M02 程序结束(复位)M03 主轴正转 (CW)M04 主轴反转 (CCW)M05 主轴停M06 换刀M08切削液开M09切削液关 M10卡紧 M11松开 M32润滑开 M33润滑关 M98子程序调用 M99 子程序结束GSK980车床G 代码G 代码 组别功能G00 定位(快速移动)*G01 直线插补(切削进给) G02 圆弧插补CW (顺时针)G03 01 圆弧插补CCW (逆时针)G04 暂停,准停 G28 00 返回参考点G32 01 螺纹切削G50 00 坐标系设定G65 00 宏程序命令G70 精加工循环G71 外圆粗车循环G72 端面粗车循环 G73 封闭切削循环G74 端面深孔加工循环G75 00 外圆,内圆切槽循环G90 外圆,内圆车削循环G92 螺纹切削循环G94 01 端面切削循环G96 恒线速开 G97 02 恒线速关*G98 每分进给 G99 03 每转进给支持参数与宏编程GSK980T M 指令M 代码 说明M03 主轴正转M04 主轴反转M05 主轴停止M08 冷却液开M09 冷却液关(不输出信号)M32 润滑开M33 润滑关(不输出信号)M10 备用M11 备用尖(不输出信号)M00程序暂停,按‘循环起动’程序继续执行 M30 程序结束,程序返回开始GSK928 TC/TE G 代码G 代码 功能G00 定位(快速移动)*G01 直线插补(切削进给)G02 圆弧插补CW (顺时针)G03 圆弧插补CCW (逆时针)G32 攻牙循环G33 螺纹切削G71 外圆粗车循环G72 端面粗车循环G74 端面深孔加工循环G75 外圆,内圆切槽循环G90 外圆,内圆车削循环 G92 螺纹切削循环G94 外圆内圆锥面循环G22 局部循环开始G80 局部循环结束*G98 每分进给G99 每转进给G50 设置工件绝对坐标系G26 X 、Z 轴回参考G27 X 轴回参考点G29 Z 轴回参考点支持参数与宏编程GSK928 TC/TE M 指令M 代码 说明M03 主轴正转M04 主轴反转M05 主轴停止M08 冷却液开M09 冷却液关(不输出信号)M32 润滑开M33 润滑关(不输出信号)M10 备用M11 备用尖(不输出信号)M00 程序暂停,按‘循环起动’程序继续执行M30 程序结束,程序返回开始GSK990M G 代码G 代码 组别 解释G00 定位 (快速移动)G01 01 直线切削G02顺时针切圆弧G03逆时针切圆弧 G0400 暂停 G17XY 面赋值 G18XZ 面赋值 G1902 YZ 面赋值 G28机床返回原点 G2900 从参考点返回 *G40取消刀具直径偏移 G41刀具直径左偏移 G4207 刀具直径右偏移 *G43刀具长度 + 方向偏移 *G44刀具长度 - 方向偏移 G4908 取消刀具长度偏移 *G53机床坐标系选择 G54工件坐标系1选择 G55工件坐标系2选择 G56工件坐标系3选择 G57工件坐标系4选择 G58工件坐标系5选择 G5914 工件坐标系6选择 G73高速深孔钻削循环 G74左螺旋切削循环 G76精镗孔循环 *G80取消固定循环 G81钻孔循环(点钻) G82钻孔循环(镗阶梯孔) G83深孔钻削循环 G84攻丝循环 G85镗孔循环 G86钻孔循环 G87反向镗孔循环 G88镗孔循环 G8909 镗孔循环 *G90使用绝对值命令 G9103 使用增量值命令 G9200 设置工件坐标系 *G98固定循环返回起始点*G99 10 返回固定循环R 点GSK990M M 指令M 代码说明M00 程序停M01 选择停止M02 程序结束(复位)M03 主轴正转 (CW)M04 主轴反转(CCW)M05 主轴停M06 换刀M08 切削液开M09 切削液关M10 卡紧M11 松开M32 润滑开M33 润滑关M98 子程序调用M99 子程序结束GSK928MA G代码G代码解释G00 定位(快速移动)G1 直线切削G02 顺时针切圆弧G03 逆时针切圆弧G04 延时等待G17 XY 面赋值G18 XZ 面赋值G19 YZ 面赋值G28 机床返回原点G29 从参考点返回*G40 取消刀具直径偏移G41 刀具直径左偏移G42 刀具直径右偏移*G43 刀具长度+ 方向偏移*G44 刀具长度- 方向偏移G49 取消刀具长度偏移*G53 机床坐标系选择G54 工件坐标系1选择G55 工件坐标系2选择G56 工件坐标系3选择G57 工件坐标系4选择G58 工件坐标系5选择G59 工件坐标系6选择G73 高速深孔钻削循环G74 左螺旋切削循环G80 取消固定循环G81 钻孔循环(点钻)G82 钻孔循环(镗阶梯孔)G83 深孔钻削循环G84 右旋攻牙循环G85 镗孔循环G86 钻孔循环G89 镗孔循环*G90 使用绝对值命令G91 使用增量值命令G92 设置浮动坐标系*G98 固定循环返回起始点*G99 返回固定循环R点G10 G11 圆凹槽内粗铣G12 G13 全圆内精铣G14 G15 外圆精铣G22 系统参数运算(模态)G23 判参数值跳转G27 机械零点检测G28 经中间点快速定位到程序G31 快速返回R基准面G34 G35 矩形凹槽内精铣G38 G39 矩形外精铣GSK928MA M指令M指令解释M0 程序停止。

精品文档-编译原理基础(第二版)(刘坚)-第6章

精品文档-编译原理基础(第二版)(刘坚)-第6章

第6章 代 码 生 成
【例6.3】 图6.1(b)中有三个循环: (1) B3自身是一个循环。 (2) B6自身是一个循环。 (3) { B2,B3,B4}是一个循环。 前两个循环仅有一个节点和一条指向自身的边。例如 B3构成一个以B3为入口节点的循环。根据定义6.3的第(2) 条性质,循环中必须有一条非空的指向入口节点的路径, 此处是从B3到B3。因为,单一节点B2没有一条从B2到B2的 边,所以它不是循环,因为在{B2}中没有从B2到其自身的 非空路径。
பைடு நூலகம்
第6章 代 码 生 成
为每个基本块构造一个节点,并且若B是C的前驱(或 者说C是B的后继),则从B到C有一条边,最终得到流图如 图6.1(b)所示。
入口指向基本块B1,因为B1包含程序的第一条指令。 B1的唯一后继是B2,因为B1不以无条件跳转结束且B2的头 指令紧随B1的结束之后。
第6章 代 码 生 成
定义6.1 一段顺序执行的语句序列被称为一个基本块, 其中,第一条语句被称为基本块的入口,最后一条语句被称为基本 块的出口。
由于基本块中的语句是被顺序执行的,因此基本块的控制 流总是从入口进入,从出口退出。任何一个复杂的程序控制流,均 可以划分为若干个基本块;极端情况下,一条语句构成一个基本块。 因此可以将一段完整的程序表示为一个程序流图。
候被使用。如果一个变量的值当前在寄存器中并且以后再也 不被使用,则该寄存器就可以分配给其他变量。
第6章 代 码 生 成
定义6.4 在形如(i) x := y op z的三地址码中,出现在 “:=”左边和右边的变量分别被称为对变量的定值和引用,i 被称为变量的定值点或引用点。若变量的值在i之后的代码序 列中被引用,则称变量在i点是活跃的。若变量x在i点被定值, 在j点被引用,且从i到j没有x的其他定值,则称j是i中变量x 的下次引用信息,所有这样的下次引用信息jk(k = 1, 2, …) 构成一个下次引用链。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
辛明影 3
6.1 中间语言
• 语法树 • 后缀式 • 三地址代码表示 6.1.1 图表示法 语法树,有向非循环图和后缀式表 示源程序的自然层次结构,例如: a:=b * - c+b * -c
辛明影 4
= a +
*
b c (a)语法树 辛明影 b
*
c
5
赋值语句:
中 缀式: a:=b*-c+b*-c
后缀式:
abc-*bc-*+=
辛明影
6
= a +
*
b c (b)dag(Directed Acyclic Graph)
辛明影 7
6.1.2 三地址代码
一般形式 x:=y op z
相应于图6.1的树和dag的三地址代码
t1 := -c t2 := b* t1 t3 := -c t4 := b* t3 t5 := t2+t4 a := t5 对于语法树的代码
第六章 中间代码
1
中间代码生成
6.1 中间语言
6.2 常用语句的翻译
6.2.1 说明语句
6.2.2 赋值语句
6.2.3 布尔表达式 6.2.4 过程语句
辛明影
2

“中间代码生成”程 序的任务是: 把经过语 法分析和语义分析而获得的源程序中间表 示翻译为中间代码表示。
方法:语法制导翻译。 采用独立于机器的中间代 码的好处: 1. 便于编译系统建立和编译系统的移植; 2. 便于进行独立于机器的代码优化工作。
辛明影 17
x:integer;y:real
P→D {offset:=0}D D→D; 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} 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}
辛明影
16
一、 过程中的说明语句 一个过程中的所有说明语句作为一个 用一个全程变量Offset来记录 类集来处理。 下 一个数据在符号表中的相对地址。
下面是类型说 明和数组说明 的文法和翻译 方案
P→D D→D; D D→id :T T→integer T→real T→array[num]of T1 T→ ↑T1
中间代码优化处理时,四元式比三元式方 便的多,间接三元式与四元式同样方便,两 种实现方式需要的存储空间大体相同。
辛明影 11
常用三地址码的四元式表示: 1、 x=y op z (op , y , z , x) 2、 x=op y (op , y , , x) (j , , , L) 3、goto L 4、if x rop y goto L (jrop ,x ,y , L) (= , y , ,x) 5、x=y 6、parm x call p,n (param, , ,x)
(8)地址和指针赋值 x=&y,x=* y
和 * x=y。
辛明影
10
6.1.4 三地址代码的具体实现
1.四元式 op, arg1, arg2, result
2.三元式 op, arg1, arg2
3.间接三元式 间接码表+三元式表 四元式需要利用较多的临时单元,四元式 之 间 的联系通过临时变量实现。
(= , t5 ,
,a)
辛明影 13
三地址语句的三元式表示
op uminus * uminus * + assign arg1 c b c b (1) a arg2 (0) (2) (3) (4)
(0) (1) (2) (3) (4) (5)
三元式中使用指向三元式语句的指针。
辛明影 14
三地址语句的间接三元式表示
statement (0) (1) (2) (3) (4) (5) (14) (15) (14) (15) (16) (17)
op
a17
*
+ =
b
14 15
14
15 a
语句的移动仅改变左边的语句表
辛明影 15
6.2 常用语句的翻译
6.2.1 说明语句 说明语句的翻译:对每个局部名字, 在符号 填写有关的信息. 表中建立相应的表项, 如类型、嵌套深度、相对地址,内情向量等。 相对地址:相对静态数据区基址 或活动记 录中局部数据区基址的一个偏移值
辛明影 18
x:integer;y:real T.type=int T.type=real
T.width=4 T.width=8
P Offset=0 D x : T
Name
X Y
type
int real
kind
……
addr
0 4
简单变量 简单变量
…………
D
; Enter;offset Y
Offset=4 Offset=0 Offset=12
(3)无条件转移语句goto L;
(4)条件转移语句 if x relop y goto L, 关系运算符号relop(< ,=,>= 等等);
辛明影 9
(5)复制语句 x:=y; (6)过程调用语句 param x 和 call p, n ;
过程返回语句 return y;
(7)索引赋值 x:=y[i] 及 x[i] :=y ;
辛明影
t1:=-c t2:=b*t1 t5:=t2+t2 a:= t5 对于dag的代码
8
6.1.3 三地址语句的种类
(1)赋值语句 x:=y op z,op为二目 算术算符或逻辑算符; (2)赋值语句 x:=op y ,op为一目算 符,如一目减uminus、逻辑非not、移位 算符及转换算符;
D : T Enter;offset
Int T.type T.width
7、x=y[i] x[i]=y 8、x=&y x=*y
辛明影
(=[] , y[i] ,
,x)
(=& , y ,
,x)
12
对于语句a:=b*-c+b*-c 的三种表示方法
三地址语句的四元式表示
(- , c , , t1)
(* , b , t1 , t2) (- , c , , t3) (* , b , t1 , t4) (+ ,t2 , t4 , t5)
相关文档
最新文档