一种将有限自动机中的循环转换为正则表达式的方法与流程

文档序号:11917497阅读:701来源:国知局
一种将有限自动机中的循环转换为正则表达式的方法与流程

本发明涉及计算机科学中的计算机控制和软件开发领域。具体涉及将有限自动机中的自循环和间接循环转换为正则表达式的方法。



背景技术:

有限自动机(Finite Automata Machine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(Finite State Machine),是一种应用非常广泛的软件设计模式。现实世界中的很多事物都可以用有限自动机来描述,因此它在计算机科学技术和其他学科中都有非常广泛的应用。由于正则表达式与有限自动机是等价的,而正则表达式能够用字符串表示,因此处理正则表达式比处理有限自动机更加方便,正则表达式在业界获得了广泛的应用,如图灵奖获得者Tony Hoare提出的“面向程序的统一建模理论”就是采用正则表达式来构造。

为将有限自动机转换为相应的正则表达式,过去一些学者提出了三个转换规则。规则1:对于两个顺序操作的迁移条件a和b,则生成的正则表达式为a.b。规则2:对于两个选择操作的迁移条件a和b,则生成的正则表达式为a+b或a|b。规则3:状态s1输入迁移条件a到达状态s2,s2输入迁移条件b,到达状态s2,而s2输入迁移条件c到达s3,则生成正则表达式a.b*.c。

前人的研究极大的推广自动机向正则表达式的转换和应用,但由于没有提出针对复杂自动机转换为正则表达式的规则,特别是带有复杂循环的有限自动机转换为正则表达式的转换规则,因此限制了复杂自动机的应用范围,也降低了计算机对复杂事物的模拟和处理能力。



技术实现要素:

根据上述背景技术中存在的缺陷和不足,本发明提出了一种将有限自动机中的循环转换为正则表达式的方法。该方法不但能处理有限自动机中的循环,还能处理一般意义上的有限自动机中的循环。本发明提及的方法不但能将有限自动机中的自循环或者间接循环转换为正则表达式,而且还能将同时包含自循环和间接循环的复杂循环转换为正则表达式。另外,本发明提及的方法还能将有限自动机中包含多个循环外状态的循环转换为正则表达式。本发明主要包括:1)循环识别,2)新迁移生成,3)循环约减,4)自动机调整四个阶段。

为了实现本发明的四个阶段,需要进行如下的定义。

定义1(有限自动机):一个有限自动机是一个五元组:

M=(Q,∑,δ,q0,F)

其中

(1)Q是一个有限状态集;

(2)∑是一个输入字母表,又称为迁移输入集或迁移条件集;

(3)δ:Q×∑→Q是一个迁移转换函数;

(4)q0∈Q是一个初始状态;

(5)是一个终止状态集。

定义2(迁移):一条迁移是被定义为T=<s1,a,s2>,且满足δ(s1,a)=s2,其中s1,s2∈Q,s1被称为迁移T的前状态,s2被称为迁移的后状态,a∈∑是状态s1上的一个迁移条件。

定义3(迁移条件序列):在有限自动机中,若p为多个迁移条件进行连接、选择和循环操作的有序组合,且满足δ(s1,p)=s2,则称p为迁移条件序列。

定义4(正则表达式):在有限自动机中,对于给定的输入字母表∑,则:

(1)对于和空迁移条件ε,a和ε都是正则表达式;

(2)如果a和b是正则表达式,则a|b也是正则表达式,其中符号|表示选择操作;

(3)如果a和b是正则表达式,则a.b也是正则表达式,其中符号.表示连接操作;

(4)如果a是正则表达式,则a*也是正则表达式,其中符号*表示循环操作;

(5)如果a是正则表达式,则(a)也是正则表达式。

本发明中提及的将有限自动机中的循环转换后的正则表达式,满足定义4的同时也满足了定义3,即转换后得到的正则表达式是一个迁移条件序列p,满足δ(s,p)=s。因此本发明的核心是为了获取有限自动机中循环的迁移条件序列。

