The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

28.01.2022 02:36

Состоялся релиз re2c 3.0, свободного генератора лексических анализаторов для языков C, C++, Go и добавленного в этом релизе языка Rust. Для поддержки Rust пришлось использовать другую модель кодогенерации, где конечный автомат представлен в виде цикла и переменной-состояния, а не в виде меток и переходов (поскольку в Rust нет goto, в отличие от С, С++ и Go).

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

  1. Главная ссылка к новости (https://re2c.org/releases/rele...)
  2. OpenNews: Выпуск генератора лексических анализаторов re2c 2.0
  3. OpenNews: Google открыл код SyntaxNet, системы восприятия естественного языка
  4. OpenNews: Релиз php-parser 0.5, парсера кода PHP
  5. OpenNews: Facebook открыл код статического анализатора Mariana Trench
  6. OpenNews: Новая версия Bison 3.2, системы для написания синтаксических анализаторов
Автор новости: skvadrik
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/56596-re2c
Ключевые слова: re2c, parser, rust, flex
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (59) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 09:19, 28/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > в Rust нет goto, в отличие от С

    При адекватной технике кодирования можно считать, что в C тоже нет goto.

     
     
  • 2.2, Ононимус (?), 09:26, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +11 +/
    В умелых руках, goto безареден. Да и сшенерированный код прежде всего должен работать, а не быть суперчитаемым
     
     
  • 3.3, myhand (ok), 09:33, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +4 +/
    > Да и сшенерированный код прежде всего должен работать, а не быть суперчитаемым

    Это тебе до первого использования отладчика так кажется...

     
     
  • 4.27, Аноним (27), 12:33, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Это тебе до первого использования отладчика так кажется...

    при "цивилизованной" отладке по коду его читаемость тебе мало поможет.
    а при отладке по ассемблерным листингам она вообще никакого значения не имеет.

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

     
     
  • 5.46, myhand (ok), 05:59, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Для отладки "освоения логики программы" нинада.  Панятна.

    Спасибо, что объяснил.

     
  • 3.7, Аноним (-), 09:49, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • –9 +/
    В умелых руках goto, как правило, не нужен. Аккуратный структурный код, как правило, не требует goto. Если вы применяете goto, значит скорее всего вы говнокодер. Оператор goto применяется 1 раз в тысячу лет.
     
     
  • 4.9, Аноним (9), 09:50, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +11 +/
    Ты еще скажи в ассемблере jmp aka goto не нужен.  
     
     
  • 5.12, Аноним (-), 09:54, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >Ты еще скажи в ассемблере jmp aka goto не нужен.  

    Нет. Не скажу, потому-что ассемблер мнемонический язык низкого уровня, где 1 мнемоника соотвествует машинной команде. А в языках высокого уровня прыжок-Jump можно реализовать и без оператора goto.

     
     
  • 6.15, Анониим (?), 10:10, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Ты забыл упомянуть что можно реализовать при помощи оверхеда в том числе оверхеда на «безопасность». Тогда да.  
     
     
  • 7.42, Аноним (-), 19:42, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Ты забыл упомянуть что можно реализовать при помощи оверхеда в том числе оверхеда на «безопасность». Тогда да.

    Ты забыл еще раз, ни к селу ни к городу, приплести ассемблер.
    Расскажи поподробнее за оверхед gccшного cleanup аттрибута (сарказм). Он все верно сказал, языковые фичи с 0 оверхедом для этого давно есть - scope guards в D, defer в Zig и т.д. Компилятор сгенерирует точно такие же прыжкы по адресам, как и в "ручном режиме" с goto, только вот читаться оно будет куда лучше, а заделать очередной "goto fail" будет сложнее.


     
  • 4.30, Crazy Alex (ok), 13:51, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +8 +/
    Это если бы в си были исключения с блоками finally или деструкторы. А так - последовательный клинап в конце функции с несколькими метками и выходы через goto в нужные точки - самый чистый вариант, который я с си видел.
     
     
  • 5.33, Аноним (-), 14:00, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • –3 +/
    >то если бы в си были исключения с блоками finally или деструкторы.

    Не дай бог. Убъёте дух сишки. Высокоуровневые сахара сишке не нужны.

     
  • 4.35, Ordu (ok), 14:24, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +6 +/
    > Если вы применяете goto, значит скорее всего вы говнокодер. Оператор goto применяется 1 раз в тысячу лет.

    Ядро linux с тобой не согласно. Там goto используется в хвост и в гриву, например, как замена RAII: чтобы подчищать ресурсы при аварийном выходе из функции. Необходимость завершиться с ошибкой может быть детектирована в любой момент, и структурно следить за тем, чтобы освободить те ресурсы, которые были уже выделены и не освобождать те ресурсы, которые ещё не были -- это жуть. Груды дублирования кода, рантайм проверок типа if(ptr) free(ptr); и в целом код превращается в болото, в котором любой неосторожный шаг приведёт либо к use-after-free, либо к memleak, либо к double-free, либо ещё к чему-нибудь поэкзотичнее.

    Когда же у тебя в конце функции что-то типа:

    ...
    return SUCCESS;

    cleanup1:
       free(ptr);
    cleanup2:
       close(fd);
    cleanup3:
       do_something_else();
       return FAILURE;

    А внутри:

    fd = open(...);
    if(fd < 0) {
        goto cleanup3;
    }
    ptr = malloc(...);
    if(ptr == NULL) {
        goto cleanup2;
    }
    if(something_else_went_bad()) {
        goto cleanup1;
    }
    то всё видно, _структурированно_, няшно и управляемо. Ещё и коды ошибок можно прокидывать туда через переменную int ret, объявленную в начале функции.

     
     
  • 5.47, Аноним (-), 09:47, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Тонко потроллить решил? Хорошо, отвественным ядрописателям goto разрешаю. Остальным говнокодерам не советую.
     
     
  • 6.49, Ordu (ok), 11:15, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Тонко потроллить решил? Хорошо, отвественным ядрописателям goto разрешаю. Остальным говнокодерам
    > не советую.

    А я советую любому открыть сорцы ядра и почитать. Учиться писать код надо ориентируясь на самые крутые образцы, а не на тот отстой, который пишут в учебниках.

     
  • 6.52, nvidiaamd (?), 12:32, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Видали хозяин пришел  и нпм разрешил. Хуух.
     
  • 4.45, Анончик (?), 23:51, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я правильно понимаю что goto: 6,069 code results in freebsd/freebsd-src
    Указывает на то что разработчики фряхи те еще гавнокодеры?
     
  • 3.13, Аноним (-), 09:56, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Код должен быть прежде всего читабельным, и желательно суперөчитабельным. Это одно из основных правил программирования.
     
     
  • 4.16, Анониим (?), 10:12, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Goto отлично ложится на концепцию блок схем.  Итого для кодогенерации отличное решение.  
     
     
  • 5.20, Аноним (-), 11:00, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    В теории всё хорошо. В эпоху расцвета процедурных языков 1960-80 гг., на практике, подавляющая часть программистов использовала опреатор goto как попало, и в те времена читать исходники было больно. Поэтому программисты тех времён - Вирт, Дейкстра, Хоар имеют стойкую неприязнь к goto.

    >Итого для кодогенерации отличное решение.

    Нет, на практике goto плохое решение.

     
  • 4.61, wyry (?), 03:30, 31/01/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Код должен быть прежде всего читабельным, и желательно суперөчитабельным. Это одно
    > из основных правил программирования.

    Ага, и поэтому все придумали кучу инструментов, чтобы этот код усложнить). Любой современный мейнстримный проект - тонны классов во множестве файлов, при этом все хитрым образом между собой связаны сообщениями, коллбеками, объекты в одной структуре данных будет "безопасно" создаваться в другом классе, ч-читабельность))). Мне всерьёз в 2022 проще читать проекты на C, чем проекты на Java, хотя ВОЗМОЖНО (только возможно), проекты на Java проще в итоге использовать при разработке нового ПО. В современном мире, честное слово, проще распутать goto, чем весь клубок из вызовов.

     
     
  • 5.63, Урри (ok), 12:53, 02/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Просто работающие проекты на С могут писать только осиляторы-профессионалы, а на джаве все кому не лень. Тут вот раст еще подъехал, так теперь (судя по комментариях на опеннете) кодить могут даже те, кто с одной извилиной. С соответствующей читабельностью, само собой.
     
     
  • 6.64, wyry (?), 13:01, 02/02/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Просто работающие проекты на С могут писать только осиляторы-профессионалы, а на джаве
    > все кому не лень. Тут вот раст еще подъехал, так теперь
    > (судя по комментариях на опеннете) кодить могут даже те, кто с
    > одной извилиной. С соответствующей читабельностью, само собой.

    Так в том и дело, что не все. На Java по крайней мере простые вещи делаются просто, чего нельзя сказать про Rust. +Java никто не отличалась "новомодностью", даже наоборот - это слишком консервативный инструмент, который развивается медленно и с сохранением обратной совместимости.
    Rust - это язык, в котором простые вещи делаются сложно, а иногда и неочевидно (всё ради реализации "безопасной работы памяти без GC", результаты такие, что лучше бы они сделали GC...

     
     
  • 7.65, Урри (ok), 13:12, 02/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Пожалуй, я просто соглашусь.
     
  • 3.26, Умпа (?), 12:27, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Прежде всего, должен быть суперчитаемым.

    Когда тебя вытурят взашей, твоя замена должна моментально твой код освоить.

     
     
  • 4.43, Аноним (43), 22:44, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    А зачем облегчать жизнь работодателю?
     
     
  • 5.56, Аноним (-), 11:25, 30/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Люто бешено плюсую! Да! Пусть работодатель стардает!
     
  • 2.22, Shatur (ok), 11:09, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +7 +/
    В С goto часто применяется чтобы очистить память перед выходом из функции: https://github.com/neovim/neovim/blob/530c65b17ade3f5db70af5746f4eed945efdfcfa
     
     
  • 3.32, Аноним (9), 13:53, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Вроде это называется велосипед.  
     
     
  • 4.34, Аноним (-), 14:21, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Твоё решение ? В каждый чек повставлять не надо предлагать
     
  • 3.48, Аноним (48), 10:48, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Встречалось применение goto в проектах на С только (!) в случаях, если алгоритмы были переведены (как правило, автоматически) с Фортрана. Это было вызвано нехваткой времени и специалистов на нормальное переписывание алгоритмов.
     
     
  • 4.50, Shatur (ok), 12:14, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Я выше скинул пример который изначально писался на С. Я лично постоянно вижу такое в популярных проектах и это нормально. Вот вам пример с SDL еще: https://github.com/libsdl-org/SDL/blob/8b139e26a3d40b35902203e4192e9fa1c3ee83e
    Это удобней чем дублировать одни и те же строки на случай ошибки или делать отдельные функции обработки ошибок для каждой функции. В С же нет defer или умных указателей.
     
     
  • 5.53, Аноним (48), 16:04, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Посмотрел. Не могу одобрить вход в конструкцию помимо заголовка. Это некрасиво, а значит - противно С. С - прежде всего эстетика.
     
  • 5.55, Аноним (48), 09:12, 30/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Код ужасен. Авторы хоть один учебник по программированию видели?
     
     
  • 6.62, wyry (?), 03:35, 31/01/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Код ужасен. Авторы хоть один учебник по программированию видели?

    Кстати в большинстве "учебников" код либо простой и неэффективный (что ещё в принципе нормально и так и должно быть поначалу), либо НА САМОМ ДЕЛЕ уродливый. Более эффективные конструкции, на основе указателей, их арифметике и взаимодействий скорее придётся изучать самостоятельно. При этом практически в любой библиотеке или ПО, где требуется прямая работа с памятью, необходимо, всё это знать. Rust'оманам не понять, у них "безопасные утечки".

     
  • 2.44, Аноним (44), 23:45, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Её используют и профессионалы - например в Brotli ( https://www.opennet.me/opennews/art.shtml?num=43006 ) от Google
    https://github.com/google/brotli/blob/4ec67035c0d97c270c1c73038cc66fc5fcdfc120
     
  • 2.51, Аноним (-), 12:26, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вы, похоже, писали всю жизнь на JS или расте, если не в курсе про то, что работа с ресурсами адекватнее всего делается именно на goto.
     
     
  • 3.54, Аноним (48), 16:07, 29/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Не правы. Когда я начинал с С, упомянутые Вами еще не были изобретены.
     

  • 1.4, Аноним (4), 09:39, 28/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Это шутка типа рагеля? Им можно парсер http протокола замутить?
     
     
  • 2.17, Аноним (17), 10:15, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Лексер можно, парсер придется писать или генерить чем-то другим
     
  • 2.19, skvadrik (ok), 10:37, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Вот есть пример: https://re2c.org/examples/c/submatch/example_http_rfc7230.html. Это в оригинале бенчмарк для тэгов, но можно подпилить (сделан по RFC). Парсить можно в смысле выделения подстрок (в примере для этого используются тэги: https://re2c.org/manual/manual_c.html#submatch-extraction).

    В целом да, re2c и ragel очень похожи. Из серьёзных отличий, re2с основана на TDFA, который разрешает конфликты и неоднозначности между тэгами, а в ragel приходится вручную подгонять операторы приоритета (и это не всегла в принципе возможно сделать). При этом скорость выделения подстрок примерно одинаковая у обоих (вот бенчмарки: https://re2c.org/benchmarks/benchmarks.html#submatch-lexer-generators).

     
     
  • 3.21, Аноним (4), 11:00, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо. Думаю, посмотрю на проект, т.к. рагель в стагнации, а эта штука развивается.
     
     
  • 4.25, Аноним (9), 12:25, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Если что тесты от производителя всегда дутое фуфло. Надо или смотреть «независимых» оценщиков или делать тесты самому на своих задачах.  
     

  • 1.5, Аноним (5), 09:46, 28/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Топикстартер, ты не можешь на ЛОР заглянуть? Там твою новость ошибочно удалили, приняв за копипасту с опеннета, сильно извиняются и просят пойти навстречу.
     
     
  • 2.8, Аноним (9), 09:49, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Никогда нельзя идти на встречу дуракам. Это провоцирует дураков оставаться дураками.  
     
  • 2.14, Аноним (-), 10:01, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Так на ЛОРе исторически копировали новости с опеннета. Сейчас, что не так?
     
  • 2.18, skvadrik (ok), 10:20, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Спасибо! Вежиливые люди на ЛОРе.
     

  • 1.23, самокатофил (?), 11:47, 28/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >The new approach is different enough to require multiple changes in code generation. In loop-switch mode it is impossible to jump into the middle of a state bypassing the skip statement, so the --eager-skip option is enforced, which moves skip statements to transitions. With conditions it is impossible to jump between different blocks, so DFAs for all conditions are merged into one switch, and condition numbers are the indices of the initial DFA states. In storable state mode it is impossible to jump from the YYGETSTATE switch to a DFA state, therefore a separate getstate:re2c detached from the lexer block is not supported.

    Ох лол, внесли новых багов в кодогенератор, а плюсов никаких, одни ограничения. При этотм, мамкины растаманы рассуждают как вреден goto. :-D

     
     
  • 2.36, Ordu (ok), 14:31, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это не растоманы внесли. У растоманов есть rust-peg, есть pest, есть nom... зачем нам нужен re2c, перемешивающий декларации грамматики с кодом, который работает с грамматикой? Да ещё и не средствами языка, а комментами?

    Этот re2c -- классическая работа сишников, просто на этот раз они поработали с rust'ом.

     
     
  • 3.37, самокатофил (?), 15:03, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Это не растоманы внесли.

    уболтали авторов а сами в закат? :)

    > У растоманов есть rust-peg, есть pest, есть nom...
    > зачем нам нужен re2c, перемешивающий декларации грамматики с кодом, который работает
    > с грамматикой? Да ещё и не средствами языка, а комментами?

    Для spamassassin'a, пыха, ну и т.д. и т.п. Для работы кароч. Растаманам не понять. ;)


     
     
  • 4.39, Ordu (ok), 15:27, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > уболтали авторов а сами в закат? :)

    Возможно. Эдакий троллинг RiiR'ом.

    > Для работы кароч. Растаманам не понять. ;)

    Да, я знаю. Даже не пытаюсь понимать, последнее время.

     
  • 2.38, skvadrik (ok), 15:08, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    За старый кодогенератор можно не переживать, он как был так и остался (включен по умолчанию для C, С++ и Go). Просто есть новая опция теперь.
     

  • 1.40, Аноним (-), 18:41, 28/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    при генерации на раст обеспечивается безопасность методом unsafe?
     
     
  • 2.41, skvadrik (ok), 19:19, 28/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    По умолчанию только операция чтения символа подразумевает unsafe, поскольку ей надо отключать проверку на выход за границы (лексер эти проверки делает сам и более эффективным способом). Но это необязательно, можно отключить опцией '--no-unsafe' или конфигурацией 're2c:unsafe' и будет всё safe. Можно и наоборот, другие базовые операции обернуть в unsafe.
     

  • 1.57, adolfus (ok), 00:51, 31/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    "конечный автомат представлен в виде цикла и переменной-состояния"
    Полный абсурд.
    Вот почему я люто ненавижу Вирта -- эта сволочь сагитировала стадо мудаков не только против множественных точек входа в процедуры и безусловных переходов, но и против сопрограмм.
    Тут налицо техническое противоречие -- если использовать entry, вычисляемые переходы, goto, coroutines, требования к навыкам программиста и время разработки сильно возрастают, что для бизнеса плохо, зато  возрастают производительность и прочая эффективность программ, что хорошо для пользователей. И наоборот.
    Такого рода противоречия решаются бескомпромисно -- выбирается одна сторона (основная) и абсолютизируется. Другая сторона, вторичная, представляет проблему и ее решают, не сдвигая рамок основной. Вирт это стопроцентно знал, как инженер, и выбрал ту сторону, которую выбрал. Ему, как преподавателю университета, это нужно было, чтобы за полгода "научить студентов программированию".
    В результате, чем быстрее процессоры, тем программы работают медленней, чем у системы больше памяти, тем больше ее программам не хватает. Зато программистов развелось, как собак не резанных. Ну и бобики периодически падают. Завтра все вообще начнет ломаться и портиться -- в автокад питон завезли на замену автолиспа, чтобы студентов вместо конструкторов на работу брать.


     
     
  • 2.60, Аноним (60), 02:37, 31/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >в автокад ЯП завезли на замену скобочного говна

    /thread

     
     
  • 3.66, adolfus (ok), 22:42, 02/02/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Программы написанные на этом скобочном говне обладают математически доказуемыми... большой текст свёрнут, показать
     

  • 1.58, Аноним (58), 01:55, 31/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    > Rust ... конечный автомат представлен в виде цикла и переменной-состояния

    Какое убожество...

     
  • 1.59, Аноним (60), 02:35, 31/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Какое же дерьмо этот re2c... Ни AST не строит, ни грамматику нормально не представляет.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру