麻烦得到简单的flex的例子工作

Trouble getting simple flex example to work

本文关键字:工作 flex 麻烦 简单      更新时间:2023-10-16

我试图遵循本教程,我目前卡在第一个代码片段:

%{
#include <iostream>
using namespace std;
#define YY_DECL extern "C" int yylex()
%}
%%
[ tn]         ;
[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()
%}
%%
[ tn]         ;
[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:在c++模式下将'c'输入处理为'c++',此行为已弃用没有找到-lfl的库Clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

怎么回事?我用的是flex 2.5.35 Apple(flex-31),如果重要的话…谢谢。

clang报错文件名是lex.yy。c但是你正在用"g++"编译它(怎么变成clang++,我不知道,但这将与苹果发布的工具链有关;这可能是个符号链接。)正如警告所说,这样做是不可取的。这些都与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。当输入到达EOF时调用yywrap,允许更改输入文件并返回0,表示lex操作应该继续。显然,本教程不需要这个特性——它只是偶尔有用,一般来说——fl库包含yywrap的定义,它精确地做到了这一点:

int yywrap() { return 1; }

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

我也遇到过同样的问题。

下面是解决方案:

1. 使用lex.yy.cc代替lex.yy.c作为输出文件。

flex -o lex.yy.cc snazzle.l
  • 使用ll标志代替lf1