mco*_*ley 5 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;
}
Run Code Online (Sandbox Code Playgroud)
我这样编译:
flex mylexer.l++
g++ lex.mylexer.C myDriver.C -o myLexer
Run Code Online (Sandbox Code Playgroud)
我明白了:
对yyin的未定义引用
对yylex的未定义引用
编译/设置驱动程序文件的正确方法是什么?感谢您阅读和贡献任何东西!
我的简单例子是:
%option noyywrap
%%
: return ':';
%%
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>
#include <iostream>
extern "C"
{
extern int yylex(void);
extern FILE* yyin;
}
int main()
{
yyin = fopen("plop", "r");
std::cout << yylex() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
然后建立:
> flex -o mylex.c mylex.l
> gcc -c mylex.c
> g++ -c main.cpp
> g++ main.o mylex.o
Run Code Online (Sandbox Code Playgroud)
注意GCC编译mylex.c
如果您编译使用g ++ mylex.c将在主要被编译成C++(不是C)和你的extern"C"的声明是错误的.因此,您需要使用不同的编译器编译mylex.c和main.cpp,然后在单独的步骤中将它们链接在一起.
或者,您可以将flex代码编译为C++,并从main中删除extern"C".
#include <stdio.h>
#include <iostream>
extern int yylex(void);
extern FILE* yyin;
int main()
{
yyin = fopen("plop", "r");
std::cout << yylex() << "\n";
}
Run Code Online (Sandbox Code Playgroud)
现在构建如下:
> flex -o mylex.c mylex.l
> g++ -c mylex.c
> g++ -c main.cpp
> g++ main.o mylex.o
Run Code Online (Sandbox Code Playgroud)
注意这次我使用g ++来编译mylex.c(你现在可以调用mylex.cpp).
现在你使用相同的编译器,它可以是一个单行:
> flex -o mylex.c mylex.l
> g++ mylex.c main.cpp
Run Code Online (Sandbox Code Playgroud)