如何在一个.y文件中处理bison版本差异?

如何在一个.y文件中处理bison版本差异?,bison,incompatibility,Bison,Incompatibility,我必须支持bison版本3.0.4和3.4.2的系统 我在.y文件中使用了变量parser\u class\u name。3.4.2不再支持此选项 error: syntax error, unexpected string, expecting identifier 它的替代品是使用api.parser.class,但这不适用于3.0.4:(请参阅Bison 3.3中引入的:History:来替代parser\u class\u name。) 如何在.y文件中解决此问题?如果在bison的语

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

我在.y文件中使用了变量
parser\u class\u name
。3.4.2不再支持此选项

error: syntax error, unexpected string, expecting identifier
它的替代品是使用
api.parser.class
,但这不适用于3.0.4:(请参阅Bison 3.3中引入的:History:来替代parser\u class\u name。)


如何在.y文件中解决此问题?如果在bison的语法中有类似于
%If version<3.3
的东西?

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

Bison不提供任何有条件包含的设施

它确实提供了
%require
声明,该声明声明了一个最小的bison版本。这在这个案子上可能没什么用。(此外,它不允许指定版本范围,因此不能将语法限制为过时的bison版本。)

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


您可以基于bison版本对语法文件进行预处理。如果您正在使用自动工具,它可以帮助您实现这一点。但这可能有点过头了。

我看不出这里有什么问题:3.4.2确实支持
解析器\类\名称
。它已被弃用,因此请您选择
api.parser.class
,但它的支持尚未删除


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

为什么?你真的在分发源代码吗?是的,我真的在分发源代码。我解决了这个问题,完全删除了变量,并使用了默认名称
解析器
,而不是我的自定义名称。