编译原理实验三:中间代码生成

时间:2022-12-08 03:56:36

编译原理实验三:中间代码生成

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]的直接访问或将其进行参数传递