如何将flex lexical scanner生成器用作程序的一部分?

时间:2011-04-02 07:39:40

标签: c++ c linux lex flex-lexer

如何使用我使用Flex编写的扫描仪作为我正在设计的程序的一部分?具体来说,在一个c ++类中作为一个类的方法,并从一个单独的文件中只用一个main方法来执行测试。

我不想使用%选项c ++,但会使用g ++进行编译。

要回答如何从单独的文件主要测试扫描仪的问题,我尝试使用以下代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

extern "C" {
    extern int yylex();
}

extern FILE* yyin;

int main(int argc, char *argv[]) {
    if (argc > 1)
        yyin = fopen(argv[1], "r");
    yylex();
    return 0;
}

我这样编译:

flex mylexer.l++
g++ lex.mylexer.C myDriver.C -o myLexer

我明白了:

对yyin的未定义引用

对yylex的未定义引用

编译/设置驱动程序文件的正确方法是什么? 感谢您阅读和贡献任何东西!

4 个答案:

答案 0 :(得分:8)

我所拥有的简单例子是:

mylex.l

%option noyywrap

%%

:       return ':';

%%

的main.cpp

#include <stdio.h>
#include <iostream>

extern "C"
{
    extern int yylex(void);
    extern FILE*   yyin;
}

int main()
{
    yyin    = fopen("plop", "r");
    std::cout << yylex() << "\n";
}

然后建立:

> flex -o mylex.c mylex.l
> gcc -c mylex.c
> g++ -c main.cpp
> g++ main.o mylex.o

注意gcc编译mylex.c
如果使用g ++编译mylex.c,它将被编译为C ++(而不是C),并且main中的extern“C”声明将是错误的。因此,您需要使用不同的编译器编译mylex.c和main.cpp,然后在不同的步骤中将它们链接在一起。

版本2:

或者,您可以将flex代码编译为C ++,并从main中删除extern“C”。

的main.cpp

#include <stdio.h>
#include <iostream>

extern int yylex(void);
extern FILE*   yyin;

int main()
{
    yyin    = fopen("plop", "r");
    std::cout << yylex() << "\n";
}

现在像这样构建:

> flex -o mylex.c mylex.l
> g++ -c mylex.c
> g++ -c main.cpp
> g++ main.o mylex.o

注意这次我使用g ++来编译mylex.c(你现在可以调用mylex.cpp)。

现在你使用的是同一个编译器,它可以是一个单行程序:

> flex -o mylex.c mylex.l
> g++ mylex.c main.cpp

答案 1 :(得分:2)

您必须将flex库与您的程序链接,也就是说,您必须将-lfl添加到您的g ++编译器调用中。

flex mylexer.l++
g++ lex.mylexer.C myDriver.C -o myLexer -lfl

答案 2 :(得分:0)

您需要在g ++命令行中包含flex生成的文件 - yyin和yylex都在那里定义。如果lex.mylexer.C应该是那个文件,你可能会得到一个你忽略的flex错误,或者没有正确运行flex来生成文件 - 检查它以确保它实际上包含flex输出并且不是空文件。

答案 3 :(得分:-2)

查看boost Spirit