编译器演示程序,可将C 语言测试程序编译为目标代码——汇编程序,用汇编器转换为二进制程序后运行无误。
-
基本要求
-
数据类型:int
-
语句:注释,声明,赋值,循环(while和for)判断(if),输入输出
-
算术运算:+,-,*,/,%,^
-
关系运算:==,>,<,>=,<=,!=
-
逻辑运算:&&(与),||(或),!(非)
-
-
完成功能
功能 分值 词法分析 6分 语法分析 8分 类型检查 4分 代码优化 1分 汇编程序 3分 -
提交内容
-
编译器源程序文本,包括Lex、Yacc 等程序和C/C++程序。
-
实验报告(3 分)
-
-
检查作业内容及时间
a) 词法分析结果(9.30-10.12)
b) 语法分析结果-语法树(10.28-11.4)
c) 可执行文件生成结果(12.9-12.16)
-
加分项:
-
支持过程或函数调用+1.5
-
支持数组运算一维数组+1 多维数组+1.5
-
支持指针运算一维指针+1 多重指针+1.5
-
支持结构体+1
-
-
操作系统:Ubuntu LTS 18.04,或者其他的GNU LINUX发行版
-
依赖包:
nasm
,flex
,bison
,gcc-multilib
,build-essential
-
在代码根目录执行
make grammar
-
在代码根目录执行
make
-
执行
make build
-
cd build
,然后执行make
-
运行文件生成的二进制文件
-
common
目录包含了主要类文件,目录下的trees.h文件包含了与语法树相关的类,外部使用时只需要包含该头文件即可包含所有相关头文件
-
symbol
子目录包含了symbol符号表类、FuncSymbol符号表类的源文件
-
trees
子目录包含了抽象语法树(AST)相关类源文件
-
util
子目录包含主要工具类,中间代码类、汇编代码生成类、io汇编源文件
-
-
Linux
/MacOS
-
Makefile
,Linux系统的构建文件
-
./common/symbol/symbol.h
中SymbolTable
类的说明类方法 返回值 参数列表 作用 参数意义 SymbolTable
bool isFun
唯一公有构造函数,创建一个空的符号表 该作用域是否为函数 createChildTable
SymbolTable*
bool isFun
创建一个子符号表并返回(已经设置了peer指针和child指针,调用者无需负责) 该子符号表控制作用域是否为函数 addSymbol
int
string idName, symbolType idType
尝试向当前符号表添加符号,如果存在相同符号名返回-1,成功则返回0 符号名和符号类型 findSymbol
symbol*
const string name
在符号表中搜索符号,如果当前符号表没有搜索到则向父级符号表搜索 符号名 -
./common/symbol/symbol.h
中symbol
类的说明请负责中间代码生成部分的程序员注意,不需要修改offset值和index值,开放给中间代码生成部分的类成员变量只有idName和idType