我正在开发一个软件来从正则表达式生成图灵机。
[编辑:为了澄清,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来开发它,但语言并不重要,我想讨论算法。
答案 0 :(得分:1)
我不完全清楚你究竟想要实现什么。看起来你想要制作一个图灵机(或一般的任何FSM),它只接受正则表达式也接受的那些字符串。实际上,您希望将正则表达式转换为FSM。
实际上,这正是真正的正则表达式匹配器所做的。我认为Russ Cox撰写的this系列文章涵盖了很多你想做的事情。
答案 1 :(得分:1)
由于图灵机可以模拟NDFA,我假设生成NDFA的算法已经足够了。
答案 2 :(得分:0)
在chomsky层次结构中,正则表达式是Level3,而TM是Level1。这意味着,TM可以产生任何正则表达式,但反之亦然。