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

我不希望使用%option 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的引用

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

最佳答案

我的简化列表示例是:

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中的外部“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

关于c++ - 如何将flex词法扫描器生成器用作程序的一部分?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5521892/

10-11 10:32