西安交通大学《编译原理》第十一章 期末考试拓展学习 3
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西交《编译原理》第十一章目标代码生成
题目:逆波兰式生成目标代码
逆波兰式,用于编译器的实现,效率高,但是实现的难度相对于四元式,本人认为要高。
#include
#include
/***************************************
* 数据结构 *
* 逆波兰式==> 目标代码 *
***************************************/
/*********************************************
* 目标代码指令:LD,ST,ADD,SUB,MUL,DIV *
* 相应的数值:1, 2, 3, 4, 5, 6 *
* 数据段开始:设置为a-z;单个寄存器 *
* acc为寄存器标志:为0表示为空,非0,被占用*
*********************************************/
char temp='a'-1; /* 临时变量a-z */
stack
int s; /* 栈指针 */
typedef struct
{
int op; /* 操作符对应的数值 */
char rt; /* 单个寄存器 */
char num; /* 操作数 */
}ObjType;
ObjType OB[40]; /* 目标代码区 */
int o_pt=0; /* 区指针 */ int acc; /* 寄存器标志 */ char blexp[40]; /* 逆波兰式区 */
/*************************************
* 代码区 * *************************************/
/*************************************
* 函数声明 * *************************************/
int isop(char); /* 判断操作符是否是+-/* */
void build(char); /* 根据操作符生成目标代码函数 */
void B_O(); /* 生成算法 */
char* OpString(int); /* 操作符转化成字符显示 */
void display(); /* 显示目标代码 */
/*************************************
* 判断当前操作符是否是运算符 *
* 如果是返回相应的正数(3-6) *
* 否则返回零 *
*************************************/
int isop(char ch)
{
if(ch=='+')
return 3;
else if(ch=='-')
return 4;
else if(ch=='*')
return 5;
else if(ch=='/')
return 6;
else
return 0;
}
/*********************************************
* 目标代码生成表生成目标代码 *
*********************************************/
/***************************目标代码生成表****************************************************************
* 操作符W SEM[s-1]即x1 SEM[s]即x2 acc OBJ *
* +-/* X1 X2 0 LD R,X1;W R,X2; *
* +-/* X1 X2 K!=0 T=NEW T;ST R,T;LD R,X1;W R,X2;*
* +-/* R X s-1 W R,X; *
* +* X R s W R,X; *
* /- X R s T=NEW T;ST