定义5(自循环):在有限自动机中,若存在s∈Q和a∈∑,使得δ(s,a)=s,则称自动机在状态s上有一个自循环。

定义6(间接循环):在有限自动机中,若存在一个非空的迁移序列p,使得δ(s,p)=s,则称自动机包括一个间接循环。

定义7(出循环状态和循环外状态):若有限自动机中的某个状态s处于循环中,且存在s1∈Q和a∈∑,使得δ(s,a)=s1及状态s1并不在该循环中,则称s为该循环的一个出循环状态,s1为s对应的一个循环外状态。

本发明提出了一种将有限自动机中的循环转换为正则表达式的方法,包括以下步骤:

步骤一:识别有限自动机中的所有循环,包括自循环和间接循环;步骤二:为自循环和间接循环构造新的迁移条件序列;步骤三:若循环是为自循环,则直接删除循环上的状态和迁移条件;若循环为间接循环,则删除除循环初始状态外的所有状态和相关的迁移条件;步骤四:将新的迁移条件序列加入到有限自动机中;步骤五:输出不带循环的有限自动机。

其中,进一步地,步骤一中识别有限自动机中的所有循环可以采用以下两种方法:

采用图的搜索方式遍历有限自动机,获取有限自动机中的循环信息,包括深度优先搜索方法和广度优先搜索方法;或在构造有限自动机时,标记出其中的循环信息,包括循环的初始点、循环的迁移条件和循环的类型。

其中,进一步地,采用深度优先搜索方式,获取有限自动机中所有循环的算法包括以下步骤:

步骤11:构建一个栈来存储深度优先搜索有限自动机时的中间状态;

步骤12:由有限自动机的初始状态出发,按照深度优先策略遍历有限自动机,将初始状态存入栈中;

步骤13:标记初始状态为已经访问过的状态;

步骤14:若栈不空,则判断栈顶的状态是否存在下一个状态;

步骤15:如果栈顶的状态存在下一个状态s,则将状态s进栈,并将状态s标记为已访问过状态,否则栈顶的状态出栈;

步骤16:若栈顶的状态与栈中其他位置的状态一样,则栈顶到该位置所存储的所有状态为一个循环;

步骤17:设置栈顶的状态为该循环的循环初始状态;

步骤18:存储该循环中的所有状态信息;

步骤19:将栈顶的状态出栈;

步骤110:跳转到步骤14,直到栈为空,遍历结束。

其中,进一步地,采用图的广度优先搜索方法,获取有限自动机中所有循环的算法包括以下步骤:

步骤21:构造一个队列来存储广度优先搜索有限自动机时的中间状态;

步骤22:构造一个数组来存储某个状态的前驱状态;

步骤23:将有限自动机的初始状态进入队列;

步骤24:队列头部存储的状态出队列并标记为已经访问状态;

步骤25:如果该状态包含后续状态,则取该状态的后续所有状态,并依次进入队列尾部;

步骤26:在数组中依次记录队列中每个状态的前驱状态为刚出队列的状态;

步骤27:若队列尾部的状态为已标记过的状态时,则从队列尾部取该状态并标记该状态为循环的初始状态;

步骤28:令循环的初始状态为当前状态;

步骤29:在数组中找到当前状态的前驱状态;

步骤210:令前驱状态为当前状态;

步骤211:跳转到步骤29,直到在队列中找到该循环的循环初始状态为止;

步骤212:将队尾元素和获取的所有前驱状态组成一个循环,并记录该循环中的所有状态;

步骤213:跳转到步骤24,直到队列为空,遍历结束。

其中,进一步地,在构造有限自动机时,标记出其中循环信息的算法包括以下步骤:

步骤31:在构造有限自动机时,为循环的初始状态增加一个特殊标记符;

步骤32:在构造有限自动机时,为循环中状态的迁移条件增加一个特殊的标记符,用于记录该循环的类型;

步骤33:记录循环的初始状态和循环中的所有状态。

其中,步骤二中为每个循环构新的迁移条件序列包括为自循环和为间接循环构造新的迁移条件序列。

