19

我正在开发的软件库使用了大量我不需要处理的 yacc。有时我认为这有助于理解我发现的一些问题,但大多数时候我可以摆脱对 yacc 的完全无知。

我的问题是有足够的新项目仍然使用 yacc 来保证我需要学习它的时间吗?

编辑:鉴于响应主要是支持学习 Yacc,是否有类似的语言可以推荐给 yacc?

4

8 回答 8

32

是的,如果您需要创建或修改解析语法的代码,这些工具值得学习。

多年来,用于生成代码以解析语法的事实上的工具是 yacc,或者它的 GNU 表亲,bison。

最近我听说这个街区有几个新孩子,但原则是一样的:你以或多或少的巴科斯-瑙尔格式 ( BNF ) 和 yacc/bison/whatever格式编写声明性语法为您生成一些手工编写非常乏味的代码。

此外,即使您不需要直接处理此类代码,语法背后的原理也非常有用。自从在大学学习编译器设计课程以来,我并没有过多地使用解析器,但是了解运行时堆栈、前瞻解析器、表达式评估和许多其他相关的东西极大地帮助了我有效地编写和调试我的代码。

编辑:鉴于您对其他工具的后续问题,Yacc/Bison 当然最适合 C/C++ 项目,因为它们生成 C 代码。其他语言也有类似的工具。并不是所有的语法都是等价的,一些解析器生成器只能理解一定复杂度的语法。所以你可能需要找到一个可以解析你的语法的工具。见http://en.wikipedia.org/wiki/Comparison_of_parser_generators

于 2008-12-02T01:13:13.227 回答
6

我不知道使用它的新项目,但我参与了七个使用 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 方面的专家,并且拥有一切快速执行此操作的模板代码。

于 2008-12-02T01:13:47.907 回答
3

一般的经验法则:代码会持续很长时间,因此代码中使用的技术也会持续很长时间。替换您提到的代码库需要大量时间(构建它需要 15 年......),这反过来意味着它仍将在 5、10 或更长时间后出现。(甚至有可能阅读此答案的人最终会继续努力!)

另一个经验法则:如果一种通用技术足够普遍以至于您已经遇到过它,那么它可能已经足够普遍以至于您应该熟悉它,因为有一天您会再次看到它。谁知道:通过熟悉它,也许你在你的工具箱中添加了一个有用的工具......

Yacc 是这些技术之一:您可能会再次遇到它,它并不难,而且您将学习的原理适用于整个解析器构造函数家族。

于 2008-12-02T01:38:57.637 回答
3

PEGs are the new hotness, but there are still a ton of projects that use yacc or tools more modern than yacc. I would frown on a new project that chose to use yacc, but for existing projects porting to a more modern tool may not make sense. This makes having rough familiarity with yacc a useful skill.

如果您完全不熟悉解析器生成器的主题,我鼓励您学习任何一种。许多概念在它们之间是可移植的。此外,它是一个有用的工具:一旦你了解了一个工具,你就会明白与正则表达式繁重的手写解析器相比,它们通常是如何优越的。如果您已经对解析器的主题感到满意,那么我不会担心。您将在需要时学习 yacc 以完成某事。

于 2008-12-02T10:32:31.430 回答
2

我从事使用 Yacc 的项目。不是新代码 - 但如果它们是新代码,它们仍然会使用 Yacc 或近亲(Bison、Byacc、...)。

是的,如果你在 C 中工作,我认为它值得学习。

还可以考虑学习 ANTLR 或其他更现代的解析器生成器。但是 Yacc 的知识对你很有帮助——它也会帮助你学习任何其他类似的工具,因为很多基本理论都是相似的。

于 2008-12-02T01:18:24.590 回答
2

我不具体了解 yacc/bison,但我使用过 antlr、cup、jlex 和 javacc。我认为它们只会具有学术重要性,但事实证明我们需要一种特定于领域的语言,这为我们提供了比一些“更简单”(基于正则表达式)解析器更好的解决方案。但是,在许多环境中,维护可能是一个问题——因为现在大多数编码人员都没有任何解析工具的经验。

于 2008-12-02T02:04:53.093 回答
2

我没有机会将它与其他解析系统进行比较,但我绝对可以根据我自己的经验以及它庞大而活跃的用户群推荐ANTLR 。

Another plus point for ANTLR is ANTLRWorks: The ANTLR GUI Development Environment which is a great help while developing and debugging your grammars. I've yet to see another parsing system which is supported by such an IDE.

于 2008-12-02T02:21:47.880 回答
1

我们正在我的公司编写新的 yacc 代码来运送产品。是的,这个东西还在用。

于 2010-02-09T04:04:16.903 回答