如何处理一个 .y 文件中的野牛版本差异?

How to handle bison version differences in one .y-file?

我必须支持 bison 版本 3.0.4 和 3.4.2 附带的系统。

我在 .y 文件中使用了变量 parser_class_name。 3.4.2 不再支持这个。

error: syntax error, unexpected string, expecting identifier

它的替代方法是使用 api.parser.class,但这不适用于 3.0.4:(请参阅 changelog历史:在 Bison 3.3 中引入以替换 parser_class_name.)

如何解决 .y 文件中的这个问题?如果 bison 的语法中有类似 %if version < 3.3 的东西?

没有可以在语法文件中实现的解决方案。对不起。

Bison 不提供任何有条件包含的工具。

它确实提供了 %require 声明,该声明声明了最低野牛版本。在这种情况下,这可能用处不大。 (此外,它不允许指定版本范围,因此您不能将语法限制为过时的 bison 版本。)

据我所知,通常的策略是在发行版中也包含生成的解析器,这允许您的项目在具有不兼容的 bison 版本甚至根本没有 bison 的系统上编译。如果出于某种原因,最终用户希望重新生成解析器,则他们有责任获取正确的版本,这当然应该记录在构建说明中。

您可以根据野牛版本预处理语法文件。如果您正在使用 Autotools,它们可以帮助您。但这可能有点矫枉过正。

我没有看到这里的问题:3.4.2 确实支持 parser_class_name。它已被弃用,因此邀请您选择 api.parser.class,但尚未取消对它的支持。

但是@rici 是对的:在 Bison 的典型用途中,维护者 使用现代版本来生成和发布解析器。因此 用户 不依赖于 Bison,这反过来又使开发人员不必支持多个版本的 Bison。