CPCC 抽象语法树三地址码生成.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
CPCC 抽象语法树三地址码生成

CPCC 抽象语法树三地址码生成   摘要:为了便于代码优化及指令生成,在并行C语言编译器CPCC(Concordia Parallel C Compiler)将源程序的抽象语法树(Abstract Syntax Tree, AST)转换成目标机PAAG(Parallel Array Architecture GPU)处理器的汇编代码时,采用了三地址码作为中间表示形式。基于CPCC AST的结构特点,将AST到三地址码的转换分为三类,即一般表达式的翻译、布尔表达式的翻译以及语句的翻译,并给出了其详细设计思路及是实现方法。实验结果表明,该方案实现了从源码的抽象语法树到三地址码的转换。   关键词:编译器;中间表示;抽象语法树;三地址码   中图分类号:TN911 文献标识码:A 文章编号:1009-3044(2013)34-7753-06   PAAG(Parallel Array Architecture GPU)是西安邮电大学自主开发的高性能图形、图像处理器[1]。为了给PAAG处理器实现并行C语言编译系统,采用移植已有的并行C语言编译器CPCC[2]的方法。CPCC产生的是针对堆栈机器的伪代码(其作用相当于目标机器的汇编码),堆栈机代码是一种单地址码[3],但目标处理器PAAG的汇编指令是三地址形式。为了将CPCC移植到目标机PAAG上,我们以CPCC编译产生源代码的AST形式为基础,将其转换为PAAG的汇编码。首先将AST转换成一种更接近PAAG汇编码的线性中间表示形式——三地址码,再经过代码生成模块实现从三地址码到汇编码的转换。三地址码不仅在形式上与目标机器的汇编指令集更加接近,从三地址码生成汇编码要更容易些;更重要的是,目前有很多成熟的与机器无关的编译优化技术都是在程序的三地址码这种线性中间表示形式上来处理的[4],在生成三地址码后,可以利用这些技术进行与机器无关的优化,以生成更加紧凑高效的代码,这对于提高编译器的性能是非常有意义的。   本文一共分为四个部分,第一部分和第二部分分别介绍CPCC的中间表示—AST和所要翻译成的三地址码及其格式;第三部分介绍从AST到三地址码的翻译;第四部分是实验结论。   1 CPCC的AST   抽象语法树(Abstract Syntax Tree,AST)是对被编译源程序语法分析的图表示[5]。CPCC的AST由4类节点构成,分别是SYMBOL、LINK、VALUE和STMT节点。其中SYMBOL节点用来描述源程序中声明部分出现的标识符;以VALUE节点为根的子树描述源程序中对应的表达式,通常它可以求得一个值;LINK节点用来描述SYMBOL节点以及VALUE节点的类型;以STMT节点为根的子树表示源程序中出现的由各种表达式按照某种语法规则组成的语句,如各种控制流语句(if_else等)。各个节点连接起来形成的AST实现对源程序的语法描述。   2 三地址码   三地址码包含一个操作符,两个源操作数跟一个目的操作数。目的操作数用来存放源操作数经过操作符对应操作处理后生成的结果,或者对于转移操作,目的操作数代表要转移的目的地址。三地址码中源操作数的数目可以小于两个[3-6]。所谓“地址”就是三地址码的操作数,它可以是源码中变量的名字;可以是一个整型常量;也可以是一个带下标的t,如t3。这些t表示由编译器计算产生的临时变量。   在本文出现的三地址码主要有以下形式:   3 AST到三地址码的翻译   CPCC的AST将C程序分为两种语法范畴:表达式(对应AST中以VALUE节点为根的子树)以及由表达式组成的语句(对应AST中以STMT节点为根的子树)。因此我们很自然的将程序的翻译分为两类:表达式的翻译和语句的翻译。但是,当表达式作为决定程序流向的判断条件时,如在关键词while后充当判断循??结束的条件,其作用只是实现程序的跳转,此时它的翻译又不同于在其它地方的处理,这类通过判断真假来控制程序流向的表达式称为布尔表达式。因此我们将表达式的翻译又分为一般表达式的翻译和布尔表达式的翻译。下面将分别阐述对一般表达式、布尔表达式和语句等三类翻译的设计方案。   3.1一般表达式的翻译   一般表达式能够计算出一个值,对表达式的翻译应该完成两个功能:1生成表示该表达式语义动作的三地址码;2返回表达式的计算结果,该结果可能被用于更高一层表达式的运算。这种处理由int spit_expr(VALUE *v, int rlv)函数完成。参数VALUE类型指针v代表要处理的表达式;参数rlv表示表达式是被当做左值还是右值处理的。spit_expr()函数的流程图如图1所示(图中v→code代表表达式的类型,逗号表达式中相邻两个子表达式对应的VALUE节点用next指针相

文档评论(0)

130****9768 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档