Yantra - LALR(1)-Parser-Generator für C++
Show HN: Yantra – an LALR(1) parser generator for C++
Yantra ist ein leistungsstarker Compiler-Compiler und LALR(1)-Parser-Generator für C++, der Lexer, Parser und AST-Generierung in einem Tool vereint. Er erstellt zuerst einen vollständigen AST und durchläuft ihn dann top-down, sodass Elternregeln vor ihren Kindern ausgeführt werden – ideal für mehrstufige Code-Generierung. Mit integriertem Lexer, UTF-8-Unterstützung und modusbasiertem Lexer eignet er sich für komplexe Sprachen. Einfach per CMake bauen, Grammatik schreiben und mit ycc einen eigenständigen Parser generieren. Yantra ist eine schlanke, native C++-Alternative zu Bison, ANTLR und tree-sitter.
Yantra baut zuerst den vollständigen AST auf und durchläuft ihn dann top-down in einem separaten Durchgang, sodass die Aktion einer Elternregel ausgeführt werden kann, bevor ihre Kinder besucht werden.
- MichaelMoser123
Viel Glück.
Ich wusste mal, wie man Shift/Reduce- und Reduce/Reduce-Konflikte behebt, aber das ist lange her.
Bei einem Recursive-Descent-Parser muss man auf Linksrekursion achten, was etwas weniger knifflig ist.
- mingodad
Für Leute, die sich für dieses Thema interessieren, empfehle ich dringend, sich auch Ben Hanson anzusehen: https://github.com/BenHanson/parsertl17. Darauf aufbauend habe ich hier einen Online-LALR(1)-Spielplatz erstellt: https://mingodad.github.io/parsertl-playground/playground/ – dort gibt es rund 350 nicht-triviale Grammatiken zum Experimentieren (wähle eine aus dem Dropdown-Menü `Examples` und klicke dann auf `Parse`, um einen Parse-Baum für die Eingabe in `Input` zu sehen; außerdem wird EBNF generiert, um auf https://www.bottlecaps.de/rr/ui schöne navigierbare Eisenbahndiagramme zu erzeugen.
- userbinator
Es ist ein wenig überraschend, neue Parser-Generatoren entstehen zu sehen, lange nachdem sich die überwiegende Mehrheit der Compiler bereits auf Recursive Descent / Precedence Climbing festgelegt hat (einschließlich https://news.ycombinator.com/item?id=49913192, das gerade in der Nähe auf der Startseite ist).