Как я могу использовать генератор лексического сканера Flex как часть моей программы? - PullRequest
5 голосов
/ 02 апреля 2011

Как я могу использовать сканер, написанный с использованием Flex , как часть программы, которую я разрабатываю?В частности, внутри класса c ++ как метода класса и из отдельного файла только с основным методом для выполнения тестирования.

Я не хочу использовать опцию% 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 ]

8 голосов
/ 03 апреля 2011

Простейший пример, который у меня есть:

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
Если вы скомпилируете mylex.c с помощью g ++, он будет скомпилирован как C ++ (не C), и ваши внешние объявления "C" в main будут неправильными. Таким образом, вам нужно скомпилировать mylex.c и main.cpp с разными компиляторами, а затем связать их вместе в отдельных шагах.

Версия 2:

В качестве альтернативы вы можете скомпилировать гибкий код как C ++ и удалить внешний "C" из main.

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
2 голосов
/ 02 апреля 2011

Вы должны связать библиотеку flex с вашей программой, то есть вы должны добавить -lfl к вашему вызову компилятора g ++.

flex mylexer.l++
g++ lex.mylexer.C myDriver.C -o myLexer -lfl
0 голосов
/ 02 апреля 2011

Вам необходимо включить файл, сгенерированный flex, в вашу командную строку g ++ - там определены и yyin, и yylex.Если предполагается, что этим файлом является файл lex.mylexer.C, возможно, вы получаете ошибку flex, которую игнорируете, или иначе не запускаете flex для генерации файла - проверьте его, чтобы убедиться, что он действительно содержитгибкий вывод и не пустой файл.

0 голосов
/ 02 апреля 2011
...