繁体   English   中英

从正则表达式生成图灵机的算法

[英]Algorithm to generate a Turing Machine from a Regular Expression

我正在开发一个软件来从正则表达式生成图灵机。

[编辑:澄清一下,OP希望将正则表达式作为输入,并以编程方式生成图灵机来执行相同的任务。 OP 正在寻求执行正则表达式创建 TM 的任务,而不是使用正则表达式。 ]

首先我会解释一下我做了什么,然后我的具体问题是什么:

我对正则表达式建模如下:

正则表达式(接口):下面的类实现了这个接口

简单(即:“aaa”、“bbb”、“abcde”):这是一个叶类,它没有任何子表达式

ComplexWithoutOr (ie: "a(ab)*","(a(ab) c(b) )*"):这个类包含一个正则表达式的列表。

ComplexWithOr (ie: "a(a|b) ","(a((ab) |c(b) ) "):这个类包含一个 Or 操作,其中包含一个正则表达式列表。它代表了“a|b " 第一个例子的一部分和第二个例子的 "(ab) |c(b) "。

变量(即:“awcw”,其中 w E {a,b}*):尚未实现,但其想法是将其建模为具有与 Simple 不同逻辑的叶类。 它代表示例的“w”部分。

理解并同意上述模型非常重要。 如果您有任何问题,请在继续阅读之前发表评论...

说到 MT 生成,我有不同程度的复杂性:

很简单:这种表达方式已经在起作用了。 为每个字母生成一个新状态并向右移动。 如果在任何状态下,读取的字母不是预期的,它会启动一个“回滚电路”,以 MT 头在初始位置结束并在非最终状态停止。

ComplexWithoutOr:这是我的问题。 在这里,算法为每个子表达式生成一个 MT 并将它们连接起来。 这适用于一些简单的情况,但我有回滚机制的问题。

这是一个不适用于我的算法的示例:

"(ab) abac":这是一个 ComplexWithoutOr 表达式,它包含一个 ComplexWithOr 表达式 "(ab) "(在 "ab" 中有一个 Simple 表达式)和一个 Simple 表达式 "abac"

我的算法首先为“ab”生成一个 MT1。 这个 MT1 被 MT2 用于“(ab)*”,所以如果 MT1 成功,它会再次进入 MT1,否则 MT1 回滚并且 MT2 正确完成。 换句话说,MT2 不会失败。

然后,它为“abac”生成一个 MT3。 MT2的输出是MT3的输入。 MT3的输出是执行的结果

现在,假设这个输入字符串:“abac”。 如您所见,它与正则表达式匹配。 那么让我们看看执行 MT 时会发生什么。

MT1 在第一次执行“ab”。 MT1 第二次 "ac" 失败并回滚,将 MT 头放在第三个位置 "a"。 MT2 正确完成,输入被转发到 MT3。 MT3 失败,因为 "ac"!="abac"。 所以MT不识别“abac”。

你明白问题所在吗? 你知道有什么解决办法吗?

我是用Java开发的,但是语言不重要,我想讨论一下算法。

我并不完全清楚您究竟要实施什么。 看起来您想要制作一个图灵机(或一般的任何 FSM),它只接受那些也被正则表达式接受的字符串。 实际上,您希望将正则表达式转换为 FSM。

实际上,这正是真正的正则表达式匹配器在幕后所做的事情。 我认为 Russ Cox 的这一系列文章涵盖了很多你想做的事情。

Michael Sipser 在 In Introduction to the Theory of Computation 中,在第 1 章证明了正则表达式在其描述能力上等同于有限自动机。 部分证明涉及构建一个非确定性有限自动机 (NDFA),它可以识别特定正则表达式所描述的语言。 我不打算复制那一章的一半,由于使用的符号,这会很困难,所以我建议你借用或购买这本书(或者使用这些术语的谷歌搜索可能会出现类似的证据)并使用它证明作为算法的基础。

由于图灵机可以模拟 NDFA,我假设生成 NDFA 的算法已经足够好了。

在乔姆斯基层次结构中,正则表达式为 Level3,而 TM 为 Level1。 这意味着,TM 可以生成任何正则表达式,但反之则不然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM