编译原理词法分析程序实验报告解析
编译原理实验报告
实验名称:编写词法分析程序
实验类型:设计性实验
指导教师:*****
专业班级:软件工程1401
姓 名:****
学 号:**********
实验地点:东六E座301
实验成绩:_________________
日期: 2016 年 5 月 8 日
实验一
编写词法分析程序
一、实验目的
通过设计、调试词法分析程序,掌握词法分析程序的设计工具(有穷自动机),进一步理解自动机理论
掌握正则文法和正则表达式转换成有穷自动机的方法及有穷自动机实现的方法
确定词法分析程序的输出形式及标识符与关键字的区分方法
加深对理论知识的理解
二、实验设计
设计原理:
对源程序代码从头到尾扫描,将符合词法语言规则的单词输出,包括:标识符、保留字、无符号整数、分界符、运算符、注释分离;判断程序的词法是否正确
TEST语言的词法规则如下:
1)、标识符:字母打头,后接任意字母或数字。
2)、保留字:标识符的子集,包括:if,else,for,while,do, int,write,read。
3)、无符号整数:由数字组成,但最高位不能为0,允许一位的0。
4)、分界符:(、)、;、{、}
5)、运算符:+、-、*、/、=、、>=、<=、!=、==
6)、注释符:/* */
设计方法:
用正则表达式或正则文法描述程序设计语言的词法规则,通常采用正则表达式;一个正则表达式对应一条词法规则
为每个正则表达式构造一个NFA,用来识别正则表达式描述的单词将每一个NFA合并、化简得到最简的DFA
将多个NFA合并为一个NFA
将NFA转换成等价的DFA。
最小化DFA
确定单词的输出形式。
化简后的DFA+单词输出形式?构造词法分析程序
设计过程:
将TEST语言的六个语法规则分别转换成正则表达式
为每个正则表达式构造一个NFA,用来识别正则表达式描述的单词
将5个NFA转换成一个NFA,再将NFA化简确定化。
设计结果:
每一条TEST语言对应的正则表达式如下:
标识符:( a|b|……|z|A|B……|Z )( 0|1|……|9| a|b|……|z|A|B……|Z )*
保留字:标识符的子集
无符号整数: ( (1……|9 )( 0|1|……|9)* )|0
分界符:( | ) | ; | { | }
运算符:+ | - | * | / | = | < | > | >= | <= | != | ==
注释符:/*(其他)*/
NFA如图
化简、确定化的DFA
三、实验过程
将TEST语言的六个语法规则转换成正则表达式
将每个正则表达式装换成NFA,再将NFA合并化简
最终得到设计结果如上所示:
根据确定化的DFA编写代码
测试实验数据
三、实验结果
测试数据:
{
/*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;
}
实验现象:
控制台显示的数据:
输出文本的数据:
{{
intint
IDabc
;;
intint
NUM123
;;
intint
IDA
Error$
Error@
;;
intint
IDi
;;
intint
IDn
;;
intint
IDb
Error,
IDc
;;
intint
NUM2
IDa
;;
intint
IDa2
;;
readread
IDn
;;
IDn
==
NUM0
NUM12345
;;
forfor
((
IDi
==
NUM1
;;
IDi
<=<=
IDn
;;
IDi
==
IDi
++
NUM1
))
{{
IDabc
==
IDabc
++
IDi
;;
}}
ifif
((
IDi
!=!=
IDn
))
IDn
==
IDn
++
IDi
;;
ifif
((
Error!
IDn
))
IDb
==
IDb
++
IDc
;;
数据分析:
根据TEST语法规则,我们可以知道
int A$@;这一句