实验报告一编写词法分析程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验报告
实验名称:编写词法分析程序_______
实验类型:设计型实验
指导教师:
专业班级:
姓名:
学号:
实验地点:
实验成绩:
日期:2017年4月15日
实验一编写语法分析程序
一、实验目的
1)通过设计、调试词法分析程序,掌握词法分析程序的设计工具,即有穷自动机,进一步理解自动
机理论;
2)掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机的实现方法;
3)会确定词法分析程序的输出形式及标识符与关键字的区分方法;
4)加深对课堂教学的理解,提高词法分析方法的实践能力,掌握使用实验环境的技能技巧以及程序
的调试方法。
二、实验设计
1、写出TEST语言每条词法规则对应的正则文法或者正则表达式
1)标识符:字母打头,后接任意字母或数字。
正则表达式:
( a|b|……|z|A|B……|Z )( 0|1|……|9| a|b|……|z|A|B……|Z )*
2)保留字:标符的子集,包括:if, else, for, while, do, int, write, read。
正则表达式:if | else | for | while | do | int | write | read
3)无符号整数:由数字组成,但最高位不能为0,允许一位的0。
正则表达式:( (1……|9 )( 0|1|……|9)* )|0
4)分界符:(、)、;、{、}
正则表达式:( | ) | ; | { | }
5)运算符:+、-、*、/、=、<、>、>=、<=、!=、==
正则表达式:+ | - | * | / | = | < | > | >= | <= | != | ==
6)注释符:/* */
正则表达式:/*(没有连续的*/的任意字符串|ℇ)*/
2、对每个文法或者正则表达式分别构造NFA
1)标识符:( a|b|……|z|A|B……|Z )( 0|1|……|9| a|b|……|z|A|B……|Z )*
|9)* )|0
2)无符号整数:( (1|2|……|9 )( 0|1|……
3)分界符:( | ) | ; | { | }
4)运算符:
非*
3、将NFA合并,确定化,化简得到最终的DFA。NFA:
DFA:
三、实验过程
1、完成整个实验的先后步骤
a)根据TEST语言的词法规则,分别写出每条规则的正则文法或者正则表达式;
b)将每一个正则文法或者正则表达式转换为NFA;
c)将多个NFA合并后进行确定化并化简;
d)根据化简后的DFA画出流程图;
e)参阅教材PP.69-71的TEST语言语法规则,确定单词分类、单词输出方案;
f)编写词法分析程序;
g)对下面的TEST语言源程序进行词法分析,将合法单词存入lex.txt,并报告词法错误及其位
置。注:不能修改源程序
{
/*This a test program.*/
int abc;
int 123;
int A$@;
int i;
int n;
int b,c;
int 2a;
int a2;
read n;
n = 012345;
for (i=1;i<=n; i= i+1)
{
abc=abc+i;
}
if(i!=n) n = n+i;
if (!n) b = b+c;
/*The loop ended
write abc;
}
2、实验调试记录(问题表现,分析原因,解决方案,解决结果)
a)问题表现:
1.不能处理除号
2.不能处理不完整的注释符
3.对于”0123”这类字符串的处理不正确,我之前处理为直接报错说一位以上的数字首位不能为0
b)分析原因:
问题1,2的原因都是在“/”符号处理时出现的问题导致的,程序中出现bug使得一遇到‘/’就会进入死循环。
问题3 ,不应该直接报错说一位以上的数字首位不能为0,遇到0应该直接输出0这个单词,再接着读数字。
c)解决方案:
d)对于问题1,2,重新梳理逻辑,一步一步对照流程图和DFA来调试修改代码。
对于问题3,遇到0应该直接输出0这个单词,再接着读数字。
e)解决结果:
成功解决了程序遇到‘/’进入死循环问题和“0123”这类字符串的处理。
三、实验结果
列出实验结果并进行分析(含分步测试结果)。
lex.txt文件(存放编译的合法容)容:
1 { {
2 /*This a test program.*/ /*This a test program.*/
3 int int
3 ID abc
3 ; ;
4 int int
4 NUM 123
4 ; ;
5 int int
5 ID A
5 ; ;
6 int int
6 ID i
6 ; ;
7 int int
7 ID n
7 ; ;
8 ID b
8 ID c
8 ; ;
9 int int
9 NUM 2
9 ID a
9 ; ;
10 int int
10 ID a2
10 ; ;
11 read read 11 ID n
11 ; ;
12 ID n
12 = =
12 NUM 0
12 NUM 12345
12 ; ;
13 for for
13 ( (
13 ID i