【编译原理】实现简单的编译器

一、初代编译器功能描述

初代编译器将 C 语言顺序语句序列翻译为等价的汇编程序,所输出的汇编 程序符合 x86 MIPS 汇编语言格式要求,能够被后续的汇编器翻译为可执行程 序运行。如果目标平台为 x86 ,则生成的可执行程序能够在目标机上执行和验证 结果;如果目标平台为 MIPS ,则生成的汇编程序可以在 MIPS 模拟器中运行和 验证结果。

二、初代编译器文法要求

初代编译器能够处理的文法如下所示:
关键字 int, return
标识符 :单个英文字母,如 a b
常量 :十进制整型,如 1 223 10
操作符 = + - * /
分隔符 : ;
语句 :表达式语句、赋值语句

三、初代编译器测试样例

  • 测试样例不用考虑优先级,即表达式中算术操作符优先级相同,且无括号。
  • 所有输入测试样例文件中单词之间均由空格或者回车分隔,但输入文件中可能存在多个连续的空格或者回车。
  • 评分依据 return 的值是否符合预期。生成的 MIPS 汇编代码在 QtSpim 上运 行。

四、设计思路

创建一个初代编译器,使其读取输入文件中的源代码,进行词法分析和语法分析,并生成相应的MIPS指令。

  1. 读取输入文件:在 Compiler 类的构造函数中,打开输入文件,并将其内容存储在字符串变量 content 中。

  2. 使用 alpha[52] 数组来存储标识符的地址,代表相对$fp的偏移量。大写字母的ASCII码范围是65到90,小写字母的ASCII码范围是97到122。我们可以将大写字母映射到数组的后26个位置,小写字母映射到前26个位置。

  3. 词法分析:在 lex 方法中,将源代码分解成单词序列,并将每个单词的类型和值保存到 mipsInstructions 向量中。单词的类型包括关键字、标识符、常量、操作符和分隔符。

  4. 语法分析:在 generateCode 方法中,根据词法分析的结果,生成相应的MIPS指令。这个方法首先遍历词法分析结果,处理变量声明语句和返回语句。然后,对于赋值语句和表达式语句,根据右侧表达式的类型生成相应的MIPS指令,将结果存储到相应的变量中。在处理表达式时,调用了 expression 方法,该方法递归地解析表达式,并生成相应的MIPS指令。

  5. 输出MIPS指令:在 printMipsInstructions 方法中,打印生成的MIPS指令序列。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值