编译原理课程设计与实验安排
1.1课程设计的基本要求和方法
1 课程设计的目的
编译原理课程是计算机科学与技术专业学生的重要基础课程。通过学习该课程,要求学生掌握编译原理的基本原理、方法和技术。《编译原理》课程是计算机软件学科理论与实践相结合的典范,在教学过程中既要注重该领域在理论上取得的完美结论,也同时强调这些理论在实际中的应用。学生学习该课程不仅要掌握语法和语义的形式化理论,而且还必须注重在理论指导下的课程实验。《编译原理》课程设计是计算机科学与技术专业的主要实践性教学环节。在进行了专业基础课和《编译原理》课程的基础上,设计一个实际的程序语言的编译系统旨在加深对程序语言结构和机器处理方式的理解,初步掌握高级语言到机器指令的转换的基本方法,提高进行工程设计的基本技能及分析、解决实际问题的能力,为毕业设计和以后的工程实践打下良好的基础。
为了使学生从课程设计中尽可能取得比较大的收获,可选择不同的方式进行实现,同时还提供了相关的选作题目。
2 课程设计的教学基本要求
l 巩固和加深对编译原理的理解,提高综合运用本课程所学知识的能力。
l 培养学生选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。
l 能够按要求编写课程设计报告书,能正确阐述设计和实验结果,正确绘制系统和程序框图。
l 通过课程设计,培养学生严肃认真的工作作风。
3 课程设计的教学基本要求
l 巩固和加深对编译原理的理解,提高综合运用本课程所学知识的能力。
l 培养学生选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。
l 能够按要求编写课程设计报告书,能正确阐述设计和实验结果,正确绘制系统和程序框图。
l 通过课程设计,培养学生严肃认真的工作作风。
4 课程设计的要求
l 程序实现要求
(1)设计符号表
确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以高效地完成如下操作:
a.查找:根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不存在,则将其加入到符号表中,否则返回指向该名字的指针;
b.删除:从符号表中删除给定名字的表项。
(2)设计词法分析器(也可以使用FLEX生成词法分析器)
设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:
a. a. 具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计一个供词法分析调用的预处理子程序;
b. b. 能够拼出语言中的各个单词;
c. c. 将拼出的标识符填入符号表;
d. d. 返回(种别码, 属性值)。
(3)语法分析与中间代码产生器(也可以使用BISON生成语法分析程序)
要求用预测分析法、算符优先分析法、SLR分析法,实现对表达式、各种说明语句、控制语句进行语法分析。
若语法正确,则用语法制导翻译法进行语义翻译:对说明语句,要求将说明的各符号记录到相应符号表中;对可执行语句,应产生出四元式中间代码并填写到三地址码表中;
若语法错误,要求指出出错性质和出错位置(行号)。出错处理应设计成一个出错处理子程序。
(5)中间代码生成
可生成基本的四元式表示的中间代码,也可以生成虚拟机规定的汇编语言代码(相关材料以后再给)。C-语言的文法见附录。
l 组织形式要求
可以按照3-4人为一个课程设计小组,选一名组长负责组织和联系。
l 时间要求
按照规定,编译课程设计时间为一周。
5 课程设计成绩评定
课程设计完成后,根据学生课设期间的表现情况、最终程序的实现质量以及课程设计报告的书写情况进行成绩评定。采取抽查每组学生中的1-2名进行演示和老师抽问,每个人的表现将影响小组的成绩。一般情况下,满足下列条件的小组给予高分:
n 课程设计期间主动认真
n 能够较好地将理论知识应用与课程设计中解决实际问题
n 课程设计报告符合规范,内容翔实
6 课程设计上交内容
课程设计完成后,每位学生需要上交的资料包括:
n 程序代码
n 典型的测试用例及测试结果
n 课程设计报告书
附件:
《编译原理》课程设计
实验报告书
班 级:
学 号:
指导老师:
课设地点:
课设时间:
年 月 日
目 录课程设计任务
1 TINY语言的语法图描述
2 系统设计
2.1 系统的总体结构
2.2 主要功能模块的设计
2.3 系统运行流程
3 系统实现
3.1 系统主要函数说明(主要功能、输入/输出、实现思想)
3.2 系统代码(必须有注释)
4 课程设计心得
5 建议和意见
6 参考资料
附录
C-语言编译器的设计
C-Minus (或简称为C-),是一种适合编译器设计方案的语言,包括函数和数组。本质上它是C的一个子集,但省去了一些重要的部分。本部分内容包括,首先,列出了语言惯用的词法,包括语言标记的描述。其次,给出了每个语言构造的BNF描述,同时还有相关语义的描述。最后,给出了C-的示例程序,可以用这两个程序做为输入,检查自己的编译系统的有效性。
1 C-惯用的词法
1. 下面是语言的关键字:
else if int return void while
所有的关键字都是保留字,并且必须是小写。
2. 下面是专用符号:
+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */
3. 其他标记是ID和NUM,通过下列正则表达式定义:
ID = letter letter*
NUM = digit digit*
letter = a|..|z|A|..|Z
digit = 0|..|9
小写和大写字母是有区别的。
4. 空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字。
5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套。
2 C-的语法和语义
C-的BNF语法如下:
}
【实现过程中可适当删减部分功能】
测试程序
/* A program to perform Euclid's
Algorithm to compute gcd. */
int gcd (int u, int v)
{ if (v == 0) return u ;
else return gcd(v,u-u/v*v);
/* u-u/v*v == u mod v */
}
void main(void)
{ int x; int y;
x = input(); y = input();
output ( g c d ( x , y ) ) ;
}