2011-09-19 98 views
6

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

+1

您是否考虑过使用标准的现成YAML解析器?或者你有兴趣建立自己的?另外请注意,'lex'和'flex'是*扫描器生成器*,而不是* parser生成器*;要解析,你想使用'yacc'或'bison'。 – templatetypedef

+0

@templatetypedef我有兴趣创建自己的。 – vyom

+1

@templatetypedef我可能没有明确表示我的问题。我明白'lex'只是一个分词器。我想知道YAML的结构是否适合'flex/bison'或手动解析器 – vyom

回答

3

这个答案基本上是一个问题的答案:“我应该推出自己的解析器还是使用解析器生成器?”与YAML没有多大关系。但它会“回答”你的问题。

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

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

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

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

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