Skip to content

南开大学软件学院编译原理作业:简单C语言编译器

License

Notifications You must be signed in to change notification settings

Youggls/Compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

539ddec · Dec 21, 2019
Dec 21, 2019
Dec 21, 2019
Dec 21, 2019
Dec 17, 2019
Sep 4, 2019
Dec 21, 2019
Dec 21, 2019
Dec 21, 2019
Dec 20, 2019

Repository files navigation

Compiler

项目要求

编译器演示程序,可将C 语言测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误。

  1. 基本要求

    • 数据类型:int

    • 语句:注释,声明,赋值,循环(while和for)判断(if),输入输出

    • 算术运算:+,-,*,/,%,^

    • 关系运算:==,>,<,>=,<=,!=

    • 逻辑运算:&&(与),||(或),!(非)

  2. 完成功能

    功能 分值
    词法分析 6分
    语法分析 8分
    类型检查 4分
    代码优化 1分
    汇编程序 3分
  3. 提交内容

    • 编译器源程序文本,包括Lex、Yacc 等程序和C/C++程序。

    • 实验报告(3 分)

  4. 检查作业内容及时间

    a) 词法分析结果(9.30-10.12)

    b) 语法分析结果-语法树(10.28-11.4)

    c) 可执行文件生成结果(12.9-12.16)

  5. 加分项:

    1. 支持过程或函数调用+1.5

    2. 支持数组运算一维数组+1 多维数组+1.5

    3. 支持指针运算一维指针+1 多重指针+1.5

    4. 支持结构体+1

环境准备

  • 操作系统:Ubuntu LTS 18.04,或者其他的GNU LINUX发行版

  • 依赖包:nasmflexbisongcc-multilibbuild-essential

如何运行

  • 在代码根目录执行make

  • 执行make build

  • cd build,然后执行make

  • 运行文件生成的二进制文件

文件目录说明

  1. common目录

    包含了主要类文件,目录下的trees.h文件包含了与语法树相关的类,外部使用时只需要包含该头文件即可包含所有相关头文件

    • symbol子目录

      包含了symbol符号表类、FuncSymbol符号表类的源文件

    • trees子目录

      包含了抽象语法树(AST)相关类源文件

    • util子目录

      包含主要工具类,中间代码类、汇编代码生成类、io汇编源文件

  2. Linux/MacOS

  3. Makefile,Linux系统的构建文件

相关代码说明

  1. ./common/symbol/symbol.hSymbolTable类的说明

    类方法 返回值 参数列表 作用 参数意义
    SymbolTable bool isFun 唯一公有构造函数,创建一个空的符号表 该作用域是否为函数
    createChildTable SymbolTable* bool isFun 创建一个子符号表并返回(已经设置了peer指针和child指针,调用者无需负责) 该子符号表控制作用域是否为函数
    addSymbol int string idName, symbolType idType 尝试向当前符号表添加符号,如果存在相同符号名返回-1,成功则返回0 符号名和符号类型
    findSymbol symbol* const string name 在符号表中搜索符号,如果当前符号表没有搜索到则向父级符号表搜索 符号名
  2. ./common/symbol/symbol.hsymbol类的说明

    请负责中间代码生成部分的程序员注意,不需要修改offset值和index值,开放给中间代码生成部分的类成员变量只有idName和idType