《编译原理》实验指导书.docx
《《编译原理》实验指导书.docx》由会员分享,可在线阅读,更多相关《《编译原理》实验指导书.docx(13页珍藏版)》请在冰豆网上搜索。
《编译原理》实验指导书
《编译原理》实验指导书
课程编码:
141402课程类别:
学科专业课
适用专业:
计算机科学与技术专业主要教学内容:
词法分析与语法分析
课程总学时:
64实验学时:
8
【实验目标要求】
《编译原理》课程是计算机专业的核心课程,是培养计算机技术高级人才的必修课程。
该课程通过程序设计语言和语言处理软件的理论与技术的教学,培养学生利用计算机语言处理技术进行系统分析和软件设计的能力。
<<编译原理>>是理论与实践并重的课程,这门实验课要综合运用一、二、三年级所学的多门课程的内容。
实验目标与要求;
1.学会用高级程序设计语言设计词法分析器。
2.学会用高级程序设计语言设计语法分析器。
【实验学习要求】
认真阅读《编译原理》教材中的与实验相关的章节内容,做到在每个实验前明确实验目的、掌握实验的内容,提前完成数据结构定义和算法设计;在实验中正确使用实验设备,认真设计与调试程序并分析实验结果;实验后要根据要求做好总结,上交实验报告。
【实验环境】
Windows操作系统,编程语言是C、C++集成调试环境采用TC或MicrosoftVisualStudio6。
【实验计划】
序
号
实验项目
名称
实验内容
学时
要求
性质
类别
所用主要仪
器及台套数
所在实验室
1
用C或者C++语言设计一个词法分析器
1. 确定编译中使用的表格、词法分析器的输出形式、标识符与关键字的区分方法。
2. 把词法分析器设计成一个独立的过程。
4
必做
设计
综合型
微机,每人一台。
计算机学院实验中心
2
用C或者C++语言设计一个语法分析器。
1. 词法分析和语法分析在一起实现。
2.把语法分析器设计成一个独的过程。
4
必做
设计
综合型
微机,每人一台。
计算机学院实验中心
【考核办法】
在机器上交作业,由实习教师给出优、良、中、及格、不及格。
【实验教材及主要参考资料】
教材:
《编译原理》,蒋立源等编著,西北工业大学出版社。
参考资料:
《编译原理实验》由清华大学编写。
实验一、词法分析器的设计
1.实验目的:
1.掌握词法分析的原理;
2.熟悉符号表的建立与单词的分类方法;
3.掌握词法分析器的设计与调试;
2.实验内容:
1.分析如表1所定义的PASCAL语言子集的语法,找出所有单词的组成及类别;
2.完成单词的分类及其编码;
3.完成保留字表、变量名表和常数表的结构设计;
4.建立识别单词符号集合的DFA;
5.由DFA设计词法分析程序;
6.调试并运行词法分析程序;
表1.PASCAL语言子集的语法定义
〈程序〉→〈变量说明〉BEGIN〈语句表〉END.
〈变量说明〉→VAR〈变量表〉:
〈类型〉;|〈空〉
〈变量表〉→〈变量表〉,〈变量〉|〈变量〉
〈类型〉→INTEGER
〈语句表〉→〈语句表〉;〈语句〉|〈语句〉
〈语句〉→〈赋值语句〉|〈条件语句〉|〈WHILE语句〉|〈复合语句〉|〈过程定义〉
〈赋值语句〉→〈变量〉∶=〈算术表达式〉
〈条件语句〉→IF〈关系表达式〉THEN〈语句〉ELSE〈语句〉
〈WHILE语句〉→WHILE〈关系表达式〉DO〈语句〉
〈复合语句〉→BEGIN〈语句表〉END
〈过程定义〉→PROCEDURE〈标识符〉〈参数表〉;BEGIN〈语句表〉END
〈参数表〉→(〈标识符表〉)|〈空〉
〈标识符表〉→〈标识符表〉,〈标识符〉|〈标识符〉
〈算术表达式〉→〈算术表达式〉+〈项〉|〈项〉
〈项〉→〈项〉*〈初等量〉|〈初等量〉
〈初等量〉→(〈算术表达式〉)|〈变量〉|〈无符号数〉
〈关系表达式〉→〈算术表达式〉〈关系符〉〈算术表达式〉
〈变量〉→〈标识符〉
〈标识符〉→〈标识符〉〈字母〉|〈标识符〉〈数学〉|〈字母〉
〈无符号数〉→〈无符号数〉〈数字〉|〈数字〉
〈关系符〉→=|<|<=|>|>=|<>
〈字母〉→A|B|C|…|X|Y|Z
〈数字〉→0|1|2|…|8|9
〈空〉→
提示:
(1)单词的分类。
可将所有标识符归为一类;将常数归为另一类;保留字和分隔符则可采取一词一类。
(2)符号表的建立。
可事先建立一保留字表,以备在识别保留字时进行查询。
变量名表及常数表则在词法分析过程中建立。
(3)单词串的输出形式。
所输出的每一单词,均按形如(CLASS,VALUE)的二元式编码。
对于变量标识符和常数,CLASS字段为相应的类别码,VALUE字段则是该标识符、常数在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串,其最大长度为四个字符;常数表登记项中则存放该整数的二进制形式)。
对于保留字和分隔号,由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。
不过,为便于查看由词法分析程序所输出的单词串,也可以在CLASS字段上直接放置单词符号串本身。
3.测试用输入
测试用输入程序为。
Procedureprogram1(a,b);
Begin
Varxyz=50;
Whilea>bdo
begin
Ifxyz=0then
xyz=50;
xyz:
=xyz-a;
a:
=a-1;
end
End
4.实验扩充:
构造语言的词法分析程序,要求识别出变量类型并记录相关信息。
5.实验说明:
实验环境:
WINDOWS下,工具为TurboC2.0或VisualC6.0。
6.实验考核方式:
1.提交实验报告
2.演示程序和答辩(抽查)
7.实验辅导
(1)词法分析程序的功能
词法分析程序又称为扫描器,其功能在于依次扫视字符串形式源程序中的各个字符,逐个识别出其中的单词,并将其转换为内部编码形式的单词符号串作确为输出。
通常,可采用二元式
(class,value)
来表示一个单词符号的内部编码,其中:
class为一整数码,用于表示该单词的类别;value则是该单词之值(如变量名在符号表中序号,常数的二进制表示,以及运算符和分隔符的编码等等)。
概括地说,扫描器在其工作过程中,一般应完成下列的任务:
(1)识别出源程序中的各个单词符号,并将其转换为内部编码形式;
(2)删除无用的空白字符、回车字符以及其它非实质性字符;
(3)删除注释;
(4)进行词法检查,报告所发现的错误。
此外,视编译工作流程的组织,一些编译程序在进行词法分析时,还要完成将所识别出的标识符登录到符号表的工作。
(2)实例分析
对于表2所列的各类单词符号,词法分析程序可按图1所示的状态转换图来构造。
表2一个语言的单词符号及分类码表
图1识别表2所列语言单词的DFA及相关的语义过程
相关变量和子程序说明如下:
◆函数GETCHAR每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。
◆字符数组TOKEN用来依次存放一个单词词文中的各个字符。
◆函数CAT每调用一次,就把当前ch中的字符拼接于TOKEN中所存字符串的右边。
◆函数LOOKUP每调用一次,就以TOKEN中的字符串查保留字表,若查到,就将相应关键字的类别码赋给整型变量c;否则将c置为零。
◆函数RETRACT每调用一次,就把扫描指示器回退一个字符位置(即退回多读的那个字符)。
◆函数OUT一般仅在进入终态时调用此函数,调用的形式为OUT(c,VAL)。
其中,实参c为相应单词的类别码或其助记符;当所识别的单词为标识符和整数时,实参VAL为TOKEN(即词文分别为字母数字串和数字串),对于其余种类的单词,VAL均为空串。
函数OUT的功能是,在送出一个单词的内部表示之后,返回到调用该词法分析程序的那个程序。
实验二、语法分析器的设计
1.实验目的:
1.掌握利用预测分析法进行语法分析的原理;
2.熟悉文法的机内表示;
3.掌握语法分析器的设计与调试;
2.实验内容:
1.分析如下表3所定义PASCAL语言子集的语法,改写文法使其成为LL
(1)文法;
2.构造文法的预测分析表;
3.设计堆栈和预测分析表的机内表示;
4.设计并书写语法分析程序;
5.调试并运行语法分析程序;
表3.PASCAL语言子集的语法定义
〈程序〉→PROGRAM〈标识符〉;〈分程序〉
〈分程序〉→〈变量说明〉BEGIN〈语句表〉END
〈变量说明〉→VAR〈变量说明表〉;
〈变量说明表〉→〈变量表〉:
〈类型〉|〈变量表〉:
〈类型〉;〈变量说明表〉
〈类型〉→INTEGER|REAL
〈变量表〉→〈变量〉|〈变量〉,〈变量表〉
〈语句表〉→〈语句〉|〈语句〉;〈语句表〉
〈语句〉→〈赋值语句〉|〈条件语句〉|〈WHILE语句〉|〈复合语句〉
〈赋值语句〉→〈变量〉∶=〈算术表达式〉
〈条件语句〉→IF〈关系表达式〉THEN〈语句〉ELSE〈语句〉
〈WHILE语句〉→WHILE〈关系表达式〉DO〈语句〉
〈复合语句〉→BEGIN〈语句表〉END
〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉
〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉
〈因式〉→〈变量〉|〈常数〉|(〈算术表达式〉)
〈关系表达式〉→〈算术表达式〉〈关系符〉〈算术表达式〉
〈变量〉→〈标识符〉
〈标识符〉→〈标识符〉〈字母〉|〈标识符〉〈数字〉|〈字母〉
〈常数〉→〈整数〉|〈浮点数〉
〈整数〉→〈数字〉|〈数字〉〈整数〉
〈浮点数〉→·〈整数〉|〈整数〉·〈整数〉
〈关系符〉→<|<=|=|>|>=|<>
〈字母〉→A|B|C|…|X|Y|Z
〈数字〉→0|1|2|…|9
提示:
对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造所给文法的机内表示。
3.实验说明:
实验环境:
WINDOWS下,工具为TurboC2.0或VisualC6.0。
4.实验考核方式:
(1)提交实验报告
(2)演示程序和答辩(抽查)
5.实验辅导
(1)文法的机内表示形式
举例说明文法的的机内表示。
对于如下文法,其计算机内部的表示可采用如图2所示的数据结构。
椭圆表示指针变量,矩形表示结构体类型变量。
E->EAT|T
T->TMF|F
F->(E)|I
A->+|-
M->*|/
图2.文法的机内表示形式
(2)预测分析器的工作流程
分析器对每个输入串的分析在控制程序的控制下进行,其大致步骤如下:
第一步初始化。
分析开始时,首先将栈底符号#及文法的开始符号S推入分析栈,并对各指示器置初值。
然后反复执行第二步所列的操作。
第二步设在分析的某一时刻,可视分析栈顶的文法符号Xm的不同情况,分别作如下的处理:
◆若Xm∈VT∪{#},且Xm=ai,则表明栈顶符号已与当前正扫视的输入符号(请注意,包括句尾标志符号#在内)相匹配,此时应将Xm从栈中退出,并将输入串指示器向前推进一个位置,否则(即Xm≠ai)进行语法错误处理;
◆若Xm∈VN,则以符号对(Xm,ai)查分析表,设表元素A[Xm,ai]为产生式Xm→Y1Y2…Yk,则将Xm从栈中退出,并将Y1Y2…Yk按反序推入栈中(即用该产生式推导一步)。
但若A[Xm,ai]为“出错”,则进行语法错误处理;
◆若Xm=ai=#(即分析栈将被拆空),则表明输入串已完全得到匹配,此时可宣告分析成功而结束工作。