# compiler **Repository Path**: pidanhub/compiler ## Basic Information - **Project Name**: compiler - **Description**: 编译原理大作业,zzs小组。2023年第一学期 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-14 - **Last Updated**: 2025-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # C minus minus compiler说明文档 ## 使用方法 g--.bat <源代码文件> ## 编码 词法分析器输出文件为语法分析所用,在lexical_analysis.h文件中定义了一个词法分析器输出的文件名,但是这样每一次运行会覆盖掉上一次运行的结果,不够好 由于没有完成编码,定义文件名无意义,如需修改输出文件名以保留每一次的运行结果,可以删除宏定义,但是需要在gcc.c中同步修改syntax_analysis函数的入参 主函数这样接收词法分析的输出,可以修改 ```c char* lexical_out = LEXICAL_OUT_PUT_FILE; if (argc >= 3) lexical_out = argv[2]; ``` ## g--.bat脚本 - 脚本中会传入两个参数,第一个是C--源文件的文件名,第二个参数可以用来传入输出的文件名(参考上一条说的,避免覆盖掉上一次输出的结果),如果不使用这种方法请忽略第二个参数,不传入即可,无需修改 - 另外,多文件编译记得在脚本的gcc编译参数中传入文件名 ## 测试 test中已经写好了测试方法,通过脚本可以运行测试。 ## 词法分析 token定义在了common.h,如果有需要定义额外的字符,可以选择定义在lexical_analysis.h中 ### 词法分析输出格式 由于不同类型的token之间的差异,比如操作符和界符的第三位有对应的整数标号(类型为整数),而int类型变量的值可以为整数或者字符串和IDN类型的token第三位只能是字符串, 导致词法分析需要区分不同类型的token选择哪一个字段输出、语法分析阶段选择哪个字段读入(char* value/int table) 有表值的选table,无表值的选value ## 语法分析 步骤,先分析文法,提取出产生式中所有信息,根据信息先构建FIRST集,然后FOLLOW集,最后是每一个文法符号串的FIRST集。构建算法全部在 **grammar.h** 中。 **预测分析表说明:** 以类似倒排表的方式构建,复用grammar数组存放预测分析表信息。 ## 数据结构 ### 通用数据结构 @see: common.h #### struct token (重要) 任何一个词都是一个token,是词法分析器的输出以及语法分析器的输入,因此该数据结构十分重要。下面是对字段的解释: - name: 待测代码中的单词符号 - type: 单词符号种别 - value/table: 单词符号内容,需要两种值的原因在于,对于存在哈希值的单词符号可以用数字表示,而标识符需要用字符串存储。哈希值在 `common.h` 中使用枚举定义,有需要时可以通过枚举的表示方式快速定位到所需要的字符(串) - line: 单词符号位于源代码中的第几行,是语法分析器输出源代码语法错误提示的重要参数 ```c struct token { char* name; struct tokenType* type; char* value; // If no need, set NULL(type 4,5) int table; // Value list in enums int line; } token; ``` ### 词法分析器中的数据结构 to be continue... ### 语法分析器中的数据结构 #### const char* V_N_hash_table[] 这是一个语法中非终结符的注册表,文法中的非终结符均可在此注册。下标会对应一个枚举,枚举类型中会定义该非终结符的编号(@see:syntax_analysis.h) @see: syntax_analysis.c #### struct Set 集合结构体。FIRST集、FOLLOW集、每一个文法符号串的FIRST集都用这个数据结构。是一个顺序表。 @see: grammar.h ```c Set* FIRST[end-dollar+1]; Set* FOLLOW[end-dollar+1]; ``` #### struct grammar 文法结构体,存储所有文法信息。包括左部、右部所有语法元素个数以及语法元素是什么、右部的FIRST集等。 @see: grammar.h ```c // 在这个结构体中包含预测分析表 grammar* grammars[128] = { NULL }; ``` 注:对于文法中不符合格式的文法进行了修改。