欢迎来到天天文库
浏览记录
ID:19312144
大小:32.41 KB
页数:64页
时间:2018-09-30
《编译原理实验指导书》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理实验指导书-----------------------Page1-----------------------编译原理实验指导书《编译原理》课程组2003年12月1-----------------------Page2-----------------------概述一、本课程实践的目的和任务编译原理是一门实践性很强的课程,只有通过实践,才能真正掌握。实际的编译程序是十分复杂的,有时由多达十几万条指令组成。为此,编译原理的实践教学,采用简化编译过程的办法,选择最关键的3个环节──词法分析、语法分析(包括
2、语义处理、产生无优化的目标指令)、连接调试,进行编程和调试训练。每个环节作为一个实践课题。先分别编程调试,再连接在一起总调。二、实践方法任何一个实用的高级语言,其语法都比较复杂,如选其作为源语言,很难实践全过程。故本实践将定义一个简化的语言──C/C++语言的一个子集作为源语言,分3个课题,设计调试出它的编译程序。前后贯穿这一条主线进行实践。每次都可利用课余时间编程,利用上机时间进行输入和调试。建议使用C/C++语言或C语言。三、实践报告的规范和要求每个课题完成后写出实践报告。实践报告包括程序设计时考虑的算法和方法
3、;调试过程中出现的问题和解决的措施;打印出程序清单和调试时所用的源程序。四、简化的C/C++语言子集的定义⒈C/C++语言子集的语法定义〈C/C++子集程序〉→〈变量说明〉〈分程序〉。〈变量说明〉→〈空〉|VAR〈变量表〉:INTEGER;〈变量表〉→〈变量〉|〈变量〉,〈变量表〉〈变量〉→〈标识符〉〈分程序〉→BEGIN〈语句组〉END〈语句组〉→〈语句〉|〈语句〉;〈语句组〉〈语句〉→〈赋值语句〉|〈条件语句〉|〈WHILE语句〉|〈分程序〉〈赋值语句〉→〈变量〉:=〈算术表达式〉〈条件语句〉→IF〈布尔表达式
4、〉THEN〈语句〉ELSE〈语句〉2-----------------------Page3-----------------------〈WHILE语句〉→WHILE〈布尔表达式〉DO〈语句〉〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉〈项〉→〈初等量〉|〈项〉*〈初等量〉|〈项〉/〈初等量〉〈初等量〉→〈无符号数〉|〈变量〉|(〈算术表达式〉)〈关系表达式〉→〈算术表达式〉〈关系运算符〉〈算术表达式〉〈标识符〉→〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉〈无符号数〉→〈数字〉|〈
5、无符号数〉〈数字〉〈关系运算符〉→〈
6、〈=
7、=
8、〉=
9、〉
10、〈〉〈字母〉→A│B│C│D│E│F│G│H│I│J│K│L│M│N│O│P│Q│R│S│T││U│V│W│X│Y│Z〈数字〉→1│2│3│4│5│6│7│8│9│0实验1词法分析介绍词法分析程序的编程与调试。(2学时)一、目的与要求1)目的通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践能力。2)要求⑴掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。⑵掌握词法分析的实现方法。⑶上
11、机调试编出的词法分析程序。二、实践题⒈题目用C/C++语言编写前述C/C++子集的词法分析程序。1)主程序设计考虑,(参阅后面给出的程序框架)主程序的说明部分为各种表格和变量安排空间。3-----------------------Page4-----------------------数组k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在p表中(学生编程时,应建立算术运算符表和关系运算符表,并且各有类号),合并成一
12、类。id和ci数组分别存放标识符和常数。instring数组为输入源程序的单词缓存。outtoken记录为输出内部表示缓存。还有一些为造表填表设置的变量。主程序开始后,先以人工方式输入关键字,造k表;再输入分界符等造p表。主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。2)词法分析过程考虑该过程取名为lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符k表示关键字;i表示标识符;c表示常数;
13、p表示分界符;s表示运算符(学生编程时类号分别为1,2,3,4,5)。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数变为二进制形式存入数组中ci中,并记录其在表中的位置。lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instrin
此文档下载收益归作者所有