编译原理课程设计 课程设计内容 扩展PL/0语言的实现(含编译器和解释器) 编译器:把源程序翻译成中间语言程序 解释器:中间语言的解释器 对PL/0语言进行扩展(该扩展已基本完成) 对中间语言进行扩展(由同学自己设计) 把PL/0语言的编译器和解释器升级成扩展PL/0语言的编译器和解释器
编译原理课程设计 PL/0语言介绍 Pascal语言的一个子集,一个小巧的高级语言 只有整数类型 程序结构 有相当完全的可嵌套的分程序(block)结构 分程序中可以有常量定义、变量声明和无参过程声明,过程体又是分程序 语句:赋值语句、条件语句、循环语句、过程调用语句、复合语句和空语句
编译原理课程设计 PL/0语言的扩展 必须严格按照“课程实践项目”规定的扩展PL/0的语法和语义 增加像C语言那样的形式为/ …… /的注释 增加带else子句的条件语句和exit语句 增加输入输出语句 增加带参数的过程 增加布尔类型、实数类型、数组类型 增加函数类型 分离解释器和编译器为两个独立的程序 必须严格按照“课程实践项目”规定的扩展PL/0的语法和语义
编译原理课程设计 PL/0编译器简介 一遍扫描的编译器,有两个功能 把源程序翻译成中间代码 解释执行中间代码 递归下降的预测分析方法,采用紧急方式的错误恢复 中间语言是一种栈机器代码,其指令有三个域 操作码 f 层次差 l 多用途a:地址偏移、指令地址或常数等
编译原理课程设计 运行时存储空间的组织和管理 栈增长方向 用一维数组s 实现栈式存储分配 每个活动记录中有静态链、 动态链、返回地址 局部数据 b t 静态链 动态链 返回地址 计算栈 栈增长方向 运行时存储空间的组织和管理 用一维数组s 实现栈式存储分配 每个活动记录中有静态链、 动态链、返回地址 和局部变量 把活动记录栈的栈顶作为计算栈
编译原理课程设计 运行时存储空间的组织和管理 栈增长方向 指令有三个域 操作码 f 层次差 l 多用途a: 局部数据 b t 静态链 动态链 返回地址 计算栈 栈增长方向 运行时存储空间的组织和管理 指令有三个域 操作码 f 层次差 l 多用途a: 地址偏移、指令地址或常数等 向计算栈中压数据指令 lit:将常数装入栈顶的指令 lod:将变量的值装入栈顶的指令 6
编译原理课程设计 运行时存储空间的组织和管理 栈增长方向 指令有三个域 操作码 f 层次差 l 多用途a: 局部数据 b t 静态链 动态链 返回地址 计算栈 栈增长方向 运行时存储空间的组织和管理 指令有三个域 操作码 f 层次差 l 多用途a: 地址偏移、指令地址或常数等 取计算栈中数据进行计算的指令 opr:一组算术和关系运算的指令 7
编译原理课程设计 时间安排 4月中旬开始,5月中旬结束 5月10日发布一些测试程序 5月15日24点以前通过网络提交课程设计,提交方式另行通知 提交内容如下,做成一个压缩文件,压缩文件以学号命名,无须分目录 编译器和解释器的源程序 编译器和解释器的可执行程序 介绍自己特色的ppt文件(限5页以内) 评测安排在5月21, 22, 28, 29日四天
编译原理课程设计 程序的测试环境 测试环境:Windows XP平台 不提供任何C或C++的编译工具,没有动态链接库 每个同学测10个程序,同组用同样的测试程序 9
编译原理课程设计 课程设计成绩评定——评分方式和过程 约12个学生一组(5月16日公布分组名单) 评委:教师、助教、同组所有同学(大家参与,公开评分) 教师主导测试过程、学生自己动手按要求操作,操作过程和结果显示在投影幕布上 老师提问,同组同学也可以提问,当众回答 问题主要围绕完成的设计和编程,以及测试中暴露出的设计或编程错误
编译原理课程设计 课程设计成绩评定——评分依据 编译器和解释器的正确性 所设计的中间代码的合理性 错误定位与恢复能力 编程的规范性 操作的熟练程度 回答问题时所表现出的对本课程设计所涉及的编译知识的掌握程度 对自己设计和编码的编译器和解释器的熟悉程度 提问的数量和质量
编译原理课程设计 课程设计成绩评定——成绩确定 每个评委给该组同学排名次,同学评委的排名要包括自己(评分表必须署名) 由助教根据所有有效排名表,给出最终的排名 由老师根据本组的情况,确定本组的最高分和最低分,依据排名,按等间隔确定每个同学的分数 被老师、助教和过半数同学认为所提交程序不是自己课程设计成果时,则0分 未按时交也是0分 成绩评定方法若有考虑不周之处,解释权在老师