yacc / lex还是手工编码?

时间:2010-08-29 01:14:19

标签: programming-languages yacc

我正在研究新的编程语言,但我总是对每个人都使用yaxx / lex来解析代码感到困惑,但我不是。

我的编译器(已经在工作)是用C ++ / STL手动编码的,我不能说它复杂或占用太多时间。它有某种词法分析器和解析器,但它们不是自动生成的。

之前,我以同样的方式编写了一个C编译器(不是完整的规范) - 它能够在1遍中编译程序,所有这些反向引用解析&预处理 - 使用yacc / lex绝对不可能。

我无法说服自己废弃所有这些,并开始深入研究yaxx / lex--这可能需要付出相当大的努力才能实现,并且可能会引入一些语法限制。

不使用yacc / lex时有什么我想念的吗?我做恶事吗?

5 个答案:

答案 0 :(得分:6)

使用任何类型的词法分析器/解析器生成器的主要优点是,如果您的语言发展,它将为您提供更大的灵活性。在一个手工编写的词法分析器/解析器中(特别是如果你在一次通过中混合了许多功能!),对语言的更改会很快变得讨厌,而使用解析器生成器进行更改,重新运行发电机,继续你的生活。当然只是手工编写所有内容,当然没有固有的技术限制,但我认为自动化无聊位的可演化性和可维护性是值得的!

答案 1 :(得分:4)

Yacc在某些方面缺乏灵活性:

  • 良好的错误处理很难(基本上,它的算法只定义为正确解析正确的字符串,否则,所有的投注都会关闭;这是GCC转移到手写解析器的原因之一)
  • 上下文依赖很难表达,而使用手写的递归下降解析器,你可以简单地向函数添加一个参数

此外,我注意到lex / yacc目标代码通常比手写的递归下降解析器更大(源代码往往相反)。

我没有使用过ANTLR所以我不能说在这些方面是否更好。

答案 2 :(得分:3)

使用生成器的另一个巨大优势是它们可以保证只处理您在语法中指定的语言。你不能说任何手写代码。 LR / LALR变体也保证是O(N),你再也不能断言任何手动编码,至少在构建证明时没有花费太多精力。

我已经写过并与两者同住,我再也不会手工编码了。我只做那个,因为当时平台上没有 yacc

答案 3 :(得分:1)

也许你错过了ANTLR,这对于可以使用递归下降解析策略定义的语言很有用。

使用Yacc / Lex可能有一些优势,但并非强制要求使用它们。使用Yacc / Lex也有一些缺点,但优点通常大于缺点。特别是,维护Yacc驱动的语法通常比手工编写的语法更容易,并且您可以从Yacc提供的自动化中受益。

然而,从头开始编写自己的解析器并不是一件坏事。它可能会使将来更难维护,但也可能使它更容易。

答案 4 :(得分:0)

这当然取决于语言语法的复杂程度。一个简单的语法意味着有一个简单的实现,你可以自己做。

看看可能是最糟糕的例子:C ++ :)(除了自然语言之外,还有其他语言更难解析吗?)即使使用像Antlr这样的工具,也很难获得它是对的,虽然它是可管理的。另一方面,即使在更难的情况下,似乎有一些最好的C ++解析器,例如GCC和LLVM也大多是手写的。

如果你不需要太多的灵活性而且你的语言不是太微不足道,那么使用Antlr肯定可以保证一些工作/时间。