我正在尝试关注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();
}
由于缺少主要的返回类型,首先给了我一个错误,因此将代码更改为:
%{
#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:警告:在C ++模式下将'c'输入视为'c ++'时,不推荐使用此行为 ld:找不到-lfl的库 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)
发生了什么事?我正在使用flex 2.5.35 Apple(flex-31)
,如果重要的话......谢谢。
答案 0 :(得分:2)
clang抱怨文件名是lex.yy。 c ,但是你用“g++
”编译它(如何成为clang++
,我不知道我知道,但这将与Apple分发的工具链有关;它可能是一个符号链接。)正如警告所说,这样做是弃用的。这些都与flex
无关。您可以告诉flex您要输出c ++文件:
flex -o lex.yy.cc snazzle.l
虽然就个人而言,我将输出文件命名为snazzlier,如snazzle.lex.cc
。无论你怎么命名,都应以.cc
结束,将其标记为C ++文件。或者您可以使用.cpp
或.cxx
或.c++
或其他一些我不记得的扩展程序。
第二个错误告诉您flex
库-lfl
未安装,或者至少没有安装在任何标准位置。我个人只是添加
%option noyywrap
到你的弹性输入。把它放在第%%
行之前。这告诉flex没有yywrap
函数,这反过来意味着当输入文件达到EOF时,它实际上是一个EOF。当输入命中EOF时调用yywrap
,允许更改输入文件并返回0,表示lex操作应该继续。显然,您不需要本教程的功能 - 它通常只是非常有用 - fl
库包含yywrap
的定义,它正是这样做的:
int yywrap() { return 1; }
您可以将其添加到您的文件中,但添加noyywrap
选项同样容易,在这种情况下生成的词法分析器根本不需要yywrap
函数。
答案 1 :(得分:0)
我遇到了同样的问题。
这是解决方案:
1.使用lex.yy.cc而不是lex.yy.c作为输出文件。
flex -o lex.yy.cc snazzle.l
使用ll标志代替lf1
g ++ lex.yy.cc -ll -o snazzle