【问题标题】:Building a Regex Based Parser [closed]构建基于正则表达式的解析器
【发布时间】:2011-07-20 08:12:32
【问题描述】:

构建基于正则表达式的解析器是愚蠢的吗?

【问题讨论】:

  • ----这取决于----
  • 您似乎问了两个不同的问题:您是否正在构建一个语言解析器并希望您的解析器基于一堆正则表达式?或者您是否试图实现pcreOniguruma 正则表达式解析器的竞争对手?
  • 这个问题和VBScript Partial Parser有关吗?或许你可以和Sarah Vessels联手。
  • 是的,这很愚蠢。但是构建一个基于正则表达式的词法分析器是可以的。
  • @redDragonzz,在某种意义上,PEGs (en.wikipedia.org/wiki/Parsing_expression_grammar) 可以被认为是正则表达式的泛化。因此,如果您更喜欢这种思维方式,您可以尝试使用现有的 PEG 解析器生成器之一来构建您的解析器 - 它比经典的词法分析器 + 解析器组合更容易、更直观。

标签: regex parsing


【解决方案1】:

使用现代模式匹配嵌套括号非常简单。不算空格,这种东西:

\( (?: [^()] *+ | (?0) )* \)

适用于 Perl 和 PHP 等主流语言,以及任何使用 PCRE 的语言。

但是,您确实需要语法正则表达式来进行完整解析,否则您会发疯的。不要使用正则表达式不支持将正则表达式分解为更小的单元,或者不支持对其编译和执行进行适当调试的语言。对于低级黑客来说,生命太短暂了。如果你打算这样做,还不如回到汇编语言。

我写过很多关于递归模式、语法模式和解析的文章:例如,参见here for parsing approacheshere for lexer approaches;还有final solution here

此外,Perl 的 Regexp::Grammars module 在将语法正则表达式转换为解析结构方面特别有用。

所以,无论如何,去吧。这样你会学到很多东西。

【讨论】:

  • +1 希望我能给你+100!优秀的引用参考文献现已添加书签。
  • 虽然你可以在一定程度上使用 RegExp 进行解析,但这仍然是一个愚蠢的想法(无法构建语法树或对输入有任何意义......)和 stackoverflow.com/questions/1732348/…
【解决方案2】:

为了工作?是的。为了学习?没有。

【讨论】:

    【解决方案3】:

    用正则表达式解析你自己的小语言的魅力怎么强调都不为过:大多数系统管理员可以非常快速地完全用 Perl 编写一个简单的语言解析器,但是用 lex/yacc 解析相同的语言需要大多数程序员几个小时。

    Perl 版本可能就可以完成这项工作。但正如 gpvos 指出的那样,使用正则表达式后端进行解析会大大减少未来的增强选项,有时尝试解决这些限制会导致一些非常糟糕的代码,而使用表驱动工具或手动处理这些一般增强很容易编写递归下降解析器。

    如果您知道该语言始终可以通过正则表达式轻松解析,那么您可能会花一个小时完成工作,而不是花四五个小时重新学习 lex 和 yacc 来编写代码具有更强大工具的类似解析器。但是,如果该语言可能会增长或变化很大,那么从长远来看,使用真正的解析器生成器可能会有所帮助。

    【讨论】:

      【解决方案4】:

      这取决于您要解析的内容,但对于大多数实际情况,IMO 的答案是“否”。正则表达式在他们可以识别的语法上非常有限(由正则表达式实现设置的限制,因为每个人都在上面加了自己的香料)

      正如您在 cmets 中所说,您正在为 VBScript 构建解析器,忘记正则表达式,因为您需要识别 Context Free Grammar。检查 GOLD Parser 或 ANTLR。

      【讨论】:

      • 使用了 Gold Parser,它解析代码,但是非常慢,而我希望实现一些非常快的东西,并且异步不会占用大量时间。与往常一样,我可以优化我对 GOLD 解析器的使用,但看起来正则表达式可能无法帮助解析所有内容,它们仍然可以帮助您找到函数声明等,这比使用 GOLD 解析器解析整个源代码更需要。
      【解决方案5】:

      通常,正则表达式用于词法分析器(识别标记),而更强大的东西(例如递归下降解析器)用于识别标记序列,即实际解析。

      对于非常简单的语言,一个正则表达式就足够了,但你会非常限制自己。例如,您不能使用正则表达式解析像 (1 + 2) * 3 - 4 这样的表达式。

      【讨论】:

      • 为什么不能用正则表达式解析 (1 + 2) * 3 - 4
      • Ruby 的新 Oniguruma 正则表达式引擎提供了“命名组”,可以用于查找正确嵌套的括号等。但我认为一个 RD 解析器会更容易编写和维护完整的算术......
      • @Stephan:好吧,你可以解析那个特定的表达式,但不能解析使用括号到任何深度的通用表达式。即使您要创建一个正则表达式来匹配最多包含四个嵌套括号的表达式,它也会变得比更合适的实现要复杂得多。
      • 你夸大了。看我的回答。
      【解决方案6】:

      看看GoldParser。它允许使用正则表达式来查找标记。

      【讨论】:

      • 查看关于使用正则表达式解析 html 的广泛答案。 GoldParser 可能无法生成 html 解析器,因为 html 和 XHTML 都是比正则表达式处理的语言更复杂的语言。
      猜你喜欢
      • 2010-10-29
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      相关资源
      最近更新 更多