如何将 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 样式字边界)
编译原理-第三章 词法分析-3.7 从正则表达式到自动机-从NFA到DFA的转换