c++ - 无法使简单的 flex 示例正常工作

标签 c++ c flex-lexer

我正在尝试关注 this tutorial ,我目前停留在第一段代码上:

%{
#include <iostream>
using namespace std;
#define YY_DECL extern "C" int yylex()
%}
%%
[ \t\n]         ;
[0-9]+\.[0-9]+  { cout << "Found a floating-point number:" << yytext << endl; }
[0-9]+          { cout << "Found an integer:" << yytext << endl; }
[a-zA-Z0-9]+    { cout << "Found a string: " << yytext << endl; }
%%
main() {
    // lex through the input:
    yylex();
}

由于缺少 main 的返回类型,首先给了我一个错误,因此将代码更改为:

%{
#include <iostream>
using namespace std;
#define YY_DECL extern "C" int yylex()
%}
%%
[ \t\n]         ;
[0-9]+\.[0-9]+  { cout << "Found a floating-point number:" << yytext << endl; }
[0-9]+          { cout << "Found an integer:" << yytext << endl; }
[a-zA-Z0-9]+    { cout << "Found a string: " << yytext << endl; }
%%
int main() {
    // lex through the input:
    yylex();
    return 0;
}

运行:

flex snazzle.l

工作正常,但是当我进行下一步时:

g++ lex.yy.c -lfl -o snazzle

它说:

clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated ld: library not found for -lfl clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是怎么回事?我正在使用 flex 2.5.35 Apple(flex-31),如果有关系...谢谢。

最佳答案

clang 提示文件名是 lex.yy.c 但你正在用“g++”编译它(怎么会是 clang++,我不知道,但这与 Apple 分发的工具链有关;它可能是一个符号链接(symbolic link)。)正如警告所说,这样做是不推荐的。这些都与 flex 无关。你可以告诉 flex 你想要输出一个 c++ 文件:

flex -o lex.yy.cc snazzle.l

尽管就个人而言,我会将输出文件命名为更时髦的名称,例如 snazzle.lex.cc。无论你给它起什么名字,它都应该以 .cc 结尾,以将其标记为 C++ 文件。或者您可以使用 .cpp.cxx.c++ 或其他一些我不记得的扩展名。

第二个错误告诉您 flex-lfl 没有安装,或者至少没有安装在任何标准位置.而不是试图找到那个库,我个人只是添加

%option noyywrap

到你的弹性输入。把它放在第一个 %% 行之前。这告诉 flex 没有 yywrap 函数,这反过来意味着当输入文件到达 EOF 时,它实际上是一个 EOF。 yywrap 在输入到达 EOF 时调用,允许更改输入文件并返回 0,表示 lex 操作应该继续。显然,您不需要本教程的功能——一般来说,它只是偶尔有用——而且 fl 库包含一个 yywrap 的定义,它可以精确地完成这个:

int yywrap() { return 1; }

您可以将其添加到您的文件中,但添加 noyywrap 选项同样容易,在这种情况下生成的词法分析器将不需要 yywrap 函数完全没有。

关于c++ - 无法使简单的 flex 示例正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23795167/

相关文章:

c++ - 读取和写入结构的填充位

c++ - 从迭代器获取 const_iterator

c - 将 DLL 加载到用户定义的地址

c++ - Flex/Bison Markdown 到 HTML 程序

c - main() 之前的 flex/bison 段错误

c++ - lex 和 yacc 中的词法分析器没有输出

c++ - 有效编程 : How to use find_if without writing the actual predicate

c++ - 视频太快 FFmpeg

c - c中main函数中初始化的变量存储在哪里?

c - C99 中的 Variadic 函数可以释放多个数组?