如何将 DFA 转换为正则表达式?

Posted

技术标签:

【中文标题】如何将 DFA 转换为正则表达式?【英文标题】:how to convert a DFA to a regular expression? 【发布时间】:2017-10-04 14:40:07 【问题描述】:

我正在阅读这本书:介绍计算理论并被这个例子卡住了。

首先将 DFA 转换为 GNFA(广义非确定性有限自动机),然后将 GNFA 转换为正则表达式,从而将其转换为等价表达式。

示例如下: enter image description here

我应该递归地使用它来到达第四个状态: enter image description here

不幸的是,我无法理解从 b 到 c 发生了什么?我只知道我们试图摆脱状态2,但是我们如何从b到达c?

非常感谢!

【问题讨论】:

【参考方案1】:

一开始这可能很棘手,但我建议您检查定义 1.64 并查看函数 CONVERT(G) 以获得更多信息。但作为对每个可能的邻居状态使用该函数的简要说明:

首先从a到b,添加一个start state和一个新的accept state;

之后需要计算qrip被移除后的每条新路径,在本例中为状态1;

因此,从开始到 q2,您只能从 epsilon 和 a 中获得标签 a;

从 start 到 q3 也是如此,只产生 b;

现在从 q2 到 q2 穿过 qrip,你有标签 a 到 qrip 和标签 a 回来,所以你得到 (aa U b);

同样通过qrip到q3到q3,所以产生bb,注意q3中没有loop所以没有union;

现在从 q2 到 q3 通过 qrip,你只需要连接 a 和 b 得到 ab 标签;

最后反过来,从 q3 到 q2 通过 qrip,连接 b 和 a,得到 ba,但这次与 q3 和 q2 之间的前一条路径合并;

现在选择一个新的 qrip 并继续执行相同的算法。

希望解释足够清楚,但如前所述,请参阅书中的算法以获得更好和更详细的解释。

【讨论】:

【参考方案2】:

将给定 DFA 转换为其正则表达式的两种流行方法是 -

    雅顿方法 状态消除方法

Arden 定理指出:

令 P 和 Q 是 ∑ 上的两个正则表达式。

要使用雅顿定理,必须满足以下条件-

转换图不能有任何 ∈ 转换。 必须只有一个初始状态。

步骤 01:

考虑到该状态的转换,为每个状态形成一个方程。 在初始状态方程中加上‘∈’。

步骤 02:

将最终状态以 R = Q + RP 的形式带入,得到所需的正则表达式。

如果P不包含空字符串∈,那么-

R = Q + RP 有一个唯一解,即 R = QP*

【讨论】:

以上是关于如何将 DFA 转换为正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 DFA 正则表达式匹配器实现正则表达式断言/环视(即 \b 样式字边界)

基于 DFA 的正则表达式匹配 - 如何获取所有匹配项?

编译原理-第三章 词法分析-3.7 从正则表达式到自动机-从NFA到DFA的转换

为给定的正则表达式绘制最小 DFA

正则表达式 0(0+1)*0+1(0+1)*1 的 DFA 是多少?

正则表达式等价