Проблема с получением простого гибкого примера для работы

0

Я пытаюсь следовать этому руководству, и в настоящее время я придерживаюсь первого фрагмента кода:

%{
#include <iostream>
using namespace std;
#define YY_DECL extern "C" int yylex()
%}
%%
[ \t\n]         ;
[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()
%}
%%
[ \t\n]         ;
[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++, это поведение устарело ld: библиотека не найдена для -lfl clang: ошибка: команда компоновщика завершилась с кодом выхода 1 (используйте -v ], чтобы увидеть вызов)

Что происходит? Я использую flex 2.5.35 Apple(flex-31), если это имеет значение... Спасибо.

  • 0
    Вы должны сказать flex для генерации C ++, я думаю, что опция -+ . Однако, пытаясь запустить вашу студентку, я получаю другие ошибки. Извините, это не полный ответ. Удачи.
  • 0
    То же самое и здесь, но спасибо за предложение.
Теги:
flex-lexer

2 ответа

2
Лучший ответ

clang жалуется, что имя файла - lex.yy. c, но вы компилируете его с помощью " g++ " (как это становится clang++, я не знаю, но это будет иметь отношение к clang++ инструментов, который Apple распространяет, это, вероятно, символическая ссылка). Выполнение этого как говорится в предупреждении, устарел. Ничто из этого не имеет ничего общего с flex. Вы можете сказать flex, что вы хотите вывести файл c++:

flex -o lex.yy.cc snazzle.l

Хотя лично, я бы назвал выходной файл чем-то ослепительным, например snazzle.lex.cc. Что бы вы ни называли это, он должен заканчиваться на .cc чтобы пометить его как файл c++. Или вы можете использовать .cpp или .cxx или .c++ или некоторые другие расширения, которые я не помню.

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

%option noyywrap

к вашему входу flex. Поместите его прямо перед первой %%. Это говорит flex, что нет функции yywrap, которая по очереди означает, что когда входной файл достигает EOF, это действительно EOF. yywrap вызывается, когда вход попадает в EOF, и ему разрешено изменять входные файлы и возвращать 0, указывая, что операция lex должна продолжаться. Очевидно, что вам не нужна эта функция для этого урока - это очень полезно иногда, в общем, - и fl библиотека включает в себя определение yywrap которое делает именно это:

int yywrap() { return 1; }

Вы можете добавить это в свой файл вместо этого, но так же легко добавить опцию noyywrap, и в этом случае сгенерированный лексер вообще не понадобится функция yywrap.

  • 0
    Установка %option noyywrap и выполнение flex snazzle.l последующим g++ lex.yy.c -o snazzle похоже, сделали g++ lex.yy.c -o snazzle дело. Спасибо за помощь (хотя, похоже, проблема не в g ++)!
  • 0
    @anon: сообщение о c ++ - всего лишь предупреждение. Сейчас. Но вы должны привыкнуть правильно называть файлы c и c ++. Рад, что это сработало для вас.
Показать ещё 3 комментария
0

Я столкнулся с такой же проблемой.

Вот решение:

1. Используя lex.yy.cc вместо lex.yy.c в качестве выходного файла.

flex -o lex.yy.cc snazzle.l
  1. Использование ll flag вместо lf1

    g++ lex.yy.cc -ll -о ослепительно

Ещё вопросы

Сообщество Overcoder
Наверх
Меню