- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《编译技术》第八章 拓展资源.doc
北航《编译技术》第八章 代码生成 拓展资源
题目:逆波兰式生成目标代码
逆波兰式,用于编译器的实现,效率高,但是实现的难度相对于四元式,本人认为要高。
#includeiostream?????????????? /* 基本输入输出流 */
#includestack????????????????? /* 运用栈,省去自己再写栈 */
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?? */
stackchar 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???????????????? ? *
* +-/*??
文档评论(0)