编译原理报告(2) 本文关键词:编译,原理,报告
编译原理报告(2) 本文简介:课程实验概述1实验一词法分析器程序的实现21.1问题描述21.1.1实验内容21.1.2实验原理21.2程序设计31.2.1实验要求31.2.2实验流程图51.3实验结果6实验二语法分析程序实现72.1实验目的与要求72.2实验内容72.3实验要求72.4程序设计82.4.1算法任务82.4.2全局
编译原理报告(2) 本文内容:
课程实验概述1
实验一
词法分析器程序的实现2
1.1
问题描述2
1.1.1
实验内容2
1.1.2实验原理2
1.2
程序设计3
1.2.1
实验要求3
1.2.2实验流程图5
1.3实验结果6
实验二
语法分析程序实现7
2.1
实验目的与要求7
2.2
实验内容7
2.3
实验要求7
2.4
程序设计8
2.4.1算法任务8
2.4.2全局变量的设置8
2.4.3主程序main算法流程图8
2.4.4扫描子程序scanner()的算法流程图9
2.4.5
rparser()的算法流程图10
2.4.6
语句串分析程序yucu()的算法流程图10
2.4.7
statement语句分析算法流程图11
2.5
实验结果12
实验总结14
课
程
实
验
报
告
课程名称:
《编译原理》
专业班级:
学
号:
姓
名:
指导教师:
报告日期:
2015.11.12
计算机科学与技术学院
课程实验概述
词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列,每个词法单元对应一个词素。这个词法单元序列被输出到语法分析器进行语法分析。
词法分析器的功能输入源程序,按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等
(1)
关键字
是由程序语言定义的具有固定意义的标识符。例如,Pascal
中的begin,end,if,while都是保留字。这些字通常不用作一般标识符。
(2)
标识符
用来表示各种名字,如变量名,数组名,过程名等等。
(3)
常数
常数的类型一般有整型、实型、布尔型、文字型等。
(4)
运算符
如+、-、*、/等等。
(5)
界符
如逗号、分号、括号、等等。
词法分析器所输出单词符号常常表示成如下的二元式:
(单词种别,单词符号的属性值)
单词种别通常用整数编码。标识符一般统归为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种。运算符可采用一符一种的方法。界符一般用一符一种的方法。对于每个单词符号,除了给出了种别编码之外,还应给出有关单词符号的属性信息。单词符号的属性是指单词符号的特性或特征。
实验一
词法分析器程序的实现
1.1
问题描述
1.1.1
实验内容
1.完成词法分析器实现的功能如下:
(1)组织源程序的输入
(2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件
(3)删除注释、空格和无用符号
(4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。
(5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。
标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址
注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。
常量表结构:常量名,常量值
2.能对任何S语言源程序进行分析
在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。
1.1.2实验原理
词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。
1.2
程序设计
1.2.1
实验要求
(1)单词的分类:构造上述语言中的各类单词符号及其分类码表。
表I
语言中的各类单词符号及其分类码表
单词符号
类别编码
类别码的助记符
单词值
begin
1
BEGIN
end
2
END
if
3
IF
then
4
THEN
else
5
ELSE
标识符
6
ID
字母打头的字母数字串
整常数
7
INT
数字串
11
NE
>
12
GT
>=
13
GE
:=
14
IS
+
15
PL
-
16
MI
17
MU
/
18
DI
(2)实验的状态转换图如图2-1:
图2-1:实验状态转换图
1.2.2实验流程图
(3)
系统流程图如下图2-3所示:
开始
输入需要扫描的文件名
输入存放结果文件名
P处
跳转扫描其他符号
文件是否为空
Y
返回,退出
ch是否为引号
N
预读一位ch
跳转扫描引号
NY
行数加1
ch是否为空格
Y
N
ch是否为‘/’
跳转扫描注释
Y
ch是否为字母或下划线
N
Y
ch是否为数字或‘—’
N
跳转扫描数字
Y
跳转扫面文件单词及保留字
N
图2-2:系统流程图
1.3实验结果
测试结果如图2-3所示
图
2-3
实验结果与书中的单词表一致,结果正确。
实验二
语法分析程序实现
2.1
实验目的与要求
通过设计、编制、调试一个典型的语法分析程序(任选有代表性的语法分析方法,如算符优先法、递归下降法、LL(1)、SLR(1)、LR(1)等,作为编制语法分析程序的依据),对扫描器所提供的单词序列进行语法检查和结构分析,实现并进一步掌握常用的语法分析方法。
2.2
实验内容
选择对各种常见高级程序设计语言都较为通用的语法结构作为分析对象,给出其文法描述(注意应与所采用的语法分析方法比较贴近),设计并实现一个完整的语法分析程序。
输入:源程序以文件的形式输入。
输出:对于所输入的源程序,如果输入符号串是给定文法定义的合法句子,则输出“RIGHT”,并且给出每一步归约的过程;如果不是句子,即输入串有错误,则输出“ERROR”,并且显示已经归约出的各个文法符号。
2.3
实验要求
以如下文法G1所定义的算术表达式的赋值语句作为分析对象,编写并调试一个语法分析程序。
G1[]:
→
:=
→
|
+
|
-
→
|
|
/
→
|
|
()
→
→
|
|
→
|
→
|
→
?
|
?
→
A|B|C|…|X|Y|Z|a|b|c|…|x|y|z
→
0|1|2|…9
2.4
程序设计
2.4.1算法任务
算法的基本任务是从字符串中表示的源程序中识别出具有独立意义的单词符号,并通过其基本文法,正确规约到开始符号。
2.4.2全局变量的设置
在此程序中,需要设置两个个全局变量:
关键字表retab[6]、当前识别的种别号syn。
其中retab中元素为
“begin”
“if”
“then”
“while”
“do”
“end”,在程序会扫描出标识符时,首先查关键字表。如果能找到匹配的单词,则该单词为关键字,否则为一般标识符。
syn用于每一步扫描中scanner
的返回值。在整个语法分析程序中均需要使用该全局变量。
2.4.3主程序main算法流程图
开始
读取字符串到inputString
int
i
=0;输入字符串长度inputLength
Scanner()
syn
==
-1
Y
N
lrparser()
结束
Y
N
2.4.4扫描子程序scanner()的算法流程图
调用
ch
=当前第一个字符
字母
当前字符串
数字
运算符/界符
syn=种别号
当前数字
syn=相应的种别号
是否关键字
其他符号
错误
N
syn=11
Y
返回
2.4.5
rparser()的算法流程图
调用
syn
=
1
N
Y
scanner()
yucu()
syn
==
6
N
Y
scanner()
syn
==
0
N
Y
成功,打印“success”
出错处理
2.4.6
语句串分析程序yucu()的算法流程图
调用
statement()
syn
==26(;)
N
scanner()
Y
出错处理
2.4.7
statement语句分析算法流程图
调用
syn
==26(;)
scanner()
syn
==18(:=)
否
scanner()
是
expression()
出错处理
2.5
实验结果
输入正确,得到图:
输入错误,得到图:
实验结果正确。
实验总结
通过编译原理的两次上机实验,我收获颇多。
上机实验前为了更好地完成实验,我复习了下词法语法这部分的知识。这加深了我对词法语法这部分的理解。
这两次上机实验由于书后有伪代码,所以说写起来不算太难。虽说如此,写好的程序还是有种种错误。纸上得来终觉浅,绝知此事要躬行,通过两次实验,我感觉我的编程熟练度得到了增强。
实验过程中也遇到过一些疑难问题,通过和同学的交流我最终解决了了这些问题。有时候一个人的力量毕竟太小,融合多人的智慧才能解决更难的问题。
最后感谢下帮助过我的同学和老师。
14