西安交通大学《编译原理》第十一章 期末考试拓展学习 3

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

西交《编译原理》第十一章目标代码生成

题目:逆波兰式生成目标代码

逆波兰式,用于编译器的实现,效率高,但是实现的难度相对于四元式,本人认为要高。

#include /* 基本输入输出流 */

#include /* 运用栈,省去自己再写栈 */ using namespace std;

/***************************************

* 数据结构 *

* 逆波兰式==> 目标代码 *

***************************************/

/*********************************************

* 目标代码指令:LD,ST,ADD,SUB,MUL,DIV *

* 相应的数值:1, 2, 3, 4, 5, 6 *

* 数据段开始:设置为a-z;单个寄存器 *

* acc为寄存器标志:为0表示为空,非0,被占用*

*********************************************/

char temp='a'-1; /* 临时变量a-z */

stack SEM; /* 语义栈 */

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

相关文档
最新文档