Выпуск генератора лексических анализаторов re2c 2.0

Состоялся релиз re2c 2.0, свободного генератора лексических анализаторов для языков C и C++. Проект re2c изначально был создан в 1993 году Питером Бамбулисом как экспериментальный генератор очень быстрых лексических анализаторов, отличающийся от других генераторов скоростью сгенерированного кода и необычно гибким пользовательским интерфейсом, который позволяет легко и эффективно встраивать анализаторы в существующую кодовую базу. С тех пор проект развивается сообществом и продолжает оставаться площадкой для экспериментов и исследований в области формальных грамматик и конечных автоматов.

Основные изменения:

  • Добавлена поддержка языка Go (включается или опцией »--lang go» для re2c, или в виде отдельной программы re2go). Документация для C и Go генерируется из одного и того же текста, но с разными примерами кода. Полностью переработана подсистема кодогенерации в re2c, что должно облегчить поддержку новых языков в будущем.
  • Добавлена альтернативная система сборки на CMake (спасибо ligfx!). Попытки перевести re2c на CMake предпринимались уже давно, но до ligfx никто не предложил полноценное решение. Старая система сборки на Autotools продолжает поддерживаться и использоваться, и в обозримом будущем нет планов от неё отказаться (отчасти чтобы не создавать проблем разработчикам дистрибутивов, отчасти потому что старая система сборки стабильнее и лаконичнее новой). Обе системы наравне непрерывно тестируются при помощи Travis CI.
  • Добавлена возможность задания интерфейсного кода в конфигурациях при использовании обобщённого API (generic API). Раньше большинство API приходилось задавать в форме функций или функциональных макросов. Теперь их можно задавать в форме произвольных строк с именованными шаблонными параметрами вида »@@{name}» или просто »@@» (если параметр один и не возникает неоднозначности). Стиль АПИ задаётся конфигурацией re2c: api: style (значение functions задаёт функциональный стиль, а free-form — произвольный).
  • Улучшена работа опции »-c»,»--start-conditions», позволяющей совмещать несколько взаимосвязанных лексеров в одном re2c-блоке. Теперь можно использовать обычные блоки наравне с условными и задавать несколько не связанных условных блоков в одном файле. Улучшена работа опции »-r»,»--reuse» (повторное использование кода из одного блока в других блоках) в сочетании с опциями »-c»,»--start-conditions» и »-f»,»--storable-state» (лексер с сохраняемым состоянием, который можно прервать в произвольном месте и продолжить выполнение позже).
  • Исправлена ошибка в недавно добавленном алгоритме обработки конца входных данных (EOF rule), приводившая в редких случаях к неправильной обработке перекрывающихся правил.
  • Упрощён процесс бутстрапа. Раньше система сборки пыталась динамически найти уже собранный re2c, который можно было бы использовать для пересборки самого себя. Это приводило к неправильным зависимостям (поскольку граф зависимостей получался динамическим, чего большинство систем сборки не любит). Теперь чтобы пересобрать лексеры, требуется в явном виде сконфигурировать систему сборки и задать переменную RE2C_FOR_BUILD.



Источник: http://www.opennet.ru/opennews/art.shtml? num=53408

© OpenNet