В пятницу 2-го августа вышел релиз re2c — свободного генератора лексических анализаторов для языков C и C++. Напомним, что re2c был написан в 1993 году Питером Бамбулисом как экспериментальный генератор очень быстрых лексических анализаторов, отличающийся от других генераторов скоростью сгенерированного кода и необычно гибким пользовательским интерфейсом, который позволяет легко и эффективно встривать анализаторы в существующую кодовую базу. С тех пор проект развивается сообществом и продолжает оставаться площадкой для экспериментов и исследований в области формальных грамматик и конечных автоматов.
Основные новшества в версии 1.2:
Добавлен новый (упрощённый) способ проверки на конец входных данных
(англ. «EOF rule»).
Для этого добавлена конфигурация re2c:eof,
позволяющая выбрать терминальный символ,
и специальное правило $, которое срабатывает если лексер
успешно достиг конца входных данных.
Исторически re2c предоставляет на выбор несколько способов проверки на
конец входных данных, варьирующихся по ограниченности, эффективности и простоте
применения. Новый способ призван упростить написание кода, при этом
оставаясь эффективным и широко применимым. Старые способы
по-прежнему работают и могут быть предпочтительными в отдельных случаях.
Добавлена возможность включения внешних файлов с помощью директивы
/*!include:re2c "file.re" */, где file.re
это имя включаемго файла. Re2c ищет файлы в директории включащего файла,
а также в списке путей заданных с помощью опции -I.
Включённые файлы могут включать другие файлы.
Re2c предоставляет «стандартные» файлы в директории include/
проекта — предполагается, что там будут накапливаться полезные определения
регулярных выражений, что-то в духе стандартной библиотеки.
Пока что по просьбам трудящихся добавлен один файл с определениями категорий Unicode.
Добавлена возможность генерировать заголовочные файлы с произвольным
содержанием при помощи опций -t —type-header (или соответствующих
конфигураций) и новых директив /*!header:re2c:on*/ и
/*!header:re2c:off*/. Это может быть полезно в случаях,
когда re2c должен сгенерировать определения переменных, структур и макросов,
использующихся в других единицах трансляции.
Re2c теперь понимает UTF8-литералы и классы символов в регулярных выражениях.
По умолчанию, re2c парсит выражения вроде "∀x ∃y" как.
последовательность 1-битных ASCII-символов e2 88 80 78 20 e2 88 83 79
(hex-коды), и пользователям приходится экранировать Unicode-символы вручную:
"u2200x u2203y". Это очень неудобно и неожиданно для многих
пользователей (о чём свидетельствуют постоянные баг репорты). Поэтому теперь
re2c предоставляет опцию —input-encoding <ascii | utf8>,
которая позволяет изменить поведение и распарсить "∀x ∃y" как
2200 78 20 2203 79.
Re2c теперь позволяет использовать обычные re2c-блоки в режиме -r —reuse.
Это удобно, если входной файл содержит много блоков, и только часть из них
нуждается в повторном использовании.
Появилась возможность задавать формат предупреждений и сообщений об ошибках
с помощью новой опции —location-format <gnu | msvc>. GNU-формат отображается
как filename:line:column:, а MSVC-формат — как filename(line,column).
Эта возможность может пригодиться любителям IDE.
Также была добавлена опция —verbose, которая выводит краткое победоносное сообщение в случае успеха.
Был доработан режим «совместимости» с flex — исправлены некоторые ошибки разбора и
неправильный приоритет операторов в редких случаях.
Исторически опция -F —flex-support позволяет писать код
вперемешку в стиле flex и в стиле re2c, что немного затрудняет синтаксический разбор.
Режим совместимости с flex редко используется в новом коде,
но re2c продолжает поддерживать его для обратной совместимости.
Оператор вычитания символьных классов / теперь применяется
до разворачивания кодировки, что позволяет применять его в большем числе случаев,
если используется кодировка с переменной длиной символа (например UTF8).
Выходной файл теперь создаётся атомарно: re2c сначала создаёт временный файл
и пишет в него результат, а потом переименовывает временный файл в выходной
одной операцией.
С точки зрения разработчиков, re2c обзавёлся более полноценной подсистемой
отладки. Отладочный код теперь отключён в релизных сборках и
может быть включен с помощью configure-опции —enable-debug.
Этот релиз занял долгое время — почти целый год.
Большинство времени, как всегда, ушло на разработку теоретической базы и написание
статьи «Efficient POSIX Submatch Extraction on NFA».
Алгоритмы, описанные в статье, реализованы в экспериментальной библиотеке libre2c
(сборка библиотеки и бенчмарков выключена по умолчанию и включается configure-опцией
—enable-libs). Библиотека задумана не как конкурент уже существующим
проектам вроде RE2, а как исследовательская площадка для разработки новых
алгоритмов (которые потом могут использоваться в re2c или в других проектах).
Также это удобно с точки зрения тестирования, бенчмарков и создания биндингов к другим языкам.
Cпасибо от разработчиков re2c всем, кто помог этому релизу состояться,
и в целом сообществу за идеи, баг репорты, патчи, боевой дух и т.д. ;]