LINUX.ORG.RU

re2c 4.0

 , , , ,


3

2

Во вторник, 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.

>>> Подробности



Проверено: CrX ()
Последнее исправление: hobbit (всего исправлений: 6)
Ответ на: комментарий от dataman

Case ranges да, опция –case-ranges (для С/C++ бэкенда). Вот пример.

Насчёт стандарта Юникода сходу не скажу, он include/unicode_categories.re перегенеривался последний раз давновато, пару лет назад, и какой тогда был стандарт в хаскельном Data.Charset, из которого он генерится, я не знаю. Есть незакрытый баг, и ещё заброшенный проект https://github.com/NickStrupat/re2c-unicode-categories. У меня пока руки не дошли. Вроде бы был какой-то текстовый файл-первоисточник с категориями с официального сайта, чтобы не полагаться на библиотеки других языков, но не могу сходу найти. Если приведёте ссылку на него – буду благодарна.

skvadrik
() автор топика
Ответ на: комментарий от skvadrik

файл-первоисточник с категориями с официального сайта

Во многих проектах используется https://unicode.org/Public/UCD/latest/ucd/extracted/DerivedGeneralCategory.txt.
Но в нём нет некоторых диапазонов, L, например.
Поэтому парсят https://unicode.org/Public/UCD/latest/ucd/UnicodeData.txt.

dataman ★★★★★
()
Ответ на: комментарий от dataman

обычное дело для формальных статей писать о «нас» вместо «меня», даже если коллектив состоит из одного автора

seiken ★★★★★
()

Блин...пошли по стопам Питона - пробел имеет значение «space live matters» блджат.

/*!re2c
*/
/*! re2c
*/
/* !re2c
*/

это 3 (ТРИ!) разные разницы, нечаенный пробел доставит немало матюгов при сборке, и никаким валидатором он не поймается

MKuznetsov ★★★★★
()

У вас там даже примеры не работают:

# re2c -o etc_passwd.c parse_etc_passwd.re
parse_etc_passwd.re:16:8: error: unrecognized configuration 'YYCTYPE'

Хорошо, поправил. Далее:

# gcc -Wall etc_passwd.c
etc_passwd.c: In function ‘lex’:
etc_passwd.c:207:9: error: ‘n’ undeclared (first use in this function)
  207 |         n = yyt1;
      |         ^
etc_passwd.c:207:9: note: each undeclared identifier is reported only once for each function it appears in
etc_passwd.c:208:9: error: ‘p’ undeclared (first use in this function)
...
arto ★★
()
Ответ на: комментарий от arto

Пример-то работает: playground (они все тестируются в автоматическом режиме на каждый коммит), проблема в том что он работает на re2c-4.0. Я обычно новые возможности в примерах использую, чтобы люди о них знали. На этот раз это просто короткие псевдонимы конфигураций, наверное стоит откатить на старые, пока мир не обновился. Спасибо, что обратили внимание.

skvadrik
() автор топика
Ответ на: комментарий от arto

Не, с обратной всё в порядке: старый код на новом re2c не поломается. Вот наоборот не гарантировано (обычно новые фичи под флагом, но в этом случае добавлять флаг для нескольких алиасов конфигураций как-то странно).

skvadrik
() автор топика
Ответ на: комментарий от MKuznetsov

Можно было бы кидать ошибку или предупреждение на такое, но вообще-то это фича – одним пробелом блок превращается в коммент, по крайней мере я видела примеры такого использования. И это было с основания re2c в далёком 1993-м, тогда ещё питон не был в моде.

skvadrik
() автор топика

Большое спасибо за шикарный релиз шикарной и очень полезной программы. Постоянно использую. Рад что моё предложение было одобрено

the_coder ★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.