Во вторник, 19 ноября, представлен релиз re2c – генератора лексических анализаторов (он же компилятор регулярных выражений в код на целевом языке программирования). re2c специализируется на генерации быстрых и легко встраиваемых лексеров. Он отличается от более известного аналога flex гибким интерфейсом, генерацией оптимизированных нетабличных лексеров и поддержкой захватов (submatch extraction) на основе детерминированных конечных автоматов с тэгами (TDFA). re2c используется в проектах, где важна скорость работы лексера, например в Ninja и в PHP.
В релизе 4.0 коренным образом была переработана подсистема генерации кода, что позволило добавить поддержку восьми новых языков (D, Haskell, Java, JavaScript, OCaml, Python, V, Zig) в дополнение к уже поддерживаемым (C/C++, Go, Rust), а также общий механизм добавления новых языков через конфигурационные файлы. Кодогенератор отвечает за трансляцию уже построенного и оптимизированного конечного автомата в код, то есть его задача – выбрать подходящие для целевого языка управляющие конструкции, типы данных, общую модель программы и т.д. Ранее вся эта логика была частью исходного кода re2c, и чтобы изменить её или добавить новый язык, приходилось патчить исходный код и пересобирать re2c. Подобные патчи не принимались в основной репозиторий без реализации стандартного набора примеров и тестов, что дополнительно усложняло весь процесс. Теперь вся эта логика перенесена в синтаксические файлы – текстовые конфигурационные файлы, которые могут быть предоставлены пользователем (по умолчанию re2c использует стандартные). Исходный код re2c полностью свободен от деталей конкретного языка и полагается только на синтаксический файл. Пользователь может частично переопределить существующий синтаксический файл или написать новый с нуля. Для всех официально поддерживаемых языков есть полная документация с примерами.
Кстати, сама идея синтакcических файлов возникла благодаря одному комментарию на ЛОРе, за что спасибо the_coder.
В релиз вошло много других изменений по упрощению пользовательского интерфейса, улучшению работы с захватывающими группами (capturing groups), а также была добавлена онлайн-среда для редактирования и компиляции примеров: http://re2c.org/playground.
>>> Подробности