📌  相关文章
📜  正则表达式到有限自动机的转换

📅  最后修改于: 2022-05-13 01:54:10.421000             🧑  作者: Mango

正则表达式到有限自动机的转换

由于可以使用状态消除法从有限自动机构造正则表达式,因此可以使用反向方法、状态分解法从给定的正则表达式构造有限自动机。

注意:此方法将为给定的正则表达式构造 NFA(带或不带 ε 转换,取决于表达式),可以使用 NFA 到 DFA 的转换进一步将其转换为 DFA。

状态分解法

定理:由正则表达式定义的每种语言也由有限自动机定义。

证明:假设对于正则表达式 R,L = L(R)。我们证明对于一些 ε-NFA M,L = L(M):

1)正是一种接受状态。

2)在初始状态没有传入边。

3)在接受状态下没有出边。

证明是通过对 R 的结构归纳按照以下步骤完成的:

第 1 步:创建一个起始状态,例如 q 1和一个最终状态,例如 q 2 。将转换 q 1到 q 2标记为给定的正则表达式 R,如图 1 所示。但是,如果 R 是 (Q) * ,Kleene 对另一个正则表达式 Q 的闭包,则创建一个初始状态,这也将是最终状态,如图2。

图。1

图2

步骤2:重复以下规则(状态分解法),首先考虑最小优先级正则表达式运算符,直到表达式中没有运算符符为止。正则表达式中运算符的优先级定义为 Union < Concatenation < Kleene's Closure。

联合运算符(+)可以通过在两个状态之间引入平行边来消除,如下所示。

图 3:Union Operator 的移除

连接运算符('.' 或根本没有运算符可以通过在状态之间引入新状态来消除,如下所示。

图 4:移除连接运算符

Kleene 闭包 (*)可以通过基于以下条件在状态上引入自环来消除:

1.如果最左边的状态只有一个出边,即A在A->B的转移,则在状态A上引入自环,将边A到B标记为ε-转移,如图5.

图 5

2.否则,如果在最右边的状态只有一个输入边,即 B 在转换 A -> B 中,则在状态 B 上引入自循环并将边 A 标记为 B 为 ε-transition,如图所示图 6。

图 6

3.否则,在两个状态之间引入一个新状态,将自环标记为表达式。新状态将与之前的状态进行 ε-转换,如下所示,如图 7 所示。

图 7

例子:

为正则表达式构造有限自动机, R = (ab + ba) *

解决方案:

第 1 步:由于给定表达式 R 的形式为 (Q) * ,因此我们将创建一个初始状态,该状态也将是最终状态,具有标记为 (ab + ba) 的自环,如图所示8.(参考上面的图2)

图 8

第2步:
 
A.由于表达式中的最低优先级运算符是 union(+)。因此,我们将为“ab”和“ba”引入平行边(此处为平行自环),如图 9 所示。

图 9

B.现在我们有两个带有连接运算符的标签(两个变量之间没有提到的运算符是连接),因此我们通过引入新状态 q 1和 q 2来将它们一一删除,如图 10 和图 11 所示。(参见图4以上)

图 10

图 11

第 3 步:由于没有剩余的运算符,我们可以说图 11 是所需的有限自动机(NFA)。