YAML解析 - lex还是手卷?

vyo*_*yom 6 parsing yaml lex bison flex-lexer

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

rio*_*oki 6

这个答案基本上是对以下问题的回答:“我应该推出自己的解析器还是使用解析器生成器?” 并且与 YAML 没有太大关系。但无论如何它会“回答”你的问题。

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

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

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

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

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