YAML解析 - lex还是手卷?

时间:2011-09-19 19:18:28

标签: parsing yaml bison lex flex-lexer

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

1 个答案:

答案 0 :(得分:3)

这个答案基本上是对这个问题的回答:“我应该使用自己的解析器还是使用解析器生成器?”和YAML没什么关系。但它会“回答”你的问题。

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

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

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

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

对于其中一个,这不是一个明确的答案,但它指出了正确的方向。既然看起来你正在编写解析器以获得乐趣,我认为你应该编写两种类型的解析器。