编译原理实验指导书.docx
- 文档编号:28895992
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:10
- 大小:249.74KB
编译原理实验指导书.docx
《编译原理实验指导书.docx》由会员分享,可在线阅读,更多相关《编译原理实验指导书.docx(10页珍藏版)》请在冰豆网上搜索。
编译原理实验指导书
编译原理实验指导书
前言
编译原理是计算机专业的主干课和必修课,由于这门课程相对抽象且内容较复杂,一直是比较难学的一门课程。
在编译原理的学习过程中,实验非常重要,只有通过上机实验,才能使学生对比较抽象的课程内容产生一个具体的感性认识。
本书实验环境
主要为C环境,在C环境下手动生成词法分析器及语法分析器,通过这些实验,能使学生对这些部份的工作机理有一个详细的了解。
由于这门课实验难度较大,所以希望在实验前学生要做好预习工作。
在上机前写好实验预习报告。
实验一手工生成PL/0语言词法分析器
实验名称:
手工生成PL/0语言词法分析器
实验目的:
编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
(遇到错误时可显示“Error”,然后跳过错误部分继续显示)
实验原理:
词法分析过程
1、PL/0的词法分析程序Getsym(图1)是一个独立的过程,它把输入的字符串形式的源程序分割成一个个单词符号。
为此PL/0编译程序设置了三个全程量的公用单元如下:
Sym:
存放每个单词的类别,用内部编码形式表示;
Id:
存放用户所定义的标识符的值,即标识符字符串的机内表示;
Num:
存放用户定义的数。
如果我们把基本字、运算符、界符称为语言固有的单词,而对标识符、常数称为用户定义的单词,那么经词法分析程序分出的单词,对固有的单词只给出类别存放在sym中,而对用户定义的单词(标识符或常数)既给出类别又给值,其类别存放在sym中,值放在id或num中,全部单词种类由编译程序定义的纯量类型sumbol给出,也可称为语法的词汇表。
如下面提到的ifsym,thensym,ident,number均属symbol中的元素。
因此词法分析程序Getsym将完成下列任务:
滤空格:
空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用的,必须滤掉;
(1)识别保留字:
设有一张保留字表。
对每个字母打头的字母、数字串要查此表。
若查到则为保留字,将对应的类别放在sym中,如IF对应值IFSYM,THEN对应为THENSYM。
若查不到,则认为是用户定义的标识符;
(2)识别标识符:
对用户定义的标识符将IDENT放在SYM中,标识符本身的值放在ID中;
(3)拼数:
当所取单词是数字时,将数的类别NUMBER放在SYM中,数值本身的值存放在NUM中;
(4)拼复合词:
对两个字符组成的算符,如>=,:
=,<=等单词,识别后将类别送SYM中;
(5)输出源程序:
边读入字符边输出(可输出在文件中)。
由于一个单词往往是由一个或几个字符组成的,所以在词法分析过程Getsym中又定义了一个取字符过程GETCH(见图2),由词法分析需要取字符时调用。
2、GETCH所用单元说明:
CH:
存放当前读取的字符,初值为空;
LINE:
为一维数组,其数组元素是字符,界对为1:
80。
用于读入一行字符的缓冲区。
LL和CC为计数器,初值为0;
GETSYM流程图的工作单元说明:
A:
一维数组,数组元素为字符,界对1:
10;
ID:
同A;
WORD:
保留字表,一维数组,数组元素为以字符为元素的一维数组,界对为1:
13,查找方式采用二分法。
图2取字符过程GETCH
实验步骤:
(一)准备:
1.阅读课本有关章节,花一周时间明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。
2.初步编制好程序。
3.准备好多组测试数据。
(2,”main”)
(5,”(“)
(5,”)“)
(5,”{“)
(1,”int”)
(2,”a”)
(5,”,”)
(2,”b”)
(5,”;”)
(2,”a”)
(4,”=”)
(3,”10”)
(5,”;”)
(2,”b”)
(4,”=”)
(2,”a”)
(4,”+”)
(3,”20”)
(5,”;”)
(5,”}“)
(二)上课上机:
将源代码拷贝到机上调试,发现错误,再修改完善。
第二次上机调试通过。
(三)程序要求:
程序输入/输出示例:
如源程序为C语言。
输入如下一段:
main()
{
inta,b;
a=10;
b=a+20;
}
要求输出如右图。
要求:
识别保留字:
if、int、for、while、do、return、break、continue
其他的都识别为标识符;
常数为无符号整形数;
运算符包括:
+、-、*、/、=、>、<、>=、<=、!
=
分隔符包括:
、;、{、}、(、)
估计实验时间:
1.课余准备15小时;2.上机二次4小时;3.完成实验报告5小时。
以上为参考,具体可自行增删。
实验成果:
1.程序源代码(以报告形式提交);
2.已经测试通过的测试数据3组(全部存在一个文本文件中附在报告后面,以“第一组输入/输出/第二组输入/输出/第三组输入/输出”的顺序存放);
3.实验报告:
(1)功能描述:
该程序具有什么功能?
(2)程序结构描述:
函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图、程序总体执行流程图(参考课本第二章)。
(3)实验过程记录:
出错次数、出错严重程度、解决办法摘要。
(4)实验总结:
你在编程过程中花时多少?
多少时间在纸上设计?
多少时间上机输入和调试?
多少时间在思考问题?
遇到了哪些难题?
你是怎么克服的?
你对你的程序的评价?
你的收获有哪些?
实验二用算符优先分析法进行表达式分析
实验名称:
用算符优先法进行表达式分析
实验目的
了解用算符优先分析法进行语法分析的方法。
实验要求
从键盘输入表达式,利用算符优先分析法求出其值,如输入表达式有错,则给出报错提示。
表达式以;结尾。
例:
以于如下的输入表达式串:
13+5*4;则应给出结果为33。
实验原理
我们要分析的表达式满足下面的算符优先矩阵
θ2
θ1
+
-
*
/
(
)
;
+
>
>
<
<
<
>
>
-
>
>
<
<
<
>
>
*
>
>
>
>
<
>
>
/
>
>
>
>
<
>
>
(
<
<
<
<
<
=
)
>
>
>
>
>
>
;
<
<
<
<
<
=
实验步骤
为实现算符优先算法,可以使用两个工作栈。
一个叫做OPTR,用以寄存运算符,一个叫OPND,用以寄存操作数或结果。
算法描述如下:
[1]首先置操作数栈为空栈,将表达式起始符;作为运算符栈的栈底元素。
[2]依次读入表达式中每个单词,若是操作数则进OPND栈,若是运算符则转[3]。
[3]将此运算符θ1与OPTR栈顶元素θ2进行比较,即查上表,若θ1>θ2,则:
θ1进栈,转[2]。
若θ1=θ2,如θ1为;,则分析成功,否则OPTR栈顶元素出栈,并转[2]。
若θ1<θ2,则出栈OPND栈顶元素至b,又出栈其栈顶元素至a,出栈OPTR栈顶元素至t,进行运算r=atb(t为运算符),并将结果r存入栈OPND后转[3]。
若θ1和θ2之间无优先关系,则报错。
源程序提示
利用以前实验生成的Getsym()进行单词识别,并自组织工程文件,关于算符优先算法要用到的部份函数提示如下。
[1]一些自定义的变量和函数的声明
#defineMAX255
SYMBOLtitle[7]={PLUS,MINUS,TIMES,SLASH,LPAREN,RPAREN,SEMICOLON};
//用来将相应的种别码与数组下标进行映射
charoo[7][7]={{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','!
'},
{'>','>','>','>','!
','>','>'},
{'<','<','<','<','<','!
','='}
};//算符优先矩阵,其中’!
’表示两算符无优先关系
intOPND[MAX];//操作数栈
SYMBOLOPTR[MAX];//算符栈
inttopd,topr;//两栈的指针
voidPushOpnd(inta);
intPopOpnd(void);
intEmptyOpnd(void);
intGetTopOpnd(void);
voidPushOptr(SYMBOLa);
SYMBOLPopOptr(void);
intEmptyOptr(void);
SYMBOLGetTopOptr(void);
//上面为栈函数
intPosition(SYMBOLc);
//将c映射至数组下标
intIsOpnd(SYMBOLc);
//判断c是否是操作数
intIsOptr(SYMBOLc);
//判断c是否是操作符
charPrecede(SYMBOLc1,SYMBOLc2);
//查算符优先矩阵,求出c1和c2之间的优先矩阵
intOperate(inta,intb,SYMBOLo);
//求出aob
charFirst();
//算符优先分析函数
[2]部份函数实现的源代码(略)
实验成果:
1.程序源代码(以报告形式提交);
2.已经测试通过的测试数据3组(全部存在一个文本文件中附在报告后面,以“第一组输入/输出/第二组输入/输出/第三组输入/输出”的顺序存放);
3.实验报告:
(1)功能描述:
该程序具有什么功能?
(2)程序结构描述:
函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图、程序总体执行流程图(参考课本第二章)。
(3)实验过程记录:
出错次数、出错严重程度、解决办法摘要。
(4)实验总结:
你在编程过程中花时多少?
多少时间在纸上设计?
多少时间上机输入和调试?
多少时间在思考问题?
遇到了哪些难题?
你是怎么克服的?
你对你的程序的评价?
你的收获有哪些?
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 指导书