LINUX.ORG.RU

re2c 3.0

 , , , ,


5

3

В четверг 27 января состоялся релиз генератора лексических анализаторов re2c 3.0. Основное изменение — добавлена кодогенерация в Rust.

Напомним, что re2c специализируется на генерации быстрых и легко встраиваемых лексеров. Он отличается от более известного аналога flex гибким интерфейсом, генерацией оптимизированных нетабличных лексеров и поддержкой захватов (submatch extraction) на основе детерминированных конечных автоматов с тэгами (TDFA). re2c используется в проектах, где важна скорость работы лексера, например в Ninja и в PHP.

На сайте есть много примеров, теперь и на языке Rust.

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



Проверено: hobbit ()

Какие преимущества данного решения перед нативными для раста? Если в случае Си всё очевидно, то раст намного более приспособлен для кодирования лексера прямо в нём.

unC0Rr ★★★★★ ()

Ждём кодогенерации в javascript, очень нужно

anonymous ()
Ответ на: комментарий от unC0Rr

вы хоть раз сами то писали лексер? Наблюдается какое-то катастрофическое отсутствие понимания проблематики в этой области

anonymous ()

Спасибо за релиз!

С нетерпением ждём ебилдов (и, пользуясь случаем, передаём привет Серёже =)).

anonymous ()
Ответ на: комментарий от unC0Rr

Как минимум преимущество в том, что это солидный проект, в котором уже всё давно реализовано и протестировано кучей других солидных проектов. А кодогенерация - штука относительно простая. Т.е. ты берёшь этот re2c и уверен, что через 10 лет у него будут выходит новые версии. А когда ты берёшь какую-то мелкую библиотеку, которую написал какой-нибудь школотрон в качестве своей дипломной работы, ты можешь быть уверен, что он её забросит как только устроится на копирование байтов из жсона в протобуф.

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

Пусть попросит доступ к gcc сfarm - они хорошие люди, и у них много интересных машин. Не могу на блоге откаментить, там регистрация нужна. Привет!

anonymous ()

используется в проектах, где важна скорость работы лексера, например в Ninja и в PHP.

Полезная вещь. И где кстати инфу про Ninja и PHP узнали? Или просто в исходниках подглядели? Ссылочка бы пригодилась.

P. S. Что-то сразу не нашёл. Всё было в конце PDF.

Dr64h ()
Последнее исправление: Dr64h (всего исправлений: 1)

Он отличается от более известного аналога flex гибким интерфейсом

А в чём заключается гибкость интерфейса?

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

Они сильно упрощают жизнь с парсингом и анализом синтаксиса несложных языков (в основном сценарных), на подобии Make, Ninja, HTML... Но скажем для такого языка как C++, такие штуки не годятся от слова совсем.

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

Но скажем для такого языка как C++, такие штуки не годятся от слова совсем.

Тем не менее, SQL в том же SQLite парсится их lemon'ом вполне на ура.

DarkAmateur ★★★ ()
Последнее исправление: DarkAmateur (всего исправлений: 1)
Ответ на: комментарий от anonymous

Например для интеграции в продвинутый редактор с подсветкой синтаксиса и подсказками, или в IDE с отладчиками.

Dr64h ()
Ответ на: комментарий от DarkAmateur

Возможно там не столь сложный синтаксис, я с SQL не работал, ничего про него сказать не могу. Но вот GCC-шники когда пытались Си парсить через bison и flex, не осилил. Слишком сложно и работает медленно. Для такого языка проще самописный анализатор написать, что собственно они и сделали.

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

С разморозкой меня. Жаль, сообщество gentoo утратило ещё одного адекватного мэйнтейнера.

Ну что же, огромная благодарность ему за всё сделанное и удачи с NixOS. =)

anonymous ()
Ответ на: комментарий от hobbit

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

Ещё re2с не подразумевает конкретной формы входных данных: это может быть нуль-терминированная строка, буфер, файл, возможно даже несколько отдельных буферов. Можно делать совсем легковесные лексеры, которые ничего не копируют и не тратят времени на проверки выхода за границу, а можно обрабатывать большие данные (тут подробнее) или данные, которые поступают частями (например через сокет).

re2c позволяет делать много лексеров в одном файле (связанных между собой или нет), включать другие .re файлы, выносить код в другой файл. Одни и те же блоки можно использовать повторно, возможно с новыми конфигурациями, и комбинировать.

У гибкости есть обратная сторона — программисту надо немного разбираться в том, что такое лексер и как он работает, чтобы максимально эффективно определить базовые операции. Не все это любят. Но стандартные примеры помогают.

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

