代码之家  ›  专栏  ›  技术社区  ›  benc

何时使用解析器生成器,regex何时足够?

  •  6
  • benc  · 技术社区  · 16 年前

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

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

    然后我考虑使用解析器生成器。我认为所有的方法都是一样的:它们生成一个fsa。但我不知道哪一个更有效。您通常什么时候使用解析器生成器而不是regex(我认为您可以在解析器生成器中编写regex)?

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

    3 回复  |  直到 15 年前
        1
  •  7
  •   sleske    16 年前

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

    另一个方面是您正试图处理解析的数据。如果您只对一个字段感兴趣,那么regex可能更容易阅读。如果您需要深入地阅读嵌套结构,解析器可能更易于维护。

        2
  •  4
  •   Sneakyness    16 年前

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

    维基百科:

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

    如果您要浏览一个只需浏览一次的列表,那么请将该列表保存到一个文件中并从中读取。如果每次都要检查不同的内容,请使用regex并将结果存储在数组或其他内容中。

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

    另外,你可以根据自己的喜好,用任何你决定用的语言来嵌套。为了最大限度地提高可用性,您甚至可以分段进行。

        3
  •  2
  •   Steven Sudit    16 年前

    正如鬼鬼祟祟地指出的那样,你可以有一个巨大而复杂的正则表达式,它的强大程度令人惊讶。我看到过一些这样的例子,但没有一个能被凡人维护。即使使用 Expresso 只是帮助了这么多,仍然很难理解,修改也很危险。所以,除非你是一个对grep有着浓厚兴趣的学者,否则我不会推荐这个方向。

    相反,考虑专注于语法并让 compiler compiler 帮你搬重物。