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, а затем обходит его сверху вниз в отдельном проходе, поэтому действие родительского правила может выполниться до посещения его дочерних элементов.
- MichaelMoser123
Удачи.
Когда-то я знал, как исправлять ошибки shift/reduce и reduce/reduce, но это было очень давно.
С рекурсивным спуском нужно проверять левую рекурсию, а это несколько менее хитро.
- 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 .
- userbinator
Немного удивляет, что пишутся новые генераторы парсеров, спустя долгое время после того, как подавляющее большинство компиляторов уже остановились на рекурсивном спуске / восхождении по приоритетам (включая https://news.ycombinator.com/item?id=49913192 , который сейчас находится рядом на главной странице.)