6

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

我的第一个想法是手动构建一个简单的有限状态机,但后来我想也许我可以用更少的工作,甚至更有效地做到这一点。我以前用过正则表达式,但我认为NMEA正则表达式很长,应该需要“很长时间”才能匹配它。

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

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

4

3 回答 3

7

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

另一个方面是你试图对解析的数据做什么。如果您只对一个领域感兴趣,那么正则表达式可能更易于阅读。如果您需要阅读深度嵌套的结构,解析器可能更易于维护。

于 2009-07-22T11:35:58.793 回答
4

正则表达式一个解析器生成器。

来自维基百科:

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

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

它比你想象的要快得多。我见过比这篇文章更大的表达。

补充一点,您可以随意嵌套,使用任何您决定编写代码的语言。您甚至可以分段进行,以获得最大的可重用性。

于 2009-07-22T11:34:23.070 回答
2

As Sneakyness points out, you can have a large and complicated regular expression that is surprisingly powerful. I've seen some examples of this, but none were maintainable by mere mortals. Even using Expresso only helped so much; it was still difficult to understand and risky to modify. So unless you're a savant with a fixation on Grep, I would not recommend this direction.

Instead, consider focusing on the grammar and letting a compiler compiler do the heavy lifting for you.

于 2009-07-22T12:57:01.930 回答