Flex 仍然包括 FlexLexer.h 以及选项 noyywrap 和 nounistd

Flex still includes FlexLexer.h with options noyywrap and nounistd

即使使用 noyywrap 和 nounistd 选项,Flex 仍然包含 FlexLexer.h。我不知道为什么。 我在 Windows 上使用 Linux 子外壳来生成 flex,因此我没有这个 header 可用。

我们的构建过程基于 CMake,我不想以 FlexLexer header 的形式存在其他依赖项。奇怪的是,昨天我让它工作了,但我不知何故改变了一些东西,我不知道它是什么或为什么它不起作用。

灵活来源:

%option noyywrap nounistd c++ never-interactive outfile="Tokenizer.cpp"

%{
    int a = 0;
%} 

%%
"\n" {a++;}
%%

我的意思是它没有用,但它也会产生错误。

生成的代码 总是 添加行

#include <FlexLexer.h>

因此文件 FlexLexer.h 必须在您的 CMake 包含目录中的某处可用。通常你可以在 /usr/shared.

中找到它

由于您使用的是 c++,因此您可以查看 flexcpp,它不需要额外的包含文件,并且可以使用 CMake 轻松实现自动化。

FlexLexer.h 是 Fl​​ex C++ 的一部分 API;如果你想生成一个 OO 扫描器,它不能被抑制,因为它定义了扫描器的基础 class。如果您不小心使用了 C++ 接口,那么 header 将是您遇到的最少的问题。但是没有必要;在默认的 C 模式下,flex 生成一个可以用 C++ 编译的扫描器。如果你真的需要 C++ API,这与需要 C++ 环境的扫描仪不同,那么你将需要那个文件,你会在 flex 安装中找到它,甚至在 Windows .

None与yywrap有关系。您可能正在考虑对 libfl 的依赖,如果您使用 %option noyywrap,这将变得不必要。 (如果您需要 yywrap 功能,libfl 将无济于事;它只是提供 yywrap 的默认实现,可有效禁用该功能。)