其中,进一步地,步骤二中为自循环构造新的迁移条件序列包括前置合并和后置合并方法。

其中,进一步地,前置合并方法是指所有到达状态上的迁移条件分别与该状态上自循环的迁移条件进行迁移条件的顺序连接操作;

其中,进一步地,后置合并方法是指该状态上自循环的迁移条件与所有到由该状态出发的迁移条件进行迁移条件的顺序连接操作;

其中,进一步地,步骤二中为间接循环构造新的迁移条件序列的算法包括以下步骤:

步骤41:若有限自动机包括间接循环,则取一个间接循环;

步骤42:记录循环的初始状态,循环中状态间跳转的迁移条件和循环的次数信息;

步骤43:获取循环的出循环状态集Q0;

步骤44:从Q0中取一个出循环状态s并获取其对应的循环外状态集Q1;

步骤45:从Q1中取一个循环外状态s1,获取s到s1的迁移条件序列L1;

步骤46:获取循环初始状态s0到出循环状态s的迁移条件序列p1;

步骤47:获取状态s到循环初始状态s0的迁移条件序列p2;

步骤48:获取循环中迁移条件所包含的循环符号k,其中k∈{*,+,{n-m}},k=*为默认循环次数,表示循环0到无穷次,k=+表示循环1到无穷次,k={n-m}表示循环n到m次;

步骤49:执行序列连接运算L=p1.(p2.p1)k.L1,其中符号“.“表示序列的连接操作;

步骤410:将L存储在新的迁移条件序列集合中;

步骤411:将s1从Q1中删除;

步骤412:若循环外状态集Q1不空,则跳转到45;否则将s从Q0中删除;

步骤413:若Q0不空,则跳转到步骤44,否则输出新的迁移条件序列集合。

其中,进一步地,步骤三中对自循环直接删除循环上的状态和迁移条件的算法包括如下步骤:

步骤51:删除自循环中状态s上的迁移条件;

步骤52:取状态s的上一状态s1和下一状态s2;

步骤53:获得状态s1到状态s的迁移条件p1;

步骤54:获得状态s到状态s2的迁移条件p2;

步骤55:构造新的迁移条件序列L=p1.p2;

步骤56:删除迁移条件p1和p2;

步骤57:删除状态s。

其中,进一步地,步骤三中对间接循环删除除循环初始状态外的所有状态和相关的迁移条件的算法包括如下步骤:

步骤61:取间接循环信息和循环初始状态s;

步骤62:获取s的下一个状态s1;

步骤63:将s1赋值给s;

步骤64:删除s1及所有到达s1的迁移条件和由s1出去的迁移条件;

步骤65:跳转到步骤62,直到s1为循环初始状态。

其中,步骤四中将新的迁移条件序列加入到有限自动机中的算法包括如下步骤:

步骤71:对于每一个新迁移条件序列L,获取其相关的前状态s1和后状态s2;

步骤72:用L连接前状态s1和后状态s2。

其中,进一步地,步骤四中将新的迁移条件序列加入到有限自动机中满足δ(s1,L)=s2。

其中,步骤五中输出的不带循环的有限自动机,其中所有的新迁移条件序列都是放在有限自动机的边上。

其中,将有限自动机的循环转换为正则表达式可以先将自循环转换为正则表达式,再将间接循环转换为正则表达式。

其中,将有限自动机的循环转换为正则表达式的过程是需要先构造新的迁移序列,再约减循环。

其中,为循环构造新的迁移序列与循环的数目无关,与循环外状态的数目有关,有一个循环外状态就需要构造一条新的迁移序列。

其中,为有限自动机中的循环而构造的新迁移条件序列是由迁移条件的连接、选择或循 环操作构成。

本发明的优点:

本发明通过循环识别、新迁移输入序列生成、循环删除、自动机调整四个过程,实现将有限自动机中的循环转换为相应的正则表达式。本发明不但能将有限自动机中的自循环和间接循环转换正则表达式,而且还能将复杂循环(同时包括自循环和间接循环,且拥有多个循环外状态)转换为正则表达式,提高了有限自动机的使用效率和计算机对有限自动机的处理能力。本发明能被应用于软件行为建模、基于模型的测试、硬件电路系统设计、软件工程、编译器、网络协议和计算与语言的研究,特别适合于提高有限自动机对复杂行为的建模和处理能力。

