编译原理实验-中间代码生成(三地址代码)

具体代码已放至Github(仅供参考):

qxpBlog/Compiler_UESTC: 电子科技大学编译原理实验 (github.com)

具体实验过程如下:

一、实验内容及步骤:

1.实验内容:

在实验3及示例程序的基础上完成算术表达式、逻辑表达式、赋值语句、条件语句、循环语句对应的代码生成,函数命名分别为:genArithmeticExpr, genLogicExpr,genAssignStmt, genIfStmt, genWhileStmt,这五个函数的函数参数都为: (past node,   char* result),其中node为相关类型的结点,result 为用来保存三地址代码/LLVM虚拟指令的存储空间并且每行只放一条指令。

2.实验步骤:

(1)编写threeaddress.l文件

(2)编写threeaddress.y文件,threeaddress.y源程序的定义部分中,包含的头文件、函数声明、全局变量声明以及联合类型全局变量yylval的成员变量声明。定义部分中,使用%token定义的终结符以及使用%type定义的非终结符。threeaddress.y源程序的翻译规则(文法及对应的处理)部分中,sysy文法开始部分及其对应的处理如图2-3所示。处理部分中$$ 指的该产生式归约后数值栈栈顶元素,$n 指产生式右侧从左到右第n个符号在数值栈所对应的值。其中astRoot是链表头结点(空结点),指向链表总结点,astRoot的next为链表的第一个结点。最后,threeaddress.y源程序中的函数定义部分为空。

(3)编写ast.h文件

(4)编写ast.c文件,在showAst函数中,对与不同的结点类型,我们将打印不同的信息。创建新链表结点newList函数,其中结点的ivalue为链表结点数,left为链表的第一个具有实际意义的结点,right为尾结点。

(5)编写genthreeaddress.h文件

(6)编写genthreeaddress.c文件genthreeaddress.c文件中每一条三地址代码存储在codearry数组中,通过函数addCodes添加到数组中。基本表达式三地址代码生成函数genPrimaryExpr,该函数主要是对整数、浮点数、表达式、复合语句以及变量调用所涉及到的三地址代码生成进行处理。算术表达式三地址代码生成函数对算术表达式结点node进行三地址代码化,并将result字符类型指针指向生成的算术表达式三地址代码。其中,也对一元算术表达式进行了特殊化的处理。逻辑表达式三地址代码生成函数对逻辑表达式结点node进行三地址代码化,并将result字符类型指针指向生成的逻辑表达式三地址代码。其中,也对一元算术表达式进行了特殊化的处理。赋值表达式三地址代码生成函数对赋值表达式结点node进行三地址代码化,并将result字符类型指针指向生成的赋值表达式三地址代码。条件语句三地址代码生成函数对条件语句结点node进行三地址代码化,并将result字符类型指针指向生成的条件语句三地址代码。同时,对于条件语句有无else语句的两种情况,分别进行了相应的处理。语句表达式三地址代码生成函数对循环语句结点node进行三地址代码化,并将result字符类型指针指向生成的循环语句三地址代码。

(7)编写main.c文件,主要是打印输入字符串对应于sysy文法所形成的抽象语法树,以及其生成的三地址代码。

三、实验结论与总结:

        本次实验所实现的三地址代码生成程序,基本上能够完成对sysy文法中算术表达式、逻辑表达式、赋值语句、条件语句、循环语句对应的代码生成,并能够生成并打印相应的抽象语法树(AST)。较好的完成了本次实验的基本要求。

        通过本次实验,了解并掌握了三地址中间代码生成的基本原理,对Bison(Yacc的GNU版本)和Flex这两个工具有了更加深刻的认识与理解,能够利用Flex和Bison这两个工具自动生成识别相应文法的词法分析器、语法分析器。同时也对编译过程中中间代码分析这一环节有了一个更加深刻的认知。同时在运行本次实验提供的事例,对llvm代码生成也有了一定的了解。

  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

实名吃香菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值