一、初代编译器功能描述
初代编译器将
C
语言顺序语句序列翻译为等价的汇编程序,所输出的汇编 程序符合 x86
或
MIPS
汇编语言格式要求,能够被后续的汇编器翻译为可执行程 序运行。如果目标平台为 x86
,则生成的可执行程序能够在目标机上执行和验证 结果;如果目标平台为 MIPS
,则生成的汇编程序可以在
MIPS
模拟器中运行和 验证结果。
二、初代编译器文法要求
初代编译器能够处理的文法如下所示:
关键字
:
int, return
标识符
:单个英文字母,如
a
、
b
等
常量
:十进制整型,如
1
、
223
、
10
等
操作符
:
=
、
+
、
-
、
*
、
/
分隔符
: ;
语句
:表达式语句、赋值语句
三、初代编译器测试样例
- 测试样例不用考虑优先级,即表达式中算术操作符优先级相同,且无括号。
- 所有输入测试样例文件中单词之间均由空格或者回车分隔,但输入文件中可能存在多个连续的空格或者回车。
- 评分依据 return 的值是否符合预期。生成的 MIPS 汇编代码在 QtSpim 上运 行。
四、设计思路
创建一个初代编译器,使其读取输入文件中的源代码,进行词法分析和语法分析,并生成相应的MIPS指令。
-
读取输入文件:在
Compiler
类的构造函数中,打开输入文件,并将其内容存储在字符串变量content
中。 -
使用
alpha[52]
数组来存储标识符的地址,代表相对$fp的偏移量。大写字母的ASCII码范围是65到90,小写字母的ASCII码范围是97到122。我们可以将大写字母映射到数组的后26个位置,小写字母映射到前26个位置。 -
词法分析:在
lex
方法中,将源代码分解成单词序列,并将每个单词的类型和值保存到mipsInstructions
向量中。单词的类型包括关键字、标识符、常量、操作符和分隔符。 -
语法分析:在
generateCode
方法中,根据词法分析的结果,生成相应的MIPS指令。这个方法首先遍历词法分析结果,处理变量声明语句和返回语句。然后,对于赋值语句和表达式语句,根据右侧表达式的类型生成相应的MIPS指令,将结果存储到相应的变量中。在处理表达式时,调用了expression
方法,该方法递归地解析表达式,并生成相应的MIPS指令。 -
输出MIPS指令:在
printMipsInstructions
方法中,打印生成的MIPS指令序列。