在解析正则表达式时创建自动机

时间:2010-12-16 15:53:46

标签: regex algorithm parsing

我正在尝试将正则表达式转换为NFA,而我遇到了麻烦。如果您不知道该主题,那么这是我所说here的链接。

这里的问题是作者解释说,给定一个字符串,你首先将它转换为postfix。他提到实时在解析R.E时绘制NFA会更好但是没有给出这样的方法.......

我在启动时遇到问题。任何人都可以指导我在解析字符串时应该创建NFA的算法是什么,因为括号是一个大问题,因为它们应该首先完成......

PS: - 我实际上不确定应该在此放置其他标签....这也不是作业

2 个答案:

答案 0 :(得分:1)

可以将括号中的正则表达式视为单独的NFA。你关心的只是它有一个输入状态和一个接受状态。您只需递归地将括号中的内容解析为NFA并将其输入插入并接受状态到您正在构造的NFA中的适当位置。解析中缀表达式的棘手部分是使运算符优先级正确,这将花费与转换为后缀一样多的工作。

我怀疑他的意思是不是输出后缀(来自,比如shunting yard algorithm),然后重新解析后缀,只需处理后缀令牌,因为你准备输出它们(而不是输出它们) )。

答案 1 :(得分:1)

这是Python的一页中的a combined parser, NFA builder, and NFA interpreter。我希望我不会破坏为自己搞清楚的乐趣 - 你可能更愿意等待并继续黑客攻击,然后才能关注链接。

这有点像deinst的建议,但是'倒退'。正如deinst所说,你可以让解析器为正则表达式的每个子表达式构建一个NFA,然后随时将它们连接起来。例如,对于(a|b)*c,您首先解析(a|b)*以获得NFA#1,然后解析c以获得NFA#2,然后破解NFA#1的最终状态,将其更改为# 2的开始状态。等等递归。这是传统的答案。

我的代码首先创建了一个简单的NFA,只有一个接受状态,仅此而已。然后它解析c,扩展NFA:现在我们有一个检查c的NFA,然后接受。接下来,它递归地解析(a|b)*,仍在扩展NFA。在给定字符串re和NFA k的情况下,解析器的合同将解析字符串以生成结果NFA,该结果在k re时结束} 火柴。这种方法避免了部分NFA的破坏比特将它们连接在一起的需要。