yacc/lex还是手工编码?

Bar*_*ter 8 yacc programming-languages

我正在研究新的编程语言,但我总是对每个人都使用yaxx/lex来解析代码感到困惑,但事实并非如此.

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

早些时候,我用同样的方式编写了一个C编译器(不是完整的规范) - 它能够在1遍中编译程序,所有这些反向引用解析和预处理 - 这对于yacc/lex来说绝对是不可能的.

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

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

Gia*_*ian 6

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

  • 良好的模块化设计(例如,令牌化器和词法分析器应该完全分离)可以减少这个问题.仍然很重要. (2认同)

jil*_*les 4

Yacc 在某些方面不灵活:

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

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

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