如何在使用Flex和Bison生成c++头文件时使用m4



我有一个关于使用c++ m4宏的问题。我正试图编译别人的代码,并在一个头文件中有一行看起来像:

b4_copyright(C++ Skeleton parser for LALR(1) parsing with Bison, 2002, 2003)

当它试图编译代码时,当然会返回一个错误:

error: expected constructor, destructor, or type conversion before ‘(’ token

安装bison的c.m4文件中b4_copyright的定义为:

m4_define([b4_copyright],
[/* A Bison parser, made by GNU Bison b4_version.  */
/* $1
m4_text_wrap([Copyright (C) $2 Free Software Foundation, Inc.], [   ])
...
This special exception was added by the Free Software Foundation in
version 2.2 of Bison.  */])

我认为错误发生在头文件是由flex和bison生成。由于某些原因,当Bison遍历已解析的代码时,它没有像它应该的那样抑制m4宏的输出(在本例中是b4_copyright)。当它创建头文件时,它将保留它所运行的宏的标准输出中的行。它为什么要这么做?

根据c.m4文件(b4_copyright的定义是),输出应该被抑制。c.m4文件使用来自m4sugar的定义。M4也是。然而,这些定义似乎没有应用于c.m4文件中的任何地方,因为它没有使用m4_divert函数(在m4sugar.m4中定义)来抑制输出,就像我认为它应该的那样。

你的问题相当惊人:用户永远不应该暴露这些内部细节,即使你很努力!特别是,你可以用Flex做任何你想做的事情,Bison应该保持稳定:它永远不需要读取Flex文件。

所以真的,要么你的M4安装是错误的,或者有人玩了你的Bison骨架文件(这应该永远不会发生)。在任何其他情况下,它都是一个bug,应该报告给适当的列表(bug-bison at gnu.org)。

最新更新