ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:161.26KB ,
资源ID:14432769      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-14432769.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编译原理中间代码优化.docx)为本站会员(b****5)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

编译原理中间代码优化.docx

1、编译原理中间代码优化实验三 中间的代码优化某些编译程序在中间代码或目标代码生产之后要对其进行优化,所谓优化就是对代码进行等价的变换。而变换后的代码运行结果与变换前的代码运行结果相同。而运行速度加快或占用内存空间减少。中间的代码优化就是对中间代码进行等价的变换。 基本块的有向图 DAG(Directed Acyclic Graph)有向图中任何一条通路都不是环路,则称该有向图为无环路有向图,简称为DAG。一、 实验题目:中间代码的局部优化二、 实验目的:掌握局部优化方法、提高机器的运行速度三、实验内容:1 、构造基本块内的优化DAG 假设:(1) ni 为已知结点号,n为新结点号;(2)访问各结

2、点信息时,按结点号逆序排序2、完成对下例三类表达式的优化(1)常值表达式的优化(2)公共表达式的优化(3)无用赋值的优化3、输出根据优化的DAG重组四元式四、设计概要:首先要实现表达式中间代码生成,采用递归下降子程序法实现。ET0 “push(SYN,w)”T“QUAT” TF1”push(SYN,w)”F“QUAT”Fi“push(SEM,entry(w)”|(E)其中:push(SYN,w)-当前单词w入符号栈SYN;push(SEM,entry(w)- 当前i在符号表中的入口值压入语义栈SEM;QUAT-生成四元式函数 T:=newtemp; QTj=(SYNk,SEMs-1,SEMs,

3、T);j+; pop(SYN,_);pop(SEM,_);pop(SEM,_); push(SEM,T);在对中间代码进行局部优化五、程序代码及运行结果:1.表达式中间代码生成#include#includeusing namespace std;char str50;char sem50;char syn50;char ch;int i=0;int j=0;int n=0;int p=1;void push_sem(char w) semj+=w;void push_syn(char w) synn+=w;void Gen() char s22; char w; w=sem-j; if(w=

4、1&w=1&w=9) s11=w; s10=sem-j; else s10=w; s11= ; cout(syn-n,s10s11,s00s01,tp+)endl; push_sem(t); push_sem(p+47);int F() int m; int E(); if(ch=() ch=stri+; m=E(); if(ch=) ch=stri+; else /cout表达式error!=a&ch=1&ch=9) push_sem(ch); ch=stri+; else /cout表达式error!endl; return 0; return 1;int T() int k,m,l; k

5、=F(); if(k=0)return 0; while(1) /push_syn(ch); if(ch=*) push_syn(ch); ch=stri+; m=F(); if(m=0)return 0; Gen(); else if(ch=/) push_syn(ch); ch=stri+; l=F(); if(l=0)return 0; Gen(); else break; return 1;int E() int k,m,l; k=T(); if(k=0)return 0; while(1) /push_syn(ch); if(ch=+) push_syn(ch); ch=stri+;

6、 m=T(); if(m=0)return 0; Gen(); else if(ch=-) push_syn(ch); ch=stri+; l=T(); if(l=0)return 0; Gen(); else break; return 1;int main() int k,q=0; char w1,w2,w; char s12; coutstr; w1=stri+; w2=stri+; if(w2!=) i=i-2;q=1; ch=stri+; k=E(); if(q=0) w=sem-j; if(w=1&w=9) s01=w; s00=sem-j; else s00=w; s01= ;

7、cout(w2,s00s01, ,w1)endl; if(k=0) couterror!endl; else if(ch=#) coutOK!endl; else couterror!endl; return 0;运行结果:2.代码优化:(采用递归下降子程序法判断表达式是否合法,方法如上)#include #include #include using namespace std;int i=1; int j=0,n=0; int p; int m=1;int Ti=0;char prog100; char ch;char syn20,sem503; void SEM(void) int i,

8、j; for(i=0;i50;i+) for(j=0;j3;j+) semij=0;struct quat/四元式结构 char result8; char ag18; char op; char ag28;quad25,newquad15;struct Ni/节点结构 int pre2; char op; char bz258;N25;void newN(void) int l,j; i+; for(j=0;j25;j+) for(l=0;l8;l+) Ni-1.bzjl=0; for(j=0;j2;j+) Ni-1.prej=0; Ni-1.op=0;void dagt(void); vo

9、id newquat(void);void fuzhi(void);/递归语法分析生成中间代码void E(void);void T(void);void F(void);void pop0(char sz);void push0(char sz,char x);void pop1(char sz503);void push1(char sz503,char x3);void quat1(void); void quat0(char w);void print1(void);void print2(void);char *newT(void) char *p; char m8; p=(char

10、 *)malloc(8); Ti+; itoa(Ti,m,10); strcpy(p+1,m); p0=t; return(p);void main() p=0; syn0=#; SEM(); sem00=#; cout请输入表达式:endl; do cin.get(ch); if(ch != n) progp+=ch; while(ch!=#); p=0; ch=progp+; while(ch!=#) fuzhi(); print1(); dagt(); newquat(); print2(); void fuzhi(void) char temp3; temp0=0; temp1=0;

11、temp2=0; if(ch=a)|(ch=A) temp0=ch; push1(sem,temp); ch=progp+; if(ch=) push0(syn,ch); ch=progp+; E(); if(m=0) cout错误1!endl; system(pause); / return; if(ch=;) ch=progp+; quat1(); else cout错误2!endl; system(pause); return; else cout错误3!endl; system(pause); return; else cout错误4!endl; printf(%d,ch); syst

12、em(pause); return; /E、T、F是递归下降子程序的语法分析void E(void) char w; T(); while(ch=+|ch=-) push0(syn,ch); w=synstrlen(syn)-1; ch=progp+; T(); quat0(w); void T(void) char w; F(); while(ch=*|ch=/) push0(syn,ch); w=synstrlen(syn)-1; ch=progp+; F(); quat0(w); void F(void) char temp3; temp0=0; temp1=0; temp2=0; if

13、(ch=() ch=progp+; E(); if(ch=) ch=progp+; else m=0; else if(ch=a)|(ch=A)|(ch=0) temp0=ch; push1(sem,temp); ch=progp+; else m=0;void push0(char sz,char x) int top; top=strlen(sz); sztop=x; top+; sztop+1=0;void pop0(char sz) int top; top=strlen(sz)-1; sztop=0;void push1(char sz503,char x3) int top=1;

14、while(sztop0) top+; strcpy(sztop,x); top+; sztop+10=0;void pop1(char sz503) int top=1; while(sztop0) top+; top-; sztop0=0; sztop1=0; sztop2=0;void quat0(char w) int top=1,i; char *p; while(semtop0) top+; strcpy(quadj.ag1,semtop-2); strcpy(quadj.ag2,semtop-1); quadj.op=w; p=newT(); for(i=0;i8;i+) qua

15、dj.resulti=pi; pop1(sem); top-; pop1(sem); top-; for(i=0;i3;i+) semtopi=quadj.resulti; semtop2=0; j+;void quat1(void) char ag28; int top,i; top=1; while(semtop0) top+; ag20=_; for(i=1;i8;i+) ag2i=0; strcpy(quadj.ag1,semtop-1); strcpy(quadj.ag2,ag2); quadj.op=; strcpy(quadj.result,semtop-2); pop0(syn

16、); pop1(sem); pop1(sem); j+;void print1(void) int i; cout原来的四元组:endl; for(i=0;ij;i+) cout(i+1)、(quadi.op,quadi.ag1,quadi.ag2,quadi.result)endl;void dagt(void) int m,n,top,l,tag=0,tag1=0,tag2=0; char temp; for(m=0;m0;n-) for(l=0;l25;l+) if(strcmp(quadm.ag1,Nn-1.bzl)=0) tag=n; break; if(tag!=0) tag1=t

17、ag-1; if(0quadm.ag10&quadm.ag109) goto N3; else goto N3; else if(0quadm.ag10&quadm.ag109) if(quadm.ag20!=_) if(0quadm.ag20&quadm.ag200;n-) for(l=0;l0;n-) for(l=0;l25;l+) if(strcmp(quadm.result,Nn-1.bzl)=0) tag=n; top=l; break; if(tag!=0) for(l=top+1;l0;n-) for(l=0;l0;n-) if(Nn-1.pre0=tag1)&(Nn-1.pre

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2