编译原理DFA化简实验报告C语言,编译原理词法分析程序实验报告解析.doc

编译原理词法分析程序实验报告解析

编译原理实验报告

实验名称:编写词法分析程序

实验类型:设计性实验

指导教师:*****

专业班级:软件工程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$@;这一句

1. 实验内容 每一个正规集都可以由一个状态数最少的DFA所识别,这个DFA是唯一的(不考虑同构的情况)。任意给定的一个DFA,根据以下算法设计一个C程序,将该DFA 化简为与之等价的最简DFA。 2. 实验设计分析 2.1 实验设计思路 根据实验指导书和书本上的相关知识,实现算法。 2.2 实验算法 (1)构造具有两个组的状态集合的初始划分I:接受状态组 F 和非接受状态组 Non-F。 (2)对I采用下面所述的过程来构造新的划分I-new. For I 中每个组G do Begin 当且仅当对任意输入符号a,状态s和读入a后转换到I的同一组中; /*最坏情况下,一个状态就可能成为一个组*/ 用所有新形成的小组集代替I-new中的G; end (3)如果I-new=I,令I-final=I,再执行第(4)步,否则令I=I=new,重复步骤(2)。 (4)在划分I-final的每个状态组中选一个状态作为该组的代表。这些代表构成了化简后的DFA M'状态。令s是一个代表状态,而且假设:在DFA M中,输入为a时有从s到t转换。令t所在组的代表是r,那么在M’中有一个从s到r的转换,标记为a。令包含s0的状态组的代表是M’的开始状态,并令M’的接受状态是那些属于F的状态所在组的代表。注意,I-final的每个组或者仅含F中的状态,或者不含F中的状态。 (5)如果M’含有死状态(即一个对所有输入符号都有刀自身的转换的非接受状态d),则从M’中去掉它;删除从开始状态不可到达的状态;取消从任何其他状态到死状态的转换。 。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值