Миграция flex 2.5.4a до 2.6 (генератор лексического анализатора)

У меня есть файл, который генерирует код cc, используя flex. Когда я использую версию 2.5.4a-10, коды работают как положено.

Если я использую более свежую версию 2.5.37 или даже более новую, например 2.6, сгенерированный код, похоже, ничего не выделяет. Он использует некоторые указатели, определенные с помощью nullptr и аварийно завершает работу.

Я думаю, что синтаксис изменился между этими версиями. Мне также кажется странным, что в Debian / Ubuntu есть пакет с именем flex-old:

flex — это инструмент для создания сканеров: программы, которые распознают лексические
шаблоны в тексте. Это старая версия 2.5.4a, которой больше нет
разрабатывается. Обычно вы должны выбрать flex, если у вас нет
устаревшие файлы лексера, которые не работают с современным flex.

Этот продукт включает программное обеспечение, разработанное Калифорнийским университетом,
Беркли и его участники. Исходный код можно найти по адресу
http://flex.sourceforge.net/

(Примечание редактора: Flex переехал в Github но v2.5.4a там нет.)

Эта версия, кажется, имеет большое значение для других, я подозреваю. Как добраться до моего вопроса:

Есть ли какое-либо руководство или руководство о том, что мне нужно сделать, чтобы портировать этот код для генерации некоторого кода на C ++, который работает в более поздних версиях flex?

РЕДАКТИРОВАТЬ: Вот мой простой пример, взятый из чего-то большего:

    int num_lines = 0, num_chars = 0;

%%
\n      ++num_lines; ++num_chars;
.       ++num_chars;

%%
int main()
{
yy_init=1;

yylex();
printf( "# of lines = %d, # of chars = %d\n",
num_lines, num_chars );
return 0;
}

согните это с flex file.l и построить его с gcc lex.yy.c -lfl, Теперь, если вы использовали версию 2.5.4, она будет работать. В более поздних версиях он прекрасно транслируется и компилируется, но при запуске программы вы получите ошибку сегментации.

-1

Решение

Я сам нашел проблему. Переменная yy_init может быть явно установлен в этой старой версии. В новых версиях это не разрешено. Я не уверен, что это задумано, может быть, кто-то может объяснить, почему это поведение наблюдается. Я нахожу это немного странным.

Если у кого-то есть подобная проблема, вы можете посмотреть на yy_init переменная. Кроме этого у меня не было проблем.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]