当前位置:文档之家› 西安交通大学《编译原理》第十一章 期末考试拓展学习 3

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

西交《编译原理》第十一章目标代码生成
题目:逆波兰式生成目标代码
逆波兰式,用于编译器的实现,效率高,但是实现的难度相对于四元式,本人认为要高。

#include<iostream> /* 基本输入输出流 */
#include<stack> /* 运用栈,省去自己再写栈 */ 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<char> 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。

相关主题