【问题标题】:When to use parser-generator, when is regex is enough?什么时候使用解析器生成器,什么时候正则表达式就足够了?
【发布时间】:2009-07-22 11:26:16
【问题描述】:

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

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

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

请解释一下区别,我对理论和经验都感兴趣。

【问题讨论】:

    标签: regex parser-generator


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      来自维基百科:

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

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

      它比您想象的要快得多。我见过比这个帖子更大的表达式。

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

      【讨论】:

        【解决方案3】:

        正如 Sneakyness 所指出的,您可以拥有一个庞大而复杂的正则表达式,它的功能非常强大。我见过一些这样的例子,但没有一个是普通人可以维护的。即使使用Expresso 也只能起到这么大的作用;它仍然难以理解,修改起来也很冒险。所以除非你是一个对 Grep 很着迷的专家,否则我不会推荐这个方向。

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

        【讨论】:

          猜你喜欢
          • 2011-03-08
          • 2017-10-05
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-18
          • 1970-01-01
          相关资源
          最近更新 更多