Yantra - LALR(1) парсер-генератор для C++

Show HN: Yantra – an LALR(1) parser generator for C++

Yantra — это мощный компилятор компиляторов и генератор LALR(1)-парсеров, написанный на C++. Он объединяет в одном инструменте лексер, парсер и построение AST, поддерживает Unicode/UTF-8, многомодовый лексер и потоковую обработку ввода. В отличие от Bison или Yacc, Yantra сначала строит полное AST, а затем обходит его сверху вниз, что позволяет родительским правилам выполняться до дочерних. Генератор не требует зависимостей, кроме стандартной библиотеки C++, и может создавать как отдельные .hpp/.cpp файлы, так и единый самодостаточный файл с функцией main(). Идеально подходит для создания компиляторов, интерпретаторов и кодогенераторов.

Yantra всегда сначала строит полное AST, а затем обходит его сверху вниз в отдельном проходе, поэтому действие родительского правила может выполниться до посещения его дочерних элементов.
  1. MichaelMoser123

    Удачи.

    Когда-то я знал, как исправлять ошибки shift/reduce и reduce/reduce, но это было очень давно.

    С рекурсивным спуском нужно проверять левую рекурсию, а это несколько менее хитро.

  2. mingodad

    Тем, кто интересуется этой темой, я настоятельно рекомендую также взглянуть на Ben Hanson https://github.com/BenHanson/parsertl17, и на его основе я создал онлайн-песочницу для LALR(1) здесь https://mingodad.github.io/parsertl-playground/playground/, где у вас есть около 350 нетривиальных грамматик для экспериментов (выберите одну из выпадающего списка `Examples`, а затем нажмите `Parse`, чтобы увидеть дерево разбора для ввода в `Input`; она также генерирует EBNF для создания красивых навигируемых железнодорожных диаграмм на https://www.bottlecaps.de/rr/ui .

  3. userbinator

    Немного удивляет, что пишутся новые генераторы парсеров, спустя долгое время после того, как подавляющее большинство компиляторов уже остановились на рекурсивном спуске / восхождении по приоритетам (включая https://news.ycombinator.com/item?id=49913192 , который сейчас находится рядом на главной странице.)

Ещё за этот день

2026-10-01