Show HN: Yantra – an LALR(1) parser generator for C++
🇬🇧 English
Yantra is a C++ parser generator that builds the entire AST first, then walks it top-down in a separate pass, calling semantic actions as it goes. Unlike most LALR parser generators (Yacc, Bison, Lemon) which run semantic actions during parsing, Yantra allows a parent rule's action to run before its children are visited. This enables a single grammar to define multiple walkers, such as one emitting C++ and another emitting Java. The AST and walker classes are both generated automatically. Yantra features an integrated lexer with mode support for nested comments, optional amalgamated single-file output with generated main(), and requires only a C++23 compiler. It is MIT licensed and currently at version 0.5.1, pre-1.0, maintained by a single developer.
A small example grammar demonstrates the top-down walking behavior: parsing "1 + 2 + 3" prints "Adding" first (the root), followed by number outputs. This ordering is only possible because the full tree exists before any action executes.
Known limitations are documented on the project's GitHub page. The repository is available at https://github.com/TantrixAuto/yantra, with feedback and questions welcomed by the maintainer.
The tool uses CMake for building and produces the ycc executable for generating parsers from grammar files.
🇸🇦 العربية
Yantra: مولد محلل C++ مع مشاة AST
Yantra هو مولد محلل C++ يبني الشجرة abstactة الكاملة أولًا، ثم يمشيها من الأعلى إلى الأسفل في مرور منفصل، ويستدعي الإجراءات الدلالية. على عكس معظم مولدات المحللات LALR (Yacc، Bison، Lemon) التي تنفذ الإجراءات الدلالية أثناء التحليل، يتيح Yantra لإجراء rule الأصل أن يعمل قبل زيارة أطفاله. هذا يمكّن قواعد واحدة من تحديد عدة مشاة، مثل واحد يصدر C++ وآخر يصدر Java. تُولد فئات AST والمشاة تلقائيًا. يتميز Yantra بمحلل رمزي مدمج يدعم وضع التعليقات المتداخلة، وإخراج ملف واحد اختياري مدمج مع main() مولد، ويتطلب فقط مترجم C++23. إنه مرخص بموجب MIT، والإصدار الحالي هو 0.5.1، ما قبل 1.0، ويتم صيانته من قبل مطور واحد.
مثال صغير للقواعد يوضح سلوك المشي من الأعلى إلى الأسفل: تحليل "1 + 2 + 3" يطبع "Adding" أولًا (الجذر)، gefolطًا بطبعات الأرقام. هذا الترتيب ممكن فقط لأن الشجرة الكاملة موجودة قبل تنفيذ أي إجراء.
القيود المعروفة موثقة في صفحة GitHub الخاصة بالمشروع. المستودع متاح في https://github.com/TantrixAuto/yantra، مع ترحيب بالتعليقات والأسئلة من قبل المطور المسؤول.
الأداة تستخدم CMake للبناء وتنتج ملفًا تنفيذيًا ycc لإنشاء المحللات من ملفات القواعد.
الكيانات الرئيسية: الشركات: TantrixAuto
كيف يختلف Yantra عن مولدات المحللات التقليدية مثل Yacc أو Bison؟
مولدات المحللات LALR التقليدية مثل Yacc وBison وLemon تنفذ الإجراءات الدلالية أثناء التحليل كلما قل كل règle، من الأسفل إلى الأعلى. في تلك النقطة، يكون سياق rule الأب غير معروف، مما يدفع القواعد نحو فئات AST مبنية يدويًا ومرور منفصل للمشي. على العكس من ذلك، يبني Yantra أولًا الشجرة abstactة الكاملة، ثم يمشيها من الأعلى إلى الأسفل في مرور منفصل، مما يسمح بإجراء rule الأصل بالعمل قبل زيارة أطفاله، مما يمكّن ميزات مثل وجود عدة مشاة من قواعد واحدة.
🇧🇩 বাংলা
Yantra: C++ পার্সার জেনারেটর jossa AST ওকার
Yantra একটি C++ পার্সার জেনারেটর যা প্রথমে পুরো AST তৈরি করে, তারপর আলাদা পাসে উপরে থেকে নিচে চলে, সেম্যান্টিক একশন কল করে। বেশিরভাগ LALR পার্সার জেনারেটরের (Yacc, Bison, Lemon) বিপরীত, যা পার্সিংয়ের সময় সেম্যান্টিক একশন চালায়, Yantra একটি মাতা নিয়মের একশনকে তার শিশুদের দেখার আগে চালানোর অনুমতি দেয়।これにより একটি একক ব্যাকরণ থেকে একাধিক ওকার সংজ্ঞায়িত করা সম্ভব হয়, যেমন একটি C++ প্লót করে এবং অন্যটি Java প্লót করে। AST এবং ওকার ক্লাস উভয়ই স্বয়ংক্রিয়ভাবে তৈরি হয়। Yantra-এ একটি একीकৃত লেক্সার আছে যা নেস্টেড কমেন্টের জন্য মোড সমর্থন দেয়, ঐচ্ছিক অমলগমেটেড একক-ফাইল আউটপুট jossa উত্পন্ন main() থাকে, এবং শুধুমাত্র C++23 কম্পাইলারের প্রয়োজন হয়। এটি MIT লাইসেন্সের অধীনে আছে এবং বর্তমানে সংস্করণ 0.5.1-এ আছে, pre-1.0, একটি একক ডেভেলপার দ্বারা মেনটেইন করা হচ্ছে।
একটি ছোট ব্যাকরণ উদাহরণ উপরে থেকে নিচে চলার আচরণ দেখায়: "1 + 2 + 3" পার্স করার সময় "Adding" প্রথমে প্রিন্ট হয় (মূল), তারপর সংখ্যা আউটপুট। এই ক্রমটি শুধুমাত্র তখন সম্ভব হয় যখন পুরো গাছ কোনো একশন চালানোর আগে বিদ্যমান থাকে।
জানা সীমাবদ্ধতাগুলি প্রজেক্টের GitHub পৃষ্ঠায় নথিবদ্ধ করা হয়েছে। রিপোজিটরি https://github.com/TantrixAuto/yantra-এ উপলব্ধ है, এবং মেইনটেইনার দ্বারা প্রতিক্রিয়া এবং প্রশ্ন স্বাগত করা হয়।
এই টুলটি CMake ব্যবহার করে তৈরি হয় এবং ycc এক্সিকিউটেবল তৈরি করে যা ব্যাকরণ ফাইল থেকে পার্সার তৈরি করে।
মुख্য entidades: কোম্পানিগুলো: TantrixAuto
Yantra Yacc বা Bison মতো প্যারम्पারিক পার্সার জেনারেটরের থেকে কীভাবে ভিন্ন?
প্যারम्पারিক LALR পার্সার জেনারেটর যেমন Yacc, Bison এবং Lemon পার্সিংয়ের সময়, যেমন-जैसे প্রতিটি নিয়ম হ্রাস পায়, নিচে থেকে ওরে की ओर সেম্যান্টিক একশন চালায়। সেই বিন্দুতে, নিয়মের পিতৃ প্রেক্ষাপট অজানা থাকে, যা ব্যাকরণকে হাতে তৈরি AST ক্লাস এবং আলাদা চলার পাসের দিকে धकेले। Yantra इसके विपरीत: প্রথমে পুরো AST তৈরি করে, তারপর আলাদা পাসে উপরে থেকে নিচে চলা করে, जिससे মাতা নিয়মের একশনকে তার শিশুদের দেখার আগে চালানোর অনুমতি मिलती है, जिससे একটি একক ব্যাকরণ থেকে একাধিক ওকার जैसी বৈশিষ্ট্য সক্ষম হয়।
🇩🇪 Deutsch
Yantra: C++-Parser-Generator mit AST-Walker
Yantra ist ein C++-Parser-Generator, der zuerst den vollständigen AST erstellt, dann ihn top-down in einem separaten Durchlauf durchläuft und semantische Aktionen aufruft. Im Gegensatz zu den meisten LALR-Parser-Generatoren (Yacc, Bison, Lemon), die semantische Aktionen während des Parsens ausführen, ermöglicht Yantra, dass die Aktion einer Elternregel ausgeführt wird, bevor ihre Kinder besucht werden. Dadurch kann eine einzelne Grammatik mehrere Walker definieren, beispielsweise einen, der C++ ausgibt, und einen anderen, der Java ausgibt. Die AST- und Walker-Klassen werden automatisch generiert. Yantra verfügt über einen integrierten Lexer mit Modusunterstützung für verschachtelte Kommentare, optionale Einzelausgabe in einer amalgamierten Datei mit generierter main()-Funktion und benötigt lediglich einen C++23-Compiler. Er ist unter der MIT-Lizenz lizenziert und befindet sich derzeit in der Version 0.5.1 (pre-1.0), gewartet von einem einzelnen Entwickler.
Ein kleines Beispielgrammatik demonstriert das top-down-Walk-Verhalten: Beim Parsen von "1 + 2 + 3" wird zuerst "Adding" (die Wurzel) ausgegeben, gefolgt von den Zahlenausgaben. Diese Reihenfolge ist nur möglich, weil der vollständige Baum vor der Ausführung irgendeiner Aktion existiert.
Bekannte Einschränkungen sind auf der GitHub-Seite des Projekts dokumentiert. Das Repository ist unter https://github.com/TantrixAuto/yantra verfügbar, und Feedback sowie Fragen werden vom Maintainer willkommen geheißen.
Das Tool verwendet CMake zum Bauen und erzeugt die ausführbare Datei ycc zum Generieren von Parsern aus Grammatikdateien.
Wichtige Entitäten: Unternehmen: TantrixAuto
Wie unterscheidet sich Yantra von traditionellen Parser-Generatoren wie Yacc oder Bison?
Traditionelle LALR-Parser-Generatoren wie Yacc, Bison und Lemon führen semantische Aktionen während des Parsens aus, während jede Regel reduziert wird, von unten nach oben. Zu diesem Zeitpunkt ist der Elternkontext der Regel unbekannt, was Grammatiken dazu zwingt, manuell gebaute AST-Klassen und separate Durchläufe zu verwenden. Yantra hingegen baut zuerst den vollständigen AST auf, durchläuft ihn anschließend top-down in einem separaten Durchlauf und ermöglicht es, dass die Aktion einer Elternregel ausgeführt wird, bevor ihre Kinder besucht werden, wodurch Funktionen wie mehrere Walker aus einer einzelnen Grammatik ermöglicht werden.
🇪🇸 Español
Yantra: Generador de analizadores C++ con recorrido de AST
Yantra es un generador de analizadores C++ que construye todo el AST primero, luego lo recorre de arriba a abajo en un paso separado, llamando a las acciones semánticas. A diferencia de la mayoría de los generadores de analizadores LALR (Yacc, Bison, Lemon) que ejecutan acciones semánticas durante el análisis, Yantra permite que la acción de una regla padre se ejecute antes de que se visiten sus hijos. Esto permite que una sola gramática defina múltiples recorridores, como uno que emite C++ y otro que emite Java. Las clases de AST y recorredor se generan automáticamente. Yantra cuenta con un analizador léxico integrado con soporte para modos de comentarios anidados, salida opcional de un solo archivo amalgamado con main() generado, y requiere solo un compilador C++23. Está licenciado bajo MIT y actualmente está en la versión 0.5.1, pre-1.0, mantenido por un solo desarrollador.
Un pequeño ejemplo de gramática demuestra el comportamiento de recorrido de arriba a abajo: al analizar "1 + 2 + 3", se imprime "Adding" primero (la raíz), seguido por las salidas de números. Este orden solo es posible porque el árbol completo existe antes de que se ejecute cualquier acción.
Las limitaciones conocidas están documentadas en la página de GitHub del proyecto. El repositorio está disponible en https://github.com/TantrixAuto/yantra, con comentarios y preguntas bienvenidos por el mantenedor.
La herramienta usa CMake para compilar y produce el ejecutable ycc para generar analizadores desde archivos de gramática.
Entidades clave: Empresas: TantrixAuto
¿En qué se diferencia Yantra de los generadores de analizadores tradicionales como Yacc o Bison?
Los generadores de analizadores LALR tradicionales como Yacc, Bison y Lemon ejecutan acciones semánticas durante el análisis, a medida que cada regla se reduce, de abajo hacia arriba. En ese punto, el contexto padre de la regla es desconocido, lo que impulsa las gramáticas hacia clases AST construidas manualmente y pasos de recorrido separados. Yantra, en cambio, construye primero todo el AST, luego lo recorre de arriba a abajo en un paso separado, permitiendo que las acciones de las reglas padre se ejecuten antes de que se visiten sus hijos, lo que habilita características como múltiples recorridores desde una sola gramática.
🇫🇷 Français
Yantra : Générateur d'analyseur C++ avec parcours d'AST
Yantra est un générateur d'analyseur C++ qui construit entièrement l'AST en premier, puis le parcourt de haut en bas dans un passage séparé, en appelant les actions sémantiques. Contrairement à la plupart des générateurs d'analyseur LALR (Yacc, Bison, Lemon) qui exécutent les actions sémantiques pendant l'analyse, Yantra permet à l'action d'une règle parente de s'exécuter avant que ses enfants ne soient visités. Cela permet à une seule grammaire de définir plusieurs parcours, tels qu'un émettant du C++ et un autre du Java. Les classes AST et de parcours sont générées automatiquement. Yantra intègre un analyseur lexical avec prise en charge des modes pour les commentaires imbriqués, une sortie en fichier unique amalgamée optionnelle avec un main() généré, et nécessite uniquement un compilateur C++23. Il est sous licence MIT et est actuellement à la version 0.5.1, pré-1.0, maintenu par un seul développeur.
Un petit exemple de grammaire démontre le comportement de parcours de haut en bas : l'analyse de "1 + 2 + 3" affiche "Adding" en premier (la racine), suivie des sorties de nombres. Cet ordre n'est possible que parce que l'arbre complet existe avant l'exécution de toute action.
Les limites connues sont documentées sur la page GitHub du projet. Le dépôt est disponible à l'adresse https://github.com/TantrixAuto/yantra, avec les retours et questions accueillis par le mainteneur.
L'outil utilise CMake pour la construction et produit l'exécutable ycc pour générer des analyseurs à partir de fichiers de grammaire.
Entités clés : Entreprises : TantrixAuto
En quoi Yantra diffère-t-il des générateurs d'analyseurs traditionnels comme Yacc ou Bison ?
Les générateurs d'analyseurs LALR traditionnels comme Yacc, Bison et Lemon exécutent les actions sémantiques pendant l'analyse, à mesure que chaque règle se réduit, de bas en haut. À ce stade, le contexte parent de la règle est inconnu, ce qui pousse les grammaires vers des classes AST construites manuellement et des passages de parcours séparés. Yantra, en revanche, construit d'abord entièrement l'AST, puis le parcourt de haut en bas dans un passage séparé, permettant à l'action d'une règle parente de s'exécuter avant que ses enfants ne soient visités, ce qui permet des fonctionnalités telles que plusieurs parcours à partir d'une seule grammaire.
🇮🇳 हिन्दी
Yantra: C++ पार्सर जेनरेटर जिसमें AST वॉकर है
Yantra एक C++ पार्सर जेनरेटर है जो पहले पूरा AST बनाता है, फिर उसे ऊपर से नीचे की ओर अलग पास में चलता है, सेमेंटिक एक्शन कॉल करते हुए। अधिकांश LALR पार्सर जेनरेटर (Yacc, Bison, Lemon) के विपरीत, जो पार्सिंग के दौरान सेमेंटिक एक्शन चलाते हैं, Yantra एक माता नियम के एक्शन को उसके बच्चों के देखे जाने से पहले चलाने की अनुमति देता है। इससे एक ही व्याकरण से कई वॉकर परिभाषित करना संभव होता है, जैसे एक C++ उत्सर्जित करता है और दूसरा Java उत्सर्जित करता है। AST और वॉकर क्लास दोनों स्वचालित रूप से उत्पन्न होते हैं। Yantra में एकीकृत लेक्सर होता है जो नेस्टेड टिप्पणियों के लिए मोड समर्थन प्रदान करता है, वैकल्पिक अमलगमेटेड सिंगल-फ़ाइल आउटपुट जिसमें उत्पन्न main() होता है, और इसके लिए केवल C++23 कंपाइलर की आवश्यकता होती है। यह MIT लाइसेंस के तहत है और वर्तमान में संस्करण 0.5.1 पर है, pre-1.0, एक एकल डेवलपर द्वारा बनाए रखा जा रहा है।
एक छोटा व्याकरण उदाहरण ऊपर से नीचे की ओर चलने वाले व्यवहार को दर्शाता है: "1 + 2 + 3" का पार्स करने पर "Adding" पहले प्रिंट होता है (जड़), उसके बाद संख्या आउटपुट। यह क्रम केवल इसलिए संभव है क्योंकि पूरा पेड़ किसी भी एक्शन के निष्पादन से पहले मौजूद होता है।
ज्ञात सीमाएं प्रोजेक्ट के GitHub पृष्ठ पर दस्तावेज़ीकृत हैं। रिपॉजिटरी https://github.com/TantrixAuto/yantra पर उपलब्ध है, और रखरखावकर्ता द्वारा प्रतिक्रिया और प्रश्नों का स्वागत किया जाता है।
इस टूल का निर्माण CMake का उपयोग करके किया जाता है और यह ycc निष्पादन योग्य उत्पन्न करता है जो व्याकरण फ़ाइलों से पार्सर उत्पन्न करता है।
मुख्य इकाइयाँ: कंपनियाँ: TantrixAuto
Yantra पारंपरिक पार्सर जेनरेटर जैसे Yacc या Bison से कैसे अलग है?
पारंपरिक LALR पार्सर जेनरेटर जैसे Yacc, Bison और Lemon पार्सिंग के दौरान, जैसे-जैसे प्रत्येक नियम घटता है, नीचे से ऊपर की ओर सेमेंटिक एक्शन चलाते हैं। उस बिंदु पर, नियम के पिता संदर्भ अज्ञात होता है, जो व्याकरण को हाथ से बने AST क्लासेस और अलग से चलने वाले पास की ओर धकेलता है। Yantra इसके विपरीत: पहले पूरा AST बनाता है, फिर अलग पास में ऊपर से नीचे की ओर चलता है, जिससे माता नियम के एक्शन को उसके बच्चों के देखे जाने से पहले चलाने की अनुमति मिलती है, जिससे एक ही व्याकरण से कई वॉकर जैसी विशेषताएँ सक्षम होती हैं।
🇮🇩 Bahasa Indonesia
Yantra: Generator Parser C++ dengan Penelusuran AST
Yantra adalah generator parser C++ yang membangun seluruh AST terlebih dahulu, lalu menjalani penelusuran top-down dalam lewatan terpisah, memanggil tindakan semantik. Tidak seperti kebanyakan generator parser LALR (Yacc, Bison, Lemon) yang menjalankan tindakan semantik selama parsing, Yantra mengizinkan tindakan dari suatu aturan induk untuk dijalankan sebelum anak-anaknya dikunjungi. Hal ini memungkinkan satu tata bahasa untuk mendefinisikan banyak penelusur, seperti satu yang menghasilkan C++ dan yang lain menghasilkan Java. Kelas AST dan penelusur dibuat secara otomatis. Yantra memiliki analyzer leksikal terintegrasi dengan dukungan mode untuk komentar bersarang, keluaran tunggal amalgaamasi opsional dengan main() yang dihasilkan, dan hanya memerlukan compiler C++23. Ia dilisensikan di bawah MIT dan saat ini berada pada versi 0.5.1, pra-1.0, dipelihara oleh satu pengembang.
Sebuah contoh tata bahasa kecil menunjukkan perilaku penelusuran top-down: saat mem-parsing "1 + 2 + 3", ia mencetak "Adding" terlebih dahulu (akar), diikuti oleh keluaran angka. Urutan ini hanya mungkin karena seluruh pohon ada sebelum tindakan apapun dieksekusi.
Keterbatasan yang dikenal tercatat di halaman GitHub proyek. Repositori tersedia di https://github.com/TantrixAuto/yantra, dengan masukan dan pertanyaan yang disambut baik oleh pemelihara.
Alat ini menggunakan CMake untuk pembangunan dan menghasilkan executable ycc untuk menghasilkan parser dari file tata bahasa.
Entitas kunci: Perusahaan: TantrixAuto
Bagaimana Yantra berbeda dari generator parser tradisional seperti Yacc atau Bison?
Generator parser LALR tradisional seperti Yacc, Bison, dan Lemon menjalankan tindakan semantik selama parsing setiap kali suatu aturan direduksi, dari bawah ke atas. Pada titik tersebut, konteks induk dari aturan tersebut tidak diketahui, yang mendorong tata bahasa menuju kelas AST yang dibangun secara manual dan lewatan terpisah untuk penelusuran. Sebaliknya, Yantra pertama-tama membangun seluruh AST, lalu menjalani penelusuran top-down dalam lewatan terpisah, mengizinkan tindakan dari suatu aturan induk untuk dijalankan sebelum anak-anaknya dikunjungi, sehingga memungkinkan fitur seperti banyak penelusur dari satu tata bahasa.
🇯🇵 日本語
Yantra: ASTウォーカー付きC++パーサージェネレータ
Yantraは完全なASTを最初に構築し、その後別パスでトップダウンにウォークし、セマンティックアクションを呼び出すC++パーサージェネレータです。ほとんどのLALRパーサージェネレータ(Yacc、Bison、Lemon)とは異なり、パース中にセマンティックアクションを実行するのではなく、Yantraは親ルールのアクションを子ノードが訪問される前に実行することを許可します。これにより、単一の文法から複数のウォーカーを定義できます。たとえば、一つはC++を出力し、もう一つはJavaを出力します。ASTクラスとウォーカークラスは両方とも自動的に生成されます。Yantraはネストされたコメントのためのモードサポートを備えた統合字句解析器を持ち、オプションでamalgamated単一ファイル出力(生成されたmain()付き)を提供し、C++23コンパイラのみを必要とします。MITライセンスの下で提供され、現在のバージョンは0.5.1(pre-1.0)で、単一の開発者によってメンテナンスされています。
トップダウンウォークの振る舞いを示す小さな文法の例:"1 + 2 + 3"をパースすると、まず"Adding"(ルート)が印刷され、その後に数値の出力が続きます。この順序は、あらゆるアクションが実行される前に完全なASTが存在するためのみ可能です。
既知の制限事項はプロジェクトのGitHubページに文書化されています。リポジトリはhttps://github.com/TantrixAuto/yantraにあり、フィードバックと質問はメンテナーによって歓迎されています。
このツールはCMakeを使用してビルドされ、文法ファイルからパーサーを生成するycc実行可能ファイルを生成します。
主要なエンティティ: 企業: TantrixAuto
YantraはYaccやBisonなどの従来のパーサージェネレータとどう違いますか?
従来のLALRパーサージェネレータであるYacc、Bison、Lemonは、パース中に各規則が還元されるたびにボトムアップでセマンティックアクションを実行します。この時点で、規則の親コンテキストは不明であり、これにより文法は手動で構築されたASTクラスと別のウォークパスに向かいます。一方、Yantraはまず完全なASTを構築し、その後別パスでトップダウンにウォークし、親ルールのアクションを子ノードが訪問される前に実行することを許可します。これにより、単一の文法から複数のウォーカーを定義するなどの機能が可能になります。
🇧🇷 Português
Yantra: Gerador de Analisador C++ com Percurso de AST
Yantra é um gerador de analisador C++ que constrói toda a AST primeiro, depois a percorre de cima para baixo em um passo separado, chamando ações semânticas. Ao contrário da maioria dos geradores de analisador LALR (Yacc, Bison, Lemon) que executam ações semânticas durante a análise, o Yantra permite que a ação de uma regra pai seja executada antes de seus filhos serem visitados. Isso permite que uma única gramática defina múltiplos percursos, como um que emite C++ e outro que emite Java. As classes AST e de percurso são geradas automaticamente. O Yantra possui um léxico integrado com suporte a modos para comentários aninhados, saída opcional de arquivo único amalgamado com main() gerado, e requer apenas um compilador C++23. Está licenciado sob MIT e atualmente está na versão 0.5.1, pré-1.0, mantido por um único desenvolvedor.
Um pequeno exemplo de gramática demonstra o comportamento de percurso de cima para baixo: ao analisar "1 + 2 + 3", ele imprime "Adding" primeiro (a raiz), seguido pelas saídas de números. Essa ordem só é possível porque a árvore completa existe antes de qualquer ação ser executada.
As limitações conhecidas estão documentadas na página do GitHub do projeto. O repositório está disponível em https://github.com/TantrixAuto/yantra, com feedback e perguntas bem-vindos pelo mantenedor.
A ferramenta usa o CMake para construção e produz o executável ycc para gerar analisadores a partir de arquivos de gramática.
Entidades-chave: Empresas: TantrixAuto
Como o Yantra difere dos geradores de analisador tradicionais como Yacc ou Bison?
Os geradores de analisador LALR tradicionais como Yacc, Bison e Lemon executam ações semânticas durante a análise, à medida que cada regra é reduzida, de baixo para cima. Nesse ponto, o contexto pai da regra é desconhecido, o que impulsiona as gramáticas para classes AST construídas manualmente e passos de percurso separados. O Yantra, ao contrário, constrói primeiro toda a AST, depois a percorre de cima para baixo em um passo separado, permitindo que a ação de uma regra pai seja executada antes de seus filhos serem visitados, habilitando recursos como múltiplos percursos a partir de uma única gramática.
🇷🇺 Русский
Yantra: Генератор парсеров C++ с обходом AST
Yantra — это генератор парсеров C++, который сначала строит полное AST, затем обходит его сверху вниз в отдельном проходе, вызывая семантические действия. В отличие от большинства генераторов LALR-парсеров (Yacc, Bison, Lemon), которые выполняют семантические действия во время разбора, Yantra позволяет действию родительского правила выполняться до посещения его дочерних элементов. Это позволяет одной грамматике определять несколько обходчиков, например, один генерирующий C++ и другой — Java. Классы AST и обходчика генерируются автоматически. Yantra имеет встроенный лексический анализатор с поддержкой режимов для вложенных комментариев, необязательный объединенный однострочный вывод с сгенерированной функцией main(), и требует только компилятор C++23. Он лицензирован под MIT и сейчас находится в версии 0.5.1, предварительно перед 1.0, поддерживается одним разработчиком.
Маленький пример грамматики демонстрирует поведение обхода сверху вниз: при разборе выражения "1 + 2 + 3" сначала выводится "Adding" (корень), затем — выводы чисел. Такой порядок возможен только потому, что полное дерево существует до выполнения любого действия.
Известные ограничения документированы на странице GitHub проекта. Репозиторий доступен по адресу https://github.com/TantrixAuto/yantra, и обратная связь и вопросы приветствуются поддерживающим.
Инструмент использует CMake для сборки и производит исполняемый файл ycc для генерации парсеров из файлов грамматики.
Ключевые сущности: Компании: TantrixAuto
В чем отличие Yantra от традиционных генераторов парсеров, таких как Yacc или Bison?
Традиционные генераторы LALR-парсеров, такие как Yacc, Bison и Lemon, выполняют семантические действия во время разбора, по мере снижения каждого правила, снизу вверх. В этот момент контекст родительского правила неизвестен, что толкает грамматики к ручно построенным классам AST и отдельным проходам обхода. Yantra, напротив, сначала строит полное AST, затем обходит его сверху вниз в отдельном проходе, позволяя действию родительского правила выполняться до посещения его дочерних элементов, что обеспечивает такие функции, как несколько обходчиков из одной грамматики.
🇨🇳 简体中文
Yantra:C++ 解析器生成器,带有 AST 遍历器
Yantra 是一个 C++ 解析器生成器,它先构建完整的 AST,然后自顶向下遍历,调用语义动作。与大多数 LALR 解析器生成器(Yacc、Bison、Lemon)在解析过程中运行语义动作不同,Yantra 允许父规则的动作在其子节点被访问之前运行。这使得单个语法可以定义多个遍历器,例如一个发出 C++,另一个发出 Java。AST 和遍历器类均会自动生成。Yantra 具有内置的词法分析器,支持嵌套注释的模式,可选的合并单文件输出带有生成的 main(),仅需 C++23 编译器。它采用 MIT 许可证,当前版本为 0.5.1,处于 pre-1.0 阶段,由单个开发者维护。
一个小的示例语法展示了自顶向下遍历行为:解析 "1 + 2 + 3" 会先打印 "Adding"(根节点),随后打印数字输出。这种顺序仅在完整树在任何动作执行之前存在时才成为可能。
已知限制在项目的 GitHub 页面上有文档说明。仓库位于 https://github.com/TantrixAuto/yantra,欢迎反馈和问题提交给维护者。
该工具使用 CMake 进行构建,并生成 ycc 可执行文件,用于从语法文件生成解析器。
关键实体:公司:TantrixAuto
Yantra 与传统解析器生成器如 Yacc 或 Bison 有何不同?
传统的 LALR 解析器生成器如 Yacc、Bison 和 Lemon 在解析过程中,随着每个规则的归约,自底向上运行语义动作。此时,规则的父上下文未知,这迫使语法转向手工构建的 AST 类和单独的遍历过程。Yantra 则相反:先构建完整的 AST,然后在单独的遍历过程中自顶向下遍历,允许父规则的动作在子节点被访问之前运行,从而实现诸如从单个语法定义多个遍历器等特性。