1、编译原理实验指导书前 言编译原理是计算机专业的主干课和必修课,由于这门课程相对抽象且内容较复杂,一直是比较难学的一门课程。在编译原理的学习过程中,实验非常重要,只有通过上机实验,才能使学生对比较抽象的课程内容产生一个具体的感性认识。本书实验环境主要为 C 环境,在 C 环境下手动生成词法分析器及语法分析器,通过这些实验,能使学生对这些部份的工作机理有一个详细的了解。由于这门课实验难度较大,所以希望在实验前学生要做好预习工作。在上机前写好实验预习报告。- i -目录实验一 手工生成 PL/0语言词法分析器 .1实验二 用算符优先分析法进行表达式分析 .5- 1 -实验一 手工生成 PL/0 语言
2、词法分析器实验名称:手工生成 PL/0 语言词法分析器实验目的:编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 (遇到错误时可显示“Error”,然后跳过错误部分继续显示)实验原理:词法分析过程1、PL/0 的词法分析程序 Getsym(图 1)是一个独立的过程,它把输入的字符串形式的源程序分割成一个个单词符号。为此 PL/0 编译程序设置了三个全程量的公用单元如下:Sym:存放每个单词的类别,用内部编码形式表示;Id:存放用户所定义的标识符的值,即标识符字符串的机内表示;Nu
3、m:存放用户定义的数。如果我们把基本字、运算符、界符称为语言固有的单词,而对标识符、常数称为用户定义的单词,那么经词法分析程序分出的单词,对固有的单词只给出类别存放在 sym 中,而对用户定义的单词(标识符或常数)既给出类别又给值,其类别存放在 sym 中,值放在id 或 num 中,全部单词种类由编译程序定义的纯量类型 sumbol 给出,也可称为语法的词汇表。如下面提到的 ifsym, thensym,ident,number 均属 symbol 中的元素。因此词法分析程序 Getsym 将完成下列任务:滤空格:空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用的,必须滤掉;(1
4、) 识别保留字:设有一张保留字表。对每个字母打头的字母、数字串要查此表。若查到则为保留字,将对应的类别放在 sym 中,如 IF 对应值 IFSYM,THEN 对应为 THENSYM。若查不到,则认为是用户定义的标识符;(2) 识别标识符:对用户定义的标识符将 IDENT 放在 SYM 中,标识符本身的值放在ID 中;(3) 拼数:当所取单词是数字时,将数的类别 NUMBER 放在 SYM 中,数值本身的值存放在 NUM 中;(4) 拼复合词:对两个字符组成的算符,如=,:=,、=、 - * / ( ; ,- 6 -,!,!,=; /算符优先矩阵,其中!表示两算符无优先关系int OPNDMA
5、X;/操作数栈SYMBOL OPTRMAX; /算符栈int topd,topr;/ 两栈的指针void PushOpnd (int a);int PopOpnd (void);int EmptyOpnd (void);int GetTopOpnd (void);void PushOptr (SYMBOL a);SYMBOL PopOptr (void);int EmptyOptr (void);SYMBOL GetTopOptr (void);/上面为栈函数int Position(SYMBOL c);/将 c 映射至数组下标int IsOpnd(SYMBOL c);/判断 c 是否是操作数
6、int IsOptr(SYMBOL c);/判断 c 是否是操作符char Precede(SYMBOL c1,SYMBOL c2);/查算符优先矩阵,求出 c1 和 c2 之间的优先矩阵int Operate(int a,int b,SYMBOL o);/求出 a o bchar First();/算符优先分析函数2部份函数实现的源代码(略 )实验成果:1.程序源代码(以报告形式提交 );2.已经测试通过的测试数据 3 组(全部存在一个文本文件中附在报告后面,以“第一组输入/ 输出/第二组输入/输出/第三组输入/输出” 的顺序存放) ;3.实验报告:(1)功能描述:该程序具有什么功能?(2)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图、程序总体执行流程图(参考课本第二章) 。(3)实验过程记录:出错次数、出错严重程度、解决办法摘要。(4)实验总结:你在编程过程中花时多少?多少时间在纸上设计?多少时间上机输入和调试?多少时间在思考问题?遇到了哪些难题?你是怎么克服的?你对你的程序的评价?- 7 -你的收获有哪些?