Состоялся (http://re2c.org/releases/release_notes.html) релиз re2c (http://re2c.org/), свободного генератора лексических анализаторов для языков C и C++. Напомним, что re2c был написан в 1993 году Питером Бамбулисом как экспеиментальный генератор очень быстрых лексических анализаторов, отличающийся от других генераторов скоростью сгенерированного кода и необычно гибким пользовательским интерфейсом, который позволяет легко и эффективно встривать анализаторы в существующую кодовую базу. С тех пор проект развивается сообществом и продолжает оставаться площадкой для экспериментов и исследований в области формальных грамматик и конечных автоматов.
Подготовка релиза заняла почти целый год. Большинство времени, как всегда, ушло на разработку теоретической базы и написание
статьи "Efficient POSIX Submatch Extraction on NFA (http://re2c.org/2019_borsotti_trofimovich_efficient_posix_su...)".
Алгоритмы, описанные в статье, реализованы в экспериментальной библиотеке libre2c
(сборка библиотеки и тестов производительности выключена по умолчанию и включается configure-опцией "--enable-libs"). Библиотека задумана не как конкурент уже существующим проектам, таким как RE2, а как исследовательская площадка для разработки новых
алгоритмов (которые потом могут использоваться в re2c или в других проектах). Также это удобно с точки зрения тестирования, измерения производительности и создания биндингов к другим языкам.
Основные новшества в версии re2c 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-suppor" позволяет писать код
вперемешку в стиле flex и в стиле re2c, что немного затрудняет синтаксический разбор.
Режим совместимости с flex редко используется в новом коде,
но re2c продолжает поддерживать его для обратной совместимости.
- Оператор вычитания символьных классов "/" теперь применяется
до разворачивания кодировки, что позволяет применять его в большем числе случаев,
если используется кодировка с переменной длиной символа (например UTF8).
- Выходной файл теперь создаётся атомарно: re2c сначала создаёт временный файл
и пишет в него результат, а потом переименовывает временный файл в выходной
одной операцией.
- Документация была дописана и переписана; в частности, были добавлены новые
главы про http://re2c.org/manual/manual.html#buffer-refilling заполнение буфера (http://re2c.org/manual/manual.html#buffer-refilling)
и про способы проверки на конец входных данных (http://re2c.org/manual/manual.html#eof-handling).
Новая документация собрана в виде
исчерпывающейго одностраничного руководства (http://re2c.org/manual/manual.html)
с примерами (одни и те же исходники отрисовываются в manpage и в онлайн-документацию).
Были предприняты слабые попытки улучшить читаемость сайта на телефонах.
- С точки зрения разработчиков, re2c обзавёлся более полноценной подсистемой
отладки. Отладочный код теперь отключён в релизных сборках и
может быть включен с помощью configure-опции "--enable-debug".
URL: http://re2c.org/releases/release_notes.html
Новость: https://www.opennet.dev/opennews/art.shtml?num=51209