附图说明

图1是本发明的体系结构图;

图2是本发明的总体流程图;

图3是本发明中一个包含自循环的有限自动机采用前置合并方法约减自循环的过程图;

图4是本发明中一个包含自循环的有限自动机采用后置合并方法约减自循环的过程图;

图5是本发明中一个包含自循环及多个出循环迁移输入条件的有限自动机采用后置合并方法约减自循环的过程图;

图6是本发明中为一个包含间接循环和一个循环外状态的有限自动机构造新迁移条件序列的过程图;

图7是本发明中为一个包含间接循环和两个循环外状态的有限自动机构造新迁移条件序列的过程图;

图8是本发明中一个包含间接循环的有限自动机约减循环的过程图;

图9是本发明中一个包含间接循环及两个出循环迁移输入条件的有限自动机的约减循环的过程图;

图10是本发明中一个包含自循环和间接循环的有限自动机约减循环的过程图。

具体实施方式

结合以下具体实施例和附图,对本发明作进一步的详细说明。实施本发明的过程、条件、实验方法等,除以下专门提及的内容之外,均为本领域的普遍知识和公知常识,本发明没有特别限制内容。

图1是本发明的体系结构图。在本发明中,将有限自动机中的循环转换为正则表达式需要经过四个阶段,1)识别有限自动机中的循环,2)将循环部分转换为一条新的迁移条件序列,3)除初始状态外,删除循环中的其他状态,4)将新的迁移条件序列加入到有限自动机 中,其中这条序列的前状态是循环的初始状态,后状态是一个循环外状态。

图2是本发明的总体流程图。首先输入一个带循环的有限自动机,再找出其中所有的自循环,并采用前置或后置合并的方法生成新的迁移条件序列,再约减自循环。随后对每一个间接循环找到出循环状态和循环外状态,获取循环初始状态到出循环状态之间的迁移条件序列及出循环状态到循环初始状态的序列,再依据为间接循环构造新迁移条件序列的步骤,构造新的迁移条件,再调整有限自动机,直到所有的循环都已经转换为了正则表达式。

本发明中,有限自动机中的循环转换为正则表达式,包括以下步骤:步骤一:识别有限自动机中的所有循环,包括自循环和间接循环;步骤二:为自循环和间接循环构造新的迁移条件序列;步骤三:若循环是为自循环,则直接删除循环上的状态和迁移条件;若循环为间接循环,则删除除循环初始状态外的所有状态和相关的迁移条件;步骤四:将新的迁移条件序列加入到有限自动机中;步骤五:输出不带循环的有限自动机。

步骤一中,识别有限自动机中的所有循环的方法包括,采用图的搜索方式遍历有限自动机,获取有限自动机中的所有循环,或在构造有限自动机中的循环时,标记出相关的循环信息,包括循环的初始点、循环的迁移条件和循环的类型。采用图的搜索方法包括深度优先搜索方法和广度优先搜索方法。

采用深度优先搜索方法获得有限自动机的循环,包括如下步骤:步骤11:构建一个栈来存储深度优先搜索有限自动机时的中间状态;步骤12:由有限自动机的初始状态出发,按照深度优先策略遍历有限自动机,将初始状态存入栈中;步骤13:标记初始状态为已经访问过的状态;步骤14:若栈不空,则判断栈顶的状态是否存在下一个状态;步骤15:如果栈顶的状态存在下一个状态s,则将状态s进栈,并将状态s标记为已访问过状态,否则栈顶的状态出栈;步骤16:若栈顶的状态与栈中其他位置的状态一样,则栈顶到该位置所存储的所有状态为一个循环;步骤17:设置栈顶的状态为该循环的循环初始状态;步骤18:存储该循环中的所有状态信息;步骤19:将栈顶的状态出栈;步骤110:跳转到步骤14,直到栈为空,遍历结束。

