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

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

当尝试编译代码时,这当然会返回错误:
error: expected constructor, destructor, or type conversion before ‘(’ token

野牛安装后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骨架文件(永远不会发生)。在任何其他情况下,这都是一个错误,应将其报告给正确的列表(位于gnu.org的bug-bison)。

10-07 23:39