如何使用Flex和Bison生成C ++头文件时使用m4?

时间:2013-06-03 16:18:31

标签: c++ bison flex-lexer 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中定义)来抑制输出,就像我认为的那样。

1 个答案:

答案 0 :(得分:2)

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

实际上,要么你的M4安装错了,要么就是有人用你的Bison骨架文件(这应该永远不会发生)。在任何其他情况下,它都是一个错误,应该报告给正确的列表(gnu.org上的bug-bison)。