采用广度优先搜索方法获得有限自动机的循环包括如下步骤:步骤21:构造一个队列来存储广度优先搜索有限自动机时的中间状态;步骤22:构造一个数组来存储某个状态的前驱状态;步骤23:将有限自动机的初始状态进入队列;步骤24:队列头部状态出队列并标记为已经访问状态;步骤25:如果该状态包含后续状态,则取该状态的后续所有状态,并依次进入队列尾部;步骤26:在数组中依次记录队列中每个状态的前驱状态为刚出队列的状态;步骤27:若队列尾部的状态为已标记过的状态时,则从队列尾部取该状态并标记该状态为循环的初始状态;步骤28:令循环的初始状态为当前状态;步骤29:在数组中找到当前状态的前 驱状态;步骤210:令前驱状态为当前状态;步骤211:跳转到步骤29,直到在队列中找到该循环的循环初始状态为止;步骤212:将队尾元素和获取的所有前驱状态组成一个循环,并记录该循环中的所有状态;步骤213:跳转到步骤24,直到队列为空,遍历结束。

在构造有限自动机时,标记出其中循环信息的算法包括以下步骤:步骤31:在构造有限自动机时,为循环的初始状态增加一个特殊标记符;步骤32:在构造有限自动机时,为循环中状态的迁移条件增加一个特殊的标记符,用于记录该循环的类型;步骤33:记录循环的初始状态和循环中的所有状态。

为自循环构造新迁移条件序列包括前置合并和后置合并;前置合并方法是指将所有到达状态上输入的迁移条件分别与该状态上自循环的迁移条件进行连接操作,生成一组新的迁移条件序列;后置合并是指该状态上自循环的迁移条件与该状态的所有输出的迁移条件分别进行连接操作,生成一组新的迁移条件序列。

为间接循环构造新迁移条件序列包括如下步骤:步骤41:若有限自动机包括间接循环,则取一个间接循环;步骤42:记录循环的初始状态,循环中状态间跳转的迁移条件和循环的次数信息;步骤43:获取循环的出循环状态集Q0;步骤44:从Q0中取一个出循环状态s并获取其对应的循环外状态集Q1;步骤45:从Q1中取一个循环外状态s1,获取s到s1的迁移条件序列L1;步骤46:获取循环初始状态s0到出循环状态s的迁移条件序列p1;步骤47:获取状态s到循环初始状态s0的迁移条件序列p2;步骤48:获取循环中迁移条件所包含的循环符号k,其中k∈{*,+,{n-m}},k=*为默认循环次数,表示循环0到无穷次,k=+表示循环1到无穷次,k={n-m}表示循环n到m次;步骤49:执行序列连接运算L=p1.(p2.p1)k.L1,其中符号“.“表示序列的连接操作;步骤410:将L存储在新的迁移条件序列集合中;步骤411:将s1从Q1中删除;步骤412:若循环外状态集Q1不空,则跳转到45;否则将s从Q0中删除;步骤413:若Q0不空,则跳转到步骤44,否则输出新的迁移条件序列集合。

步骤三中对自循环直接删除循环上的状态和迁移条件包括如下步骤:步骤51:删除自循环中状态s上的迁移条件;步骤52:取状态s的上一状态s1和下一状态s2;步骤53:获得状态s1到状态s的迁移条件p1;步骤54:获得状态s到状态s2的迁移条件p2;步骤55:构造新的迁移条件序列L=p1.p2;步骤56:删除迁移条件p1和p2;步骤57:删除状态s。

步骤三中对间接循环删除除循环初始状态外的所有状态和相关的迁移条件包括如下步骤:步骤61:取间接循环信息和循环初始状态s;步骤62:获取s的下一个状态s1;步骤63:将s1赋值给s;步骤64:删除s1及所有到达s1的迁移条件和由s1出去的迁移条件;步骤65:跳转到步骤62,直到s1为循环初始状态。

