我正在开发的软件库使用了大量的yacc,我不需要处理它.有时候我认为这有助于理解我发现的一些问题,但大部分时间我都可以完全忽略yacc.
我的问题是有足够的新项目仍然使用yacc保证我需要学习的时间吗?
编辑:鉴于响应主要是支持学习Yacc,是否有类似的语言,你会推荐yacc?
是的,如果您需要创建或修改解析语法的代码,这些工具值得学习.
多年来,用于生成解析语法的代码的事实上的工具是yacc,或者它的GNU表兄,野牛.
最近我听说块上有几个新孩子,但原理是一样的:你用Backus-Naur Form(BNF)和yacc/bison/中的一种或多或少的格式写一个声明性语法为您生成一些代码,手工编写将非常繁琐.
此外,即使您不需要直接处理此类代码,语法背后的原理也非常有用.自从在大学学习编译器设计课程以来,我没有使用解析器,但是理解运行时堆栈,前瞻解析器,表达式评估以及许多其他相关的东西帮助我极大地有效地编写和调试我的代码.
编辑:鉴于您对其他工具的后续问题,Yacc/Bison当然最适合C/C++项目,因为它们生成C代码.其他语言也有类似的工具.并非所有语法都是等价的,并且一些解析器生成器只能克服某种复杂性的语法.所以你可能需要找到一个可以解析你的语法的工具.请参见http://en.wikipedia.org/wiki/Comparison_of_parser_generators
我不知道使用它的新项目,但我参与了七个不同的维护工作,使用lex和yacc处理配置文件.
对我来说没有XML,没有先生:-).
使用lex/yacc的解决方案比key=val
线路的旧配置文件更进一步,因为它们允许更好的分层结构,如:
server = "mercury" { ip = "172.3.5.13" gateway = "172.3.5.1" } server = "venus" { ip = "172.3.5.21" gateway = "172.3.5.1" }
而且,是的,我知道你可以用XML做到这一点,但这些主要是用C语言编写的遗留应用程序,老实说,我也可能将lex/yacc用于新的(非Java)工作.
那是因为我更喜欢按时和按预算交付软件,而不是提供最好的新技术 - 我的客户不会为我的教育付费,他们首先要求结果,而且我已经是lex/yacc的专家并拥有所有快速完成的模板代码.