В пятницу 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 сначала создаёт временный файл и пишет в него результат, а потом переименовывает временный файл в выходной одной операцией.
-
Документация была дописана и переписана; в частности, были добавлены новые главы про заполнение буфера и про способы проверки на конец входных данных. Новая документация собрана в виде исчерпывающейго одностраничного мануала с примерами (одни и те же исходники отрисовываются в manpage и в онлайн-документацию). Были предприняты слабые попытки улучшить читаемость сайта на телефонах.
-
С точки зрения разработчиков, re2c обзавёлся более полноценной подсистемой отладки. Отладочный код теперь отключён в релизных сборках и может быть включен с помощью configure-опции
--enable-debug
.
Этот релиз занял долгое время — почти целый год.
Большинство времени, как всегда, ушло на разработку теоретической базы и написание
статьи «Efficient POSIX Submatch Extraction on NFA».
Алгоритмы, описанные в статье, реализованы в экспериментальной библиотеке libre2c
(сборка библиотеки и бенчмарков выключена по умолчанию и включается configure-опцией
--enable-libs
). Библиотека задумана не как конкурент уже существующим
проектам вроде RE2, а как исследовательская площадка для разработки новых
алгоритмов (которые потом могут использоваться в re2c или в других проектах).
Также это удобно с точки зрения тестирования, бенчмарков и создания биндингов к другим языкам.
Cпасибо от разработчиков re2c всем, кто помог этому релизу состояться, и в целом сообществу за идеи, баг репорты, патчи, боевой дух и т.д. ;]
>>> Подробности