无法使简单的flex示例工作

时间:2014-05-21 22:52:52

标签: 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();
}

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

%{
#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),如果重要的话......谢谢。

2 个答案:

答案 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
  1. 使用ll标志代替lf1

    g ++ lex.yy.cc -ll -o snazzle