我正在尝试关注 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/