【问题标题】:YAML parsing - lex or hand-rolled?YAML 解析 - lex 还是手卷?
【发布时间】:2011-09-19 19:18:28
【问题描述】:

我正在尝试编写一个简单的 YAML 解析器,我从 yaml.org 阅读了规范, 在开始之前,我想知道编写手动解析器是否更好,或者 使用lex (flex/bison)。我查看了libyaml(C 库)- 似乎没有使用lex/yacc。 YAML(不包括流样式),似乎更面向行,所以,是吗 更容易编写手动解析器,或使用flex/bison 谢谢。

【问题讨论】:

  • 您是否考虑过只使用标准的、现成的 YAML 解析器?或者您是否特别有兴趣构建自己的?另外,请注意lexflex扫描器生成器,而不是解析器生成器;要进行解析,您需要使用 yaccbison
  • @templatetypedef 我有兴趣构建自己的。
  • @templatetypedef 我可能没有把我的问题说清楚。我知道lex 只是一个标记器。我想知道 YAML 的结构是否更适合 flex/bison 或手动解析器
  • 我应该警告 flex/bison 无法解析 YAML。 YAML1.2 有超过 200 条语法规则,其中大多数都需要缩进匹配,而这几乎不可能用 flex 标记器正确实现(特别是,即使使用复杂的 flex hack,也无法匹配多个 de-dents)。您需要一个遵守缩进规则的标记器。如果我可以推荐一个:RE/flex 包括YAML1.2 tokenizer and parser example

标签: parsing yaml bison lex flex-lexer


【解决方案1】:

这个答案基本上是对以下问题的回答:“我应该滚动自己的解析器还是使用解析器生成器?”和 YAML 关系不大。但它仍然会“回答”你的问题。

您需要问的问题不是“这是否适用于这种给定的语言/语法”,而是“我是否有信心实现它”。事实是,您要解析的大多数格式都只能与生成的解析器一起使用。另一个事实是,即使是复杂的语言也可以用简单的手写recursive descent parser 来解析。

我已经编写了一个用于EDDL(C 和结构化元素)的递归下降解析器和一个用于 INI 的 bison/flex 解析器。我选择了这些示例,因为它们违背直觉,并且外部要求决定了决定。

既然我在技术层面上建立了它是可能的,为什么你会选择一个而不是另一个?这是一个很难回答的问题,这里有一些关于这个主题的想法:

  • 编写一个好的词法分析器真的很难。在大多数情况下,使用 flex 生成词法分析器是有意义的。手动滚动您自己的词法分析器几乎没有什么用处,除非您有非常奇特的输入格式。
  • 使用 bison 或类似的生成器使用于解析的语法显式可见。这里的主要收获是,在五年内维护您的解析器的开发人员将立即看到所使用的语法,并可以将其与任何规范进行比较。
  • 使用递归下降解析器可以清楚地知道解析器中发生的情况。这为优雅地处理 harry 冲突提供了简单的方法。您可以编写一个简单的 if,而不是将整个语法重新排列为 LALR1。
  • 在开发解析器时,您可以使用手写解析器“修饰细节”,但使用 bison 这几乎是不可能的。在野牛中,语法必须有效,否则生成器不会做任何事情。
  • Bison 非常擅长指出语法中的形式缺陷。不幸的是,您只能独自修复它们。手动滚动解析器时,您只会在解析器读取废话时发现缺陷。

这不是一个或另一个的明确答案,但它为您指明了正确的方向。既然您似乎是为了好玩而编写解析器,我认为您应该编写这两种类型的解析器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多