Я пытаюсь следовать этому руководству, и в настоящее время я придерживаюсь первого фрагмента кода:
%{
#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)
, если это имеет значение... Спасибо.
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
.
%option noyywrap
и выполнение flex snazzle.l
последующим g++ lex.yy.c -o snazzle
похоже, сделали g++ lex.yy.c -o snazzle
дело. Спасибо за помощь (хотя, похоже, проблема не в g ++)!
Я столкнулся с такой же проблемой.
Вот решение:
1. Используя lex.yy.cc вместо lex.yy.c в качестве выходного файла.
flex -o lex.yy.cc snazzle.l
Использование ll flag вместо lf1
g++ lex.yy.cc -ll -о ослепительно
flex
для генерации C ++, я думаю, что опция-+
. Однако, пытаясь запустить вашу студентку, я получаю другие ошибки. Извините, это не полный ответ. Удачи.