如何处理一个 .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。
我必须支持 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。