Am 19. März wurde eine C++-Bibliothek veröffentlicht Lug, die eine eingebettete bereichsorientierte Sprache zur Darstellung von syntaktischen Analysewerkzeugen in Form von erweiterten Grammatiken für syntaktische Ausdrücke, die unter der MIT-Lizenz verbreitet wird.
Funktionen der Bibliothek:
- Eine natürliche Syntax, die an die Sprachen externer Parser-Generatoren erinnert, mit Unterstützung für Attribute und semantische Aktionen.
- Die Möglichkeit, mit kontextabhängigen Grammatiken zu arbeiten, die Symbolscripte, Bedingungen und syntaktische Prädikate unterstützen.
- Die generierten Parser werden in Bytecode kompiliert und in einer syntaktischen Analyse-Virtualmaschine ausgeführt.
- Klare Trennung von syntaktischen und lexikalischen Regeln mit der Möglichkeit, das implizite Überspringen von Leerzeichen anzupassen.
- Unterstützung für direkte und indirekte linke Rekursion mit Prioritätsstufen zur Abgrenzung von Teilausdrücken mit gemischten linken und rechten Rekursionen.
- Vollständige Unterstützung für die Analyse von Text im UTF-8-Format, einschließlich Übereinstimmung mit Level 1 und teilweiser Übereinstimmung mit Level 2 des technischen Standards UTS #18 Unicode-Reguläre Ausdrücke.
- Fehlerbehandlung und Wiederherstellung mithilfe von markierten Ausfällen, Wiederherstellungsregeln und Fehlerbehandlungsfunktionen.
- Automatische Verfolgung der Zeilen- und Spaltennummern, anpassbare Tabulatorbreite und -ausrichtung.
- Header-only Bibliothek, die ausschließlich die Standardbibliothek und Funktionen des C++17 Standards verwendet. Zukünftig kompatibel mit den Standards C++20 und C++23.
- Relativ kleine Bibliothek, die darauf abzielt, die Gesamtzahl der Zeilen in allen Header-Dateien unter 6000 Zeilen prägnanten Codes zu halten.
Änderungsprotokoll:
- Anweisungen für Sammlungen und Objektattribute wurden implementiert. Die neue Anweisung collect<C>[e] synthetisiert eine Sequenz oder einen assoziativen Container des Typs C, bestehend aus Elementen, die aus vererbten oder synthetisierten Attributen im Ausdruck e gesammelt werden. Ähnlich wurden neue Anweisungen synthesize<C,A…>[e], synthesize_shared<C,A…>[e] und synthesize_unique<C,A…>[e] für die Synthese von Objekten, gemeinsamen Zeigern und einzigartigen Zeigern implementiert, die aus den Komponentenattributen im Ausdruck e aufgebaut sind.
- Die Directive synthesize_collect wurde implementiert, die die Directives collect und synthesize kombiniert, um die Lesbarkeit des Codes zu verbessern und die Anzahl der Vorlagen bei der Erstellung komplexer Datenstrukturen aus zerlegten Elementen zu reduzieren. Dies ist besonders nützlich für die Erstellung verschachtelter Sammlungen, wie z.B. Arrays von Objekten oder assoziativen Containern mit komplexen Werttypen.
- Die template-Klasse lug::recursive_wrapper wurde hinzugefügt, um zyklische Abhängigkeiten in Bäumen des abstrakten Syntaxbaums zu bearbeiten, insbesondere solche, die std::variant verwenden.
- Die Unterstützung für den Unicode-Standard 16.0.0 wurde implementiert, und die Unterstützung für Build-Tools in CMakeLists.txt wurde hinzugefügt.
- Die Zuordnung von Bereiche- und ASCII-Zeichenmengen wurde optimiert, was zu einer erheblichen Leistungssteigerung bei gängigen Textverarbeitungsoperationen führte. Es wurden spezialisierte schnelle Methoden zur Verarbeitung nur von ASCII-Zeichen hinzugefügt, die erheblich schneller sind als der Unicode-Verarbeitungscode.
- Die Test-Op-Codes wurden implementiert, um Fehler zu optimieren, sowie die Repeat-Op-Codes zur Optimierung des Überspringens von Leerzeichen. Diese Optimierungen werden vollständig in der nächsten Version nach den geplanten Umstellungen des Ausdrucksbaums enthalten sein.
- Die Verarbeitung von Eingabeströmen wurde mit verbesserter Pufferung und Fehlerberichten für std::istream sowie erweiterten Support für den interaktiven Modus, der zeilenweisen Input für Terminalsitzungen oder linear orientierte Grammatiken korrekt verarbeitet, optimiert.
- Die Unterstützung für std::istream wurde in eine separate Header-Datei verschoben. Dies reduziert die Kompilierungszeit und minimiert die Abhängigkeiten von Headern für Projekte, die keine Funktionalität für die Eingabe-/Ausgabe-Streams benötigen.
- Die Logik der Parserfixierung wurde überarbeitet, indem Anweisungen in lug::basic_parser inline integriert wurden, um besser mit den Änderungen der Architektur des Stack-Frames, die in Version 0.4.0 eingeführt wurden, übereinzustimmen, was die Codeorganisation und -leistung verbessert hat.
- Ein Problem im Parserbeispiel wurde behoben. BASIC, wenn benutzerdefinierte Funktionen (z. B. FNA(X)) während der Auswertung abgebrochen wurden. Dies wurde durch Änderungen in Version 0.4.0 verursacht, die lug::environment während verschachtelter Parsing-Operationen zurückgesetzt haben. Eine neue Funktion lug::environment::should_reset_on_parse wurde hinzugefügt, um eine feine Kontrolle über dieses Verhalten zu ermöglichen, sodass die Umgebung während verschachtelter Parsing-Operationen erhalten bleibt, wenn dies erforderlich ist.
- Eine umfassende Infrastruktur zum Testen von Programmbeispielen wurde hinzugefügt.
- Die Verzeichnisstruktur von include wurde neu strukturiert.
- Um eine breitere Kompatibilität in GitHub CI zu gewährleisten, wurde Unterstützung für zusätzliche Compiler (GCC 9/10/11/12, Clang 14/15/16/17) hinzugefügt.
- In GitHub CI wurden statische Analyzer von Clang und MSVC hinzugefügt.
- In GitHub CI wurden Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) und Memory Sanitizer (MSan) hinzugefügt.
- In GitHub CI wurde die Integration von clang-tidy hinzugefügt.
- Die Verwendung von Ubuntu 20.04 wurde in GitHub CI entfernt.
Quelle: linux.org.ru