Ну, к примеру… как бы вы реализовали утилиту file? :)

Мне лично re2c пригодился для анализа малварных сэмплов, а потом для лексера в эмуляторе JS. Кто-то парсит HTTP заголовки, кто-то JSON разбирает, из сокета люди пакеты читают и парсят. Лексический анализ языков программирования — это стандартное. Какой-нибудь парсер логов. В общем, подойдёт везде, где структура данных описывается регулярной грамматикой.

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

(и, пользуясь случаем, передаём привет Серёже =)).

Его вообще-то Алеша зовут

Владимир

anonymous ()
Ответ на: комментарий от Legioner

это солидный проект, в котором уже всё давно реализовано и протестировано кучей других солидных проектов

Звучит солидно

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

Наблюдается какое-то катастрофическое отсутствие понимания проблематики в этой области

Я вот не понимаю, зачем нужен лексер. И как его применять. Объясни, пожалуйста :-)

MittenShmitten ()
Ответ на: комментарий от Dr64h

По-моему везде лучше «самописный», интегрированный в код дальнейшей обработки распарсенного. В этом нет ничего сложного, и в отличие от какого-то «универсального» парсера нет никаких глупых ограничений на функционал.

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

Это просто умное слово для синтаксического парсера. Соответственно нужен если ты хочешь распарсить входные данные с каким-то известным синтаксисом на синтаксические единицы.

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

Т.е. ты берёшь этот re2c и уверен, что через 10 лет у него будут выходит новые версии

То есть за 10 лет они так и не осилят довести примитивную задачу парсинга до логического завершения, ясно.

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

Почему я должен быть более уверен в этом проекте, чем к примеру в школотронском растовом nom?

unC0Rr ★★★★★ ()
Последнее исправление: unC0Rr (всего исправлений: 1)

Большое спасибо вам за релиз. Часто использую в работе. Если бы можно было бы сделать генерный фронт-энд (типа что бы сам мог генерировать лексер для языков которые не поддерживаются - например для Java) вообще было бы шикарно

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

Нет такого понятия, как логически завершенная программа. Есть мёртвый проект или живой проект.

Такие программы как tex, qmail, kill, pwgen, cat, cut, hexedit мёртвые или живые?

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

Спасибо. Можно подробнее про фронтенд? Как я понимаю, идея в том, чтобы программист мог выбирать одну из предопределённых моделей генерации кода (вроде goto с метками или switch в цикле) и настраивать всякие мелочи типа ключевых слов, наличия точек с запятой или скобок в if. Мысль интересная, только надо продумать, что абстрагировать, чтобы побольше языкоа вписалось в эти рамки.

А для конкретно для Java, наверное, совсем немного надо (теперь, когда есть опция --loop-switch и от языка не требуется наличие goto). Можно и полноценный бэкенд запилить.

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

tex

Stable release 3.141592653 / February 2021; 11 months ago

Живо.

qmail

Оригинальная программа сдохла, есть два живых форка.

kill, cat, cut

GNU Core Utilities, Stable release 9.0 24 September 2021; 4 months ago

Живое, если речь о core utils.

hexedit

Не слышал про такую программу.

pwgen

https://github.com/tytso/pwgen 1459a31 on Sep 3, 2019

Немного шевелится.

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

Я так понимаю, у вас в re2c есть некая структура данных, по которой и строиться лексер. То есть, можно рассматривать сгенерированный код просто как разные формы сериализации этой структуры данных (например для C одна форма, для GO другая). Было бы интересно иметь API для доступа к этой внутренней структуре данных и тогда можно будет самому писать сериализацию. Хочешь в Java, хочешь в Python, а хочешь в какую-то виртуальную машину

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

Да, в языках программирования уязвимости вызваны лексером.

ИМХО основная проблема - отсутствие верификации исходных данных.
Иногда она конечно есть, а большей частью, нет.
Поэтому exploits были и будут …

Владимир

anonymous ()
Ответ на: комментарий от theNamelessOne

само-собой, имелся ввиду интерпретатор пых-пых.

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

Хм, это посложнее. Структура есть, но она сама зависит от языка (например, есть оптимизации, специфичные для конкретного языка, влияющие на форму этой структуры). То есть бОльшая часть трансформаций не зависит от языка, но после того как язык определился, ещё есть много работы перед сериализацией в код. Идея хорошая, но надо думать.

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

Спасибо! И еще раз спасибо за замечательный продукт!

the_coder ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.