1

我有一个关于使用 C++ m4 宏的问题。我正在尝试编译其他人的代码,并且在其中一个头文件中有一行如下所示:

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

这当然会在尝试编译代码时返回错误:

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

b4_copyright安装野牛的 c.m4 文件中的定义是:

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 中定义)来抑制输出,就像我认为的那样。

4

1 回答 1

2

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

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

于 2015-03-08T20:22:37.673 回答