形式语言与自动机|DFA识别句子

实验二 DFA识别句子

1、实验目的

加深对DFA工做原理的理解。

java

2、实验内容

  • 1.设计固定DFA。也就是说用if-then-else(通常用来实现字母表中只有两个字母的状况)、switch(大于两个字母的状况)、for(用于控制输入字符串,长度为n的字符串,for循环n次)等语句表示DFA。一个函数定义一个DFA;
  • 2.设计文件形式存储DFA。设计文件格式,DFA动态生成,使用字符串来验证DFA的有效性和正确性;(使用面向对象的方法。对于k个状态的DFA,生成相应的k个状态对象;状态转换应经过对象间的消息传递来实现)
  • 3.图形化表示。用java或者VC中图形功能实现图形化的dfa。(选做)

前置知识1:DFA

什么是FA,也叫有穷状态自动机;书上是这么说的👇,是一个五元组(状态集合,字母表,状态转移表,开始状态,终止状态集合)





什么是DFA,也是一个五元组,在FA的基础上加了一个约束条件:每个状态结点只能发出一条具备相同符号的边;也就是同一状态不能发出(输入字符相同的)两条边上。能够发出输入字符不一样的多条边


下图就是一个DFA栗子👇编程




下图就是NFA的栗子👇(容许从一个状态发出多条具备相同符号的边,甚至容许发出标有ε(表示空)符号的边)
数据结构

完成这个实验,只须要知道DFA就能够了。

函数

前置知识2:有向图

什么是有向图:由顶点和有方向的边构成的图



如何在程序中存储有向图?
可使用数据结构中学的“邻接矩阵”
“邻接矩阵”就是一个“二维表”
设计

DFA实质就是一个有向图,各个顶点和其它顶点以前,使用有向边相链接;而DFA的状态转移表,就是它的邻接矩阵。


开始写代码1.设计固定DFA

采用面向对象的方式编程,没有对象就new一个。3d

1-1:先写一个状态结点类

状态结点类的总体构造是这样的👇
对象

1-2:DFA类

DFA的总体构造是这样的👇blog

5元组对应5个属性,其它还应该有状态表结点个数、字母表字符个数、最大存储的结点个数等属性。👇


递归

经过书上的一个DFA例子,理解一下状态集合、终结点集合、字母表集合是这样存储的👇
字符串

1-3:几个必要的函数


1-4:选一个栗子

选用例3-1 有穷自动机M: ({q0,q1,q2},{0},转换函数,q0,{q2}),做为样例
这个自动机功能是:识别偶数个0,好比00是合法的句子;而000就是非法的句子。

状态转换表以下


下图是例题3-1的DFA图👇



init()函数初始化例3-1的自动机👇,把例3-1的五元组分别存储到实例对象的5个属性中




graphInit()函数初始化状态转换表



主要理解状态转换表(有向图的邻接矩阵)👇

状态集合、终结点集合、字母表集合是这样存储的👇



而后试着理解状态转换表的存储👇

1-5:核心,递归程序识别句子



run()启动函数👇



dfs()核心递归程序👇

1-6:运行,效果



例3-1的DFA,功能:只识别偶数个0的句子。


主函数:




运行效果:


开始写代码2.文件形式存储DFA

下次再写吧。 有疑问能够在评论区提出

相关文章
相关标签/搜索