武汉理工大学华夏学院
课 程 设 计
课程名称 《编译方法》课程设计
题 目 布尔表达式的递归下降翻译程序设计
专 业 计算机应用
班 级 1072
班
学 号
姓 名
成 绩
指导教师 何九周 段学东
2009 年 6 月 29 日
目 录
摘要……………………………………………………………………1
引言……………………………………………………………………1
任务书…………………………………………………………………2
设计方案与实施………………………………………………………3
参考文献 ……………………………………………………………17
设计进度及完成情况 ………………………………………………17
答疑 …………………………………………………………………18
摘要
在程序语言中,布尔表达式有两个基本的作用:一是用作逻辑赋值语句中的逻
辑运算,二是用作控制语句如 if-then、if-then-else 和 while-do 等之中的条
件表达
引言
布尔表达式是由布尔算符 and,or 和 not 施于布尔变量或关系表达式而成。即
布尔表达式的形式为 E1 rop E2,其中 E1 和 E2 都是算术表达式,rop 是关系
符,如< =,<,=,〉=,≠等等。
只考虑简单的布尔表达式文法:
E→E and E | E or E | not E | id rop id | id
并且按通常习惯,约定布尔算符的优先顺序(从高到低)为 not 、and、or,
并且 and 和 or 服从左结合。
通常,计算布尔表达式的值有两种办法,第一种办法,如同计算算术表达式一
1
样,计算出各部分的真假值,最后计算出整个表达式的值。
课程设计任务书
设计题目:布尔表达式的递归下降翻译程序设计
设计目的:
1. 巩固和加深课堂所学知识;
2. 学习掌握一般的软硬件的设计方法和查阅、运用资料的能力;
3. 掌握高级语言词法分析方法;
4. 掌握高级语言语法分析方法;
5. 掌握高级语言语义分析方法;
6. 运用高级语言编写质量高、风格好的应用程序。
设计任务 (在规定的时间内完成下列任务)
1. 按给定的题目写出符合自身分析方法要求的文法和属性文法描述;
2. 按给定的题目给出分析方法的思想及分析表设计;
3. 完成相应的词法分析、语法分析和语义分析程序设计;
4. 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程
序。
时间安排
消化资料、系统调查 1 天
系统分析、总体设计,实施计划、撰写报告 3 天
演示、验收 1 天
具体要求
1. 明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指
导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、
归纳相关资料解决具体问题的方法。严格要求自己,要独立思考,按时、独
立完成课程设计任务。
2. 设计报告:要求层次清楚、整洁规范、不得相互抄袭,凡正文内容有整段完
全相同者一律以抄袭论处。设计报告正文字数不少于 0.2 万字(不包括附
录)。包含内容:①设计题目。②目录。③正文:包括引言、需求分析、总
体设计及开发工具的选择,设计原则(给出语法分析方法及中间代码形式的
描述、文法和属性文法的设计),数据结构与模块说明(功能与流程图)、
详细的算法设计、软件调试、软件的测试方法和结果、有关技术的讨论、收
获与体会等。④结束语。⑤参考文献(按公开发表的规范书写)。⑥附录:
软件清单(或者附盘)。
3. 软件系统:界面友好,操作简单;交付的软件有必要的安装、使用说明。
指 导 教 师 签 名: 2009 年 6 月 28 日
2
教研室主任(或责任教师)签名: 2009 年 6 月 28 日
1 设计方案与实施
1.1 总体设计
布尔值的翻译方案
E→E1 or E2 {E.place = Newtemp;
GEN(or ,E1.place,E2.place,E.place)}
E→E1 and E2 {E.place = Newtemp;
GEN(and,E1.place,E2.place,E.place)}
E→not E1 {E.place = Newtemp;
GEN( not ,E1.place,_,E.place)}
E→(E1) {E.place = E1.place}
E→id1 rop id2 { E.place = Newtemp;
GEN(jrop,Entry(id1),Entry(id2) , E.place ) }
E→id { E.place= Entry(id) }
1.2 详细设计
分析过程:先用此法分析分析句子中的单词和符号,然后进行语法分析和语义分
析分析句子,最后生成逆波兰式
词法分析程序的顶层数据流图
词法分析程
3
识别一个标识符的算法描述:
recogid(char ch) /* ch 为给定字符串的第一个字符*/
{
char state='0';
while ( state!=2 ){
switch (state){
case '0':/*若当前是0状态,若读入一个字母,转向1状态*/
if (isalpha(ch)) state='1'; else error();
break;
case '1': /*若当前是1状态,若读入字母或数字,仍为1状态*/
if ( isalnum(ch) && (i<8) ) state='1';
else { state = 2;
colno--;/*退回当前读入的字符*/
}
}
将下一个符号读入ch中;
}
输入:TOKEN 文件;
输出:正确的语法单位;与后续的中间代码生成实验结果一起输出;
详细讲解语法分析的详细数据流图,与中间代码生成合在一起
4