编译原理实验三:中间代码生成
1 简介
实验三通过在语法分析过程中的合适位置插入translate_somenode进行中间代码生成。并最终打印出中间代码。
1.1 完成的功能
完成了实验指导书上要求的所有必做与选做功能,通过了实验指导书提供的4个样例。
1.2 编译步骤
make
1.3 文件结构
- include
- common.h
- intercode.h
- translate.h
- log.h
- table.h
- tree.h
- type.h
- src
- lexical.l
- syntax.y
- main.c
- tree.c
- table.c
- type.c
- semantic.c
- 添加了对翻译中间代码的函数的调用
- error.c
- log.c
- intercode.c
- 包含中间代码的相关操作
- translate.c
- 将语法树翻译为中间代码的相关函数
2 关键功能与实现方法
2.1 中间代码
中间代码采用线性中间代码,以链表形式组织
2.2 中间代码生成
在语法分析的合适位置插入翻译中间代码的函数。
2.3数据结构
符号表中每一条记录采用如下数据结构:
struct Operand_
{
enum {VARIABLE,TEMP,ADDRESS,STRING,CONSTANT} kind;
int kind2;//0 is value,1 is address
int isStruct;
union{
int var;
char* str;
}u;
};
struct InterCode_
{
enum {ASSIGN,ADD,SUB,MUL,DIV,EMPTY,FUNCDEC,FUNCCALL,SPFUNCCALL,ARG,LABEL,COND,GOTO,RETURN,PARAM,DEC,ADDR_ASSIGN,ARRAY_ASSIGN} kind;
struct{
Operand op1,op2,op3;
int val;
char* str;
}u;
InterCode last,next,head,tail;
};
3 存在的问题
当前代码还存在很多不完善的地方,若有时间将进行完善。
- 由于实验中遇到的各种细节问题,在不断修改之下,Operand的结构显得比较混乱。
- 放弃了实验二中实现的多层作用域(实验三假定所有变量均不重名,因此暂时不影响实验三)
- 如数组a[2][2],不支持对a[0]的直接访问或将其进行参数传递