Lug 0.5.0

Lug 0.5.0

Am 19. MĂ€rz wurde die C++-Bibliothek veröffentlicht Lug, die eine eingebettete domĂ€nenspezifische Sprache zur Darstellung von Parsern in Form von erweiterten Grammatiken syntaktischer AusdrĂŒcke, und die unter der MIT-Lizenz verbreitet wird.

Funktionen der Bibliothek:

  • NatĂŒrliches Syntax, das an externe Parser-Generatoren erinnert, mit UnterstĂŒtzung fĂŒr Attribute und semantische Aktionen.
  • Möglichkeit, mit kontextabhĂ€ngigen Grammatiken mit Symboltabellen, Bedingungen und syntaktischen PrĂ€dikaten zu arbeiten.
  • Generierte Parser werden in Bytecode kompiliert und in der Parser-Virtual Machine ausgefĂŒhrt.
  • Deutliche Trennung von syntaktischen und lexikalischen Regeln mit der Möglichkeit, das implizite Überspringen von Leerzeichen anzupassen.
  • UnterstĂŒtzung direkter und indirekter linker Rekursion mit PrioritĂ€tsstufen zur Abgrenzung von TeilausdrĂŒcken mit gemischter linker und rechter Rekursion.
  • VollstĂ€ndige UnterstĂŒtzung der Verarbeitung von Text im UTF-8-Format, einschließlich Level 1 und teilweiser Übereinstimmung mit Level 2 des technischen Standards UTS #18 Unicode RegulĂ€re AusdrĂŒcke.
  • Fehlerbehandlung und Wiederherstellung durch markierte FehlschlĂ€ge, Wiederherstellungsregeln und Fehlerbehandler.
  • Automatische Überwachung von Zeilen- und Spaltenzahlen, anpassbare Breite und Tabulatorausrichtung.
  • Header-only-Bibliothek, die nur die Standardbibliothek und die Funktionen des C++17-Standards verwendet. ZukĂŒnftig kompatibel mit den Standards C++20 und C++23.
  • Relativ geringe GrĂ¶ĂŸe der Bibliothek, mit dem Ziel, die Gesamtzahl der Zeilen in allen Header-Dateien unter 6000 Zeilen prĂ€gnanten Codes zu halten.

Änderungsprotokoll:

  • Sammlung der Direktiven und der Objektattribute wurden implementiert. Die neue Direktive collect<C>[e] synthetisiert eine Sequenz oder einen assoziativen Container vom Typ C, bestehend aus Elementen, die aus geerbten oder synthetisierten Attributen in der Ausdruck e gesammelt werden. Ebenso sind neue Direktiven wie 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 mit Attributen aus Komponenten im Ausdruck e hinzugekommen.
  • Die Direktive synthesize_collect wurde implementiert, die die Direktiven collect und synthesize kombiniert, um die Lesbarkeit des Codes zu verbessern und die Anzahl der Vorlagen beim Aufbau komplexer Datenstrukturen aus analysierten Elementen zu reduzieren. Dies ist besonders nĂŒtzlich fĂŒr die Erstellung von verschachtelten Sammlungen, wie z. B. Arrays von Objekten oder assoziativen Containern mit komplexen Werttypen.
  • Die templatisierte Klasse lug::recursive_wrapper wurde hinzugefĂŒgt, um zyklische AbhĂ€ngigkeiten in abstrakten SyntaxbĂ€umen zu behandeln, insbesondere mit std::variant.
  • Die UnterstĂŒtzung fĂŒr den Unicode-Standard 16.0.0 wurde implementiert, sowie die UnterstĂŒtzung fĂŒr Build-Tools in CMakeLists.txt hinzugefĂŒgt.
  • Das Abgleichen von Bereichen und ASCII-ZeichensĂ€tzen wurde optimiert, was zu einer erheblichen Leistungssteigerung bei hĂ€ufigen Textverarbeitungsoperationen fĂŒhrte. Es wurden spezialisierte Schnellmethoden fĂŒr die Verarbeitung von ASCII-Zeichen hinzugefĂŒgt, die deutlich schneller sind als der Code fĂŒr die Unicode-Verarbeitung.
  • Die Opcodes test zur Optimierung von Fehlern und die Opcodes repeat zur Optimierung des Überspringens von Leerzeichen wurden implementiert. Diese Optimierungen werden in der nĂ€chsten Version nach den geplanten Änderungen am Ausdrucksbaum vollstĂ€ndig aktiviert.
  • Die Verarbeitung von Eingabequellen wurde mit verbesserter Pufferung und Fehlerberichterstattung fĂŒr std::istream optimiert, und die UnterstĂŒtzung fĂŒr den interaktiven Modus wurde verbessert, die die zeilenweise Eingabe fĂŒr Terminalsitzungen oder linear orientierte Grammatiken korrekt behandelt.
  • Die UnterstĂŒtzung fĂŒr std::istream wurde in eine separate Header-Datei verschoben. Dies reduziert die Kompilierzeit und minimiert die AbhĂ€ngigkeiten von Headern fĂŒr Projekte, die keine Funktionsweise der Eingabe-/Ausgabeströme benötigen.
  • Die Logik des Parsers wurde durch das Inline-Programmieren von Anweisungen in lug::basic_parser ĂŒberarbeitet, um besser an die Änderungen der Architektur des Stapelrahmens, die in Version 0.4.0 eingefĂŒhrt wurden, angepasst zu werden, was die Codeorganisation und die Leistung verbesserte.
  • Ein Problem im Parserbeispiel wurde behoben. BASIC, wenn benutzerdefinierte Funktionen (z. B. FNA(X)) wĂ€hrend der Auswertung abgeschlossen wurden. Dies wurde durch Änderungen in Version 0.4.0 verursacht, die lug::environment wĂ€hrend verschachtelter Parsing-Operationen zurĂŒcksetzten. Eine neue Funktion lug::environment::should_reset_on_parse wurde hinzugefĂŒgt, um eine feinere Kontrolle ĂŒber dieses Verhalten zu gewĂ€hrleisten, sodass die Umgebung wĂ€hrend verschachtelter Parsing-Operationen, wenn nötig, beibehalten werden kann.
  • Umfassende Testinfrastruktur fĂŒr Programmbeispiele hinzugefĂŒgt.
  • Die Verzeichnisstruktur fĂŒr include wurde neu organisiert.
  • Zur GewĂ€hrleistung einer breiteren KompatibilitĂ€t in GitHub CI wurde die UnterstĂŒtzung zusĂ€tzlicher Compiler (GCC 9/10/11/12, Clang 14/15/16/17) hinzugefĂŒgt.
  • Statische Analyzer Clang und MSVC wurden zu GitHub CI hinzugefĂŒgt.
  • Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) und Memory Sanitizer (MSan) wurden zu GitHub CI hinzugefĂŒgt.
  • Die Integration von clang-tidy wurde zu GitHub CI hinzugefĂŒgt.
  • Die Verwendung von Ubuntu 20.04 wurde aus GitHub CI entfernt.

Quelle: linux.org.ru

60GB SSD 8Gb DDR4