# ToyC **Repository Path**: thincats/ToyC ## Basic Information - **Project Name**: ToyC - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-25 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 依赖 - C++ 17 - bison > 3.6 (Bison在2020年5月下旬更新为3.6版本,导致部分enum符号定义变动,为了成功编译,最好使用3.6.2版本) - flex > 2.5 - LLVM 10 (使用了一些辅助数据结构,如ArrayRef等,LLVM需要带rtti支持) - libfort (用于打印符号表,源码已引入到项目中) ## 构建与编译 本次实验使用CMake作构建系统,具体配置可见项目根目录以及lib子目录下的CMakeLists.txt文件。CMakeLists中也配置好了Bison/Flex。 构建步骤 ```sh mkdir build cd build cmake .. make -j ``` 其中,Flex/Bison生成的文件会存放在`build/Generate/Generate`目录下,在`build/Generate`也生成了Bison的Report File,HTML版分析表等文件。 ## 运行 ### 词法分析和语法分析 一个涵盖基本语法的测试源代码在`test/lc-file`文件夹中 构建完成后,在`build/`目录下会出现可执行文件`toyc`,可以使用`toyc --help`查看使用说明,目前支持两个功能 1. 打印Lexer二元组 ```sh ./toyc --Lexer ../test/lc-file/test.lc ``` 2. 打印AST ```sh ./toyc --PrintAST ../test/lc-file/test.lc ``` ### 语义分析 一个涵盖基本,正确的语义源代码文件位于`test/sema/correct/correct.lc` 用于检查能够支持多少语义检测的源文件位于`test/sema/error/error.lc` 目前toyc支持三个参数 1. 语义分析 ```sh ./toyc --SemaAnalysis ../test/sema/correct/correct.lc ``` 程序将进行语义分析,如果有语义错误,将会打印相应错误信息 2. 打印符号表 ```sh ./toyc --SemaAnalysis ../test/sema/correct/correct.lc --show-symtab ``` 完成语义分析后,能够打印在语义分析过程中构建的所有符号表 3. 设置符号表打印等级 ```sh ./toyc --SemaAnalysis ../test/sema/correct/correct.lc --show-symtab --symtab-print-level=func ``` 一共有三个打印等级 ```sh all -> 打印所有符号表,包括匿名符号表(如CompStmt产生的作用域) func -> 只打印全局和函数中的符号表 global -> 只打印全局符号表 ``` 默认为`all` ### 中间代码生成 ```sh ./toyc --IRGen ``` ### 目标代码生成 测试文件位于test/codegen/test.lc 生成汇编或者目标文件 ```sh # 目标文件 ./toyc --CodeGen test/codegen/test.lc --filetype=obj --output-codegen-file=test.o # 汇编文件 ./toyc --CodeGen test/codegen/test.lc --filetype=asm --output-codegen-file=a.s ``` 语言支持函数前置声明,所以可以考虑编写标准库文件,提供一些IO函数,并与glibc进行链接,如生成的目标文件为test.o,标准库为toyc-std.o ``` ld -dynamic-linker /lib64/ld-linux-x86-64.so.2 /usr/lib/crt1.o /usr/lib/crti.o -lc test.o toyc-std.o /usr/lib/crtn.o ``` 链接成功后,使用`./a.out`即可运行 ## 项目结构 ```sh include/ -> 头文件 include/Basic -> 基本定义 include/AST -> 抽象语法树节点等相关定义 include/Lexer -> C++版本Flex的定义文件,Scanner类 include/Parser -> C++版本Bison的定义文件 include/Sema -> 语义分析相关代码 include/IRGen -> 中间代码生成相关代码 include/CodeGen -> 目标代码生成相关代码 include/Optimize -> 优化相关代码 include/Utils -> 工具函数相关代码 **/_ignore -> 自动生成文件的模板文件,使用gcc -E,减少样板代码 lib/ -> 源代码文件 grammer.bnf -> 部分语言语法 main.cc -> 入口文件 ```