
编译原理课程设计报告zlsq.pdf
52页课 程 设 计 报 告课 程 设 计 报 告 班 级:计算机 1204 组长学号:20123919 组长姓名:周振亮 指导教师:王会珍 设计时间:2014 年 12 月 设计题目:一个简单文法的编译器前端设计与实现 设计题目:一个简单文法的编译器前端设计与实现 设计分工 组长学号及姓名:20123919 周振亮 分工:设计 LL(1)文法、划分模块、实现 LL(1)中的 SELECT 集合求解以及分析表,总体调用和修改其他组员的模块 组员 1 学号及姓名:20123902 李铮 分工:建立流程图,在文法和数据表的基础上利用递归子程序设计并实现四元式的生成 组员 2 学号及姓名:20123909 宋鹏光 分工:通用自动机的设计和实现,其中主要实例浮点数自动机识别的实现、预定义的编写、部分数据表的定义 组员 3 学号及姓名:20123907 秦振 分工:词法分析中字符串、关键字、分界符的识别、部分数据表的定义 摘要摘要 这里主要用了 LL(1)方法分析设计实现了 C 语言部分功能,其中包括变量声明,变量赋值,逻辑判断,算法运算,判断语句,循环语句建立了自定义文法、TOKEN 序列和生成了四元式并给出了活动记录;程序方面通过预定义、自定义数据 VECTOR、CLASS 多重继承、面向对象等方式实现,建立了清晰的层次划分,可扩展性高,健壮性好。
自定义文法在 PASCAL 文法基础上自行设计而出,分析过程中主要划分两个步骤:词法分析,语法分析词法分析中,建立了各种数据表,并生成 TOKEN序列以供总体调用;语法分析中,求解生成式 SELECT 集合,建立 LL(1)文法分析表,运算过程中通过对 TOKEN、分析表、数据表、活动表调用生成中间代码四元式 程序实现方面,通过统一析构,划分为五大模块:预定义、数据表声明、数据表定义、数据表操作、统一调用接口数据表主要是通过 STRUCT 数据块和VECTOR 容器实现自定义数据,并相应设计实现了对应的基本操作各个模块主要 CLASS 多重继承实现,调用接口总领编写提高代码复用和健壮性 关键字关键字:LL(1) TOKEN CLASS PASCAL 词法分析 语法分析 中间代码 接口 STRUCT VECTOR 目录 1. 概述概述 1 2. 课程设计任务及要求课程设计任务及要求. 1 2.1. 设计任务设计任务. 1 2.2. 设计要求设计要求. 1 3. 文法和操作文法和操作 2 3.1.3.1. 文法文法. 2 3.2.3.2. 翻译文法翻译文法. 2 3.3.3.3. 语义动作语义动作. 3 3.4. SELECT 集合表集合表 3 4. 算法及数据结构算法及数据结构. 4 4.1. 算法的总体思想(流程)算法的总体思想(流程) . 4 4.2. 预定义模块预定义模块. 5 4.2.2. 数据结构数据结构 . 5 4.2.3. 算法算法 . 5 4.3. 数据声明模块数据声明模块 . 5 4.3.1. 功能功能 . 5 4.3.2. 数据结构数据结构 . 6 4.3.3. 算法算法 . 6 4.4. 数据表定义模块数据表定义模块 . 6 4.4.1. 功能功能 . 6 4.4.2. 数据结构数据结构 . 7 4.4.3. 算法算法 . 7 4.5. 数据表操作模块数据表操作模块 . 7 4.5.1. 功能功能 . 7 4.5.2. 数据结构数据结构 . 8 4.5.3. 算法算法 . 9 4.6. 统一调用接口模块统一调用接口模块 . 10 4.6.1. 功能功能 . 10 4.6.2. 数据结构数据结构 . 10 4.6.3. 算法算法 . 10 5. 程序设计与实现程序设计与实现. 10 5.1. 程序流程图程序流程图. 10 5.2. 程序说明程序说明. 12 5.3. 实验结果实验结果. 12 5.3.1. 测试代码测试代码 . 12 5.3.2. 测试结果测试结果 . 13 6. 结论结论 15 7. 参考文献参考文献 15 8. 收获、体会和建议收获、体会和建议. 15 9. 附录附录 16 1 1. 概述概述 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,在系统软件中占有十分重要的地位。
编译原理课程设计是本课程重要的综合实践教学环节,是对平时实验的一个补充通过编译器相关子系统的设计,使我们能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识;培养我们独立分析问题、解决问题的能力,以及系统软件设计的能力;培养我们的创新能力及团队协作精神 2. 课程设计任务及要求课程设计任务及要求 2.1. 设计任务设计任务 1) 一个简单文法的编译器前端的设计与实现 2) 定义一个简单程序设计语言文法(包括变量说明语句、算术运算表达式、赋值语句;扩展包括逻辑运算表达式、If 语句、While 语句等) ; 3) 扫描器设计实现; 4) 语法分析器设计实现; 5) 中间代码设计; 6) 中间代码生成器设计实现 2.2. 设计要求设计要求 实现一个简单文法的编译器前端,定义一个简单程序设计语言文法,实现变量语说明语句、算术运算表达式、赋值语句;其中包含扩展如逻辑表达式的实现,if 判断语句的实现,while 循环语句的实现等;其中设计实现扫面器,设计实现文法分析器,并且设计实现并输出中间代码 2 3. 文法和操作文法和操作 3.1.文法 3.1.文法 => main() => {} => ;|Ɛ => ||| => var= => if()end => while()end => var => ,var|Ɛ => => +| —|Ɛ => => *| /|Ɛ => var|num|() => => int|char|flaot|string => |= 3.2.翻译文法 3.2.翻译文法 => main() => {} => ;|Ɛ => ||| => var“α10““α10“=“α5““α5“ => if()“α6““α6“end“α7““α7“ => while()“α8““α8“end“α9““α9“ => var => ,var|Ɛ => => +“α1““α1“| —“α2““α2“|Ɛ => => *“α3““α3“| /“α4““α4“|Ɛ => var“α10““α10“|num“α11““α11“|() => “α13““α13““α12““α12“ 3 =>int|char|flaot|string => |= 3.3.语义动作 3.3.语义动作 3.4. SELECT 集合表集合表 表表 3-1:: SELECT 集合表集合表 左端左端 产生式产生式 select 集合集合 main() main {} { ; var,if,while,int, char,float,string Ɛ } var if while int,char,float,string var“αα10“=“αα5“ var α5: NEW T; (=, SEM(S), —, SEM(S-1)); POP (SEM,—); POP (SEM,—); α6: (if, SEM(S), —, —); POP (SEM, —); α7: (end, —, —, —); α8: (while, SEM(S), —, —); POP (SEM, —); α9: (end, —, —, —); α10: PUSH(SEM, var); α11: PUSH(SEM, num); α12: NEW T; (SEM(S-1), SEM (S-2), SEM(S), T); POP (SEM, —); POP (SEM, —); POP (SEM, —); PUSH (SEM, T); α13: PUSH(SEM, logic); α1: NEW T; (+, SEM(S-1), SEM(S), T); POP (SEM,—); POP (SEM,—); PUSH (SEM, T); α2: NEW T; (-, SEM(S-1), SEM(S), T); POP (SEM,—); POP (SEM, —); PUSH (SEM, T); α3: NEW T; (*, SEM(S-1), SEM(S), T); POP (SEM, —); POP (SEM, —); PUSH (SEM, T); α4: NEW T; (/, SEM(S-1), SEM(S), T); POP (SEM, —); POP (SEM, —); PUSH (SEM, T); 4 if()“αα6“end“αα7“ if while()“αα8“end“αα9“ while var int,char,float,string ,var , Ɛ ; var,num,( +“αα1“ + -“αα2“ - Ɛ ;,),,= var,num,( *“αα3“ * /“αα4“ / Ɛ +,-,;,),,= var“αα10“ var num“αα11“ num () ( “αα13““αα12“ var,num,( int int char char flaot float string string > = = 4. 算法及数据结构算法及数据结构 4.1. 算法的总体思想(流程)算法的总体思想(流程) 通过建立的自定义文法求解生成式的 SELECT 集合建立分析表,在 CLASS的基础上通过多重继承方式建立面向对象方式,并实现彼此的调用。
其中分为五大模块:预定义、数据表声明、数据表定义、数据表操作、统一调用接口 5 4.2. 预定义模块预定义模块 4.2.1. 功能功能 建立自定义文法语言的关键字、分界符、特殊符、函数返回值判断、各个数据表的归类等映射值,通过预定义使数据调用清晰,又便于补充修改和扩充 4.2.2. 数据结构数据结构 主要是同过 C 语言中的 DEFINE 关键字预定义 部分预定义代码: #define _KWTAB 1 //关键字表 #define _DTAB 2 //分界符表 #define _CSTAB 3 //常量字符串表 #define _CCTAB 4 //常量字符表 #define _CINTAB 5 //常量整形数表 #define _CFNTAB 6 //常量浮点数表 #define _STAB 7 //字符串表 #define _CTAB 8 //字符表 #define _INTAB 9 //整形数表 #define _FNTAB 10 //浮点数表 #define _VTAB 11 //变量表 #define _NVTAB 12 //无属性变量表 4.2.3. 算法算法 总体定义映射值,以供后者调用。
4.3. 数据声明模块数据声明模块 4.3.1. 功能功能 为编译器前端的实现建立各种数据表格进行预先声明, 将其单独划分为一个模块,方面以后进行数据扩充而不会影响整个程序的改动,增强复用性、可扩展性和健壮性 6 4.3.2. 数据结构数据结构 整个模块通过 C 语言 STRUCT 关键字声明自定义数据,其中同过VECTOR 容器实现线性表 表表 4-1:: 符号表符号表 NAME CAP CODE ADDR main _KWTAB KW_MAIN 0 + _DTAB S_ADD 0 … … … … … … … … 表表 4-2:: 数据表数据表 1 _KWTAB _DTAB _CSTAB _CCTAB _CINTAB。