步骤四中将新的迁移条件序列加入到有限自动机中包括如下步骤:步骤71:对于每一个 新迁移条件序列L,获取其相关的前状态s1和后状态s2;步骤72:用L连接前状态s1和后状态s2。

实施例1:

图3是本发明中一个包含自循环的有限自动机采用前置合并方法约减自循环的过程图。由图3(a)可知,状态s1上有一个自迁移输入b,因此采用前置合并的方法将a与b合并,得到图3(b)中的新迁移条件序列a.b*。最后再将删除状态s1,得到图3(c)中的迁移条件序列a.b*.c。

实施例2:

图4是本发明中一个包含自循环的有限自动机采用后置合并方法约减自循环的过程图。由图4(a)可知,状态s1上有一个自迁移输入b,因此采用后置合并的方法将b与c合并,得到图4(b)中的新迁移输入序列b*.c。最后再将删除状态s1,得到图4(c)中的迁移条件序列a.b*.c。

实施例3:

图5是本发明中一个包含自循环及多个出循环迁移输入条件的有限自动机采用后置合并方法约减自循环的过程图。由图5(a)可知,状态s1上有一个自迁移输入b,因此采用后置合并的方法将b分别与c和d合并,得到图5(b)中的两条新迁移条件序列b*.c和b*.d。最后再将删除状态s1,得到图5(c)中的两条迁移条件序列a.b*.c和a.b*.d。

实施例4:

图6是本发明中为一个包含间接循环和一个循环外状态的有限自动机构造新迁移条件序列的过程图。图6(a)是一个包含间接循环和单一循环外状态的有限自动机,因此可以得到三条迁移条件a、b、c,如图6(b)所示。再依据步骤41到步骤413所述,构造了一条新的迁移输入序列a.(b.a)*.c,如图6(c)所示。

实施例5:

图7是本发明中为一个包含间接循环和两个循环外状态的有限自动机构造新迁移条件序列的过程图。因为图7(a)是一个包含间接循环和两个循环外状态的有限自动机,因此可以得到四条迁移条件序列a、a.b、b.c、c,如图7(b)所示。再依据步骤41到步骤413所述,构造两条新的迁移输入序列a.(b.c.a)*.d和a.b.(c.a.b)*.e,如图7(c)所示。

实施例6:

图8是本发明中一个包含间接循环的有限自动机约减循环的过程图。由图8(a)可知,存在一个间接循环s0—s1—s0和一个循环外状态s2。依据步骤41到步骤413所述,构造一条s0到s2的新迁移条件序列a.(b.a)*.c,显示在图8(b)中。最后删除除s0外的循环中的状 态及相关迁移条件,得到一个不带循环的有限自动机,如图8(c)所示。

实施例7:

图9是本发明中一个包含间接循环及两个出循环迁移输入条件的有限自动机的约减循环的过程图。由于图9(a)中的有限自动机包含一个间接循环s0—s1—s2—s0和两个循环外状态s3和s4。依据步骤41到步骤413所述,构造s0到s3的新迁移条件序列a.(b.c.a)*.d和s0到s4的新迁移条件序列a.b.(c.a.b)*.e,显示在图9(b)中。最后删除除s0外的循环中的状态及相关的迁移条件,得到一个不带循环的有限自动机,如图9(c)所示。

实施例8:

图10是本发明中一个包含自循环和间接循环的有限自动机约减循环的过程图。图10(a)中的有限自动机中包含一个自循环的迁移条件d在状态s1上,一个间接循环s0—s1—s2—s0,以及一个循环外状态s3。首先采用前置合并的方法,将迁移条件a与自循环的迁移条件d进行合并,得到图10(b)中的a.d*。接着依据步骤41到步骤413构造s0到s3的新迁移条件序列a.d*.(b.c.a.d*)*.e,如图10(c)所示。最后删除除s0外的循环中的状态和相关迁移输入,得到图10(d)。

本发明的保护内容不局限于以上实施例。在不背离发明的精神和范围下,本领域技术人员能够想到的变化和优点都被包括在本发明中,并且以所附的权利要求书为保护范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1