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

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

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

Источник: opennet.ru

Добавить комментарий