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

时间:2010-07-02 18:40:54

标签: java generator turing-machines

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

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

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

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

RegularExpression(接口):下面的类实现了这个接口

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

ComplexWithoutOr(即:“a(ab)*”,“(a(ab) c(b))*”):此类包含RegularExpression列表。

ComplexWithOr(即:“a(a | b)”,“(a((ab) | c(b)”):这个类包含一个或者包含RegularExpression列表的操作。它代表第一个例子的“a | b”部分和第二个例子的“(ab) | c(b)”。

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

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

在MT生成方面,我有不同程度的复杂性:

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

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

以下示例不适用于我的算法:

“(ab) abac”:这是一个ComplexWithoutOr表达式,包含一个ComplexWithOr表达式“(ab)”(在“ab”中有一个Simple表达式)和一个简单表达式“abac”

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

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

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

第一次“ab”执行MT1。 MT1第二次失败“ac”并回滚,将MT头置于第3位“a”。 MT2完成正确,输入转发到MT3。 MT3失败,因为“ac”!=“abac”。所以MT不承认“abac”。

你明白这个问题吗?你知道任何解决方案吗?

我正在使用Java来开发它,但语言并不重要,我想讨论算法。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

在chomsky层次结构中,正则表达式是Level3,而TM是Level1。这意味着,TM可以产生任何正则表达式,但反之亦然。