《编译原理》实验指导书(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《编译原理》实验指导书 2006-3-1
序
《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计和算法,因此,一直是一门比较难学的课程。为了使学生更好地理解和掌握编译原理和技术的基本概念、基本原理和实现方法,实践环节非常重要,只有通过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。
为了配合《编译原理》课程的教学,考虑到本课程的内容和特点,本指导书设置了七个综合性实验,分别侧重于词法分析、NFA的确定化、非递归预测分析、算符优先分析器的构造、LR分析、语义分析和中间代码的生成、基于DAG 的基本块优化,以支持编译程序的各个阶段,基本涵盖了《编译原理》课程的主要内容。
本指导书可作为《编译原理》课程的实验或课程设计内容,在课程教学的同时,安排学生进行相关的实验。实验平台可选择在MS-DOS或Windows操作系统环境,使用C/C++的任何版本作为开发工具。学生在做完试验后,应认真撰写实验报告,内容应包括实验名称、实验目的、实验要求、实验内容、测试或运行结果等。
目录
实验一词法分析........................................................................................................................... 1实验二NFA的确定化.................................................................................................................. 3实验三非递归预测分析............................................................................................................... 6实验四算符优先分析器的构造............................................................................................. 10实验五LR分析 ........................................................................................................................ 12实验六语义分析和中间代码生成........................................................................................... 17实验七基于DAG的基本块优化 ............................................................................................ 19
实验一词法分析
1.实验目的与任务
对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词法分析器的基本方法。
2.实验要求
利用该词法分析器完成对源程序字符串的词法分析。输出形式是源程序的单词符号二元式的代码,并保存到文件中。
3.实验内容
(1) 假设该语言中的单词符号及种别编码如下表所示。
(2) 关键字main int char if else for while都是小写并都是保留字。
算符和界符:= + -* / & <<=>>===!=&& || , : ; { } [ ] ( ) ID和NUM的正规定义式为:
ID→letter(letter | didit)*
NUM→digit digit*
letter→a | …| z | A | …| Z
digit→0 | …| 9
如果关键字、标识符和常数之间没有确定的算符或界符作间隔,则至少用一个空格作间隔。空格由空白、制表符和换行符组成。
(3) 设计词法分析器的步骤:
①首先根据上面单词符号表及ID和NUM的正规定义式,构造出状态转换图;
②定义相关的变量和数据结构。关键字作为特殊标识符处理,把它们预先安排在
一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能
查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字
符串数组,其描述如下:
char *KEY_WORDS[8]={″main″,″int″,″char″,″if″,″else″,″for″,″while″};
用以存放单词符号二元式的数据结构可如下定义:
#define MAXLENGTH 255 /* 一行允许的字符个数 */
union WORDCONTENT { /* 存放单词符号的内容 */
char T1[MAXLENGTH]; /* 存放标识符 */
int T2; /* 存放整型常数的拼数 */
char T3; /* 存放其他符号 */
};
typedef struct WORD { /* 单词符号二元式 */
int code; /* 存放种别编码 */
union WORDCONTENT value;
} WORD;
③按照编译程序一遍扫描的要求,把词法分析器Scaner作为一个独立的子程序来
设计,通过对Scaner的反复调用识别出所有的单词符号;
④当Scaner识别出一个单词符号时,则将该单词符号的二元式写入到输出文件中。
若Scaner无法识别出一个单词符号时,则调用错误处理程序PrintError,显示
当前扫描到的字符及其所在行、列位置,并跳过该字符重新开始识别单词符号。
(4) 测试该设计词法分析器,可对下面的源程序进行词法分析:
main()
{
int i = 10;
while(i) i = i - 1;
}
输出如下二元式代码序列:
(1,main) (26,() (27,)) (30,{) (2,int) (10,i) (21,=) (20,10) (34,;) (7,while) (26,( ) (10,i) (27,)) (10,i) (21, =) (10,i) (23,-) (20,1) (34,;) (31,})