何时使用解析器生成器,什么时候正则表达式就足够了?

时间:2009-07-22 11:26:17

标签: regex parser-generator

我还没有进入计算机科学的正规语言领域,所以也许我的问题很愚蠢。我正在用C ++编写一个简单的NMEA解析器,我必须选择:

我的第一个想法是手动构建一个简单的有限状态机,但后来我想也许我可以用更少的工作来做,甚至更有效率。我之前使用过正则表达式,但我认为NMEA正则表达式非常长,并且需要“很长时间”来匹配它。

然后我考虑使用解析器生成器。我认为所有人都使用相同的方法:他们生成FSA。但我不知道哪个更有效率。你什么时候通常使用解析器生成器而不是正则表达式(我认为你可以在解析器生成器中编写正则表达式)?

请解释这些差异,我对理论和经验感兴趣。

3 个答案:

答案 0 :(得分:7)

嗯,一个简单的经验法则是:如果您尝试解析的数据的语法是regular,请使用正则表达式。如果不是,正则表达式可能仍然有效(因为大多数正则表达式引擎也支持非常规语法),但它可能很痛苦(复杂/糟糕的性能)。

另一个方面是您尝试对解析的数据执行的操作。如果您只对一个字段感兴趣,那么正则表达式可能更容易阅读。如果您需要深入嵌套结构,则解析器可能更易于维护。

答案 1 :(得分:4)

Regex 解析器生成器。

来自维基百科:

  

正则表达式(缩写为regex或regexp,具有复数形式regexes,regexps或regexen)是用正式语言编写的,可由正则表达式处理器解释,该程序可用作解析器生成器或检查文本并识别与提供的规范相匹配的部分。

如果你要查看一个只需要翻过一次的列表,那么将列表保存到文件中并从那里读取。如果您每次都检查不同的内容,请使用正则表达式并将结果存储在数组或其他内容中。

它比你想象的要快得多。我看到的表达方式比这篇文章更重要。

添加您可以根据自己的喜好嵌套,无论您决定使用哪种语言进行编码。您甚至可以分段进行嵌套,以获得最大的可重用性。

答案 2 :(得分:2)

正如Sneakyness指出的那样,你可以拥有一个令人惊讶的强大的大而复杂的正则表达式。我已经看到了一些这样的例子,但没有一个可以由凡人维持。即使使用Expresso也只能帮助很多;修改仍然很难理解和冒险。因此,除非你是一个固定Grep的学者,否则我不会推荐这个方向。

相反,请考虑专注于语法并让compiler compiler为你做繁重的工作。