19. marca bol vydaný C++ knižnica Lug, ktorá implementuje zabudovaný predmetovo orientovaný jazyk na vyjadrenie syntaktických analyzátorov vo forme rozšírených gramatík syntaktických výrazov, a je distribuovaná na základe licencie MIT.
Možnosti knižnice:
- Prírodná syntax pripomínajúca jazyky vonkajších generátorov parserov, s podporou atribútov a sémantických akcií.
- Možnosť práce s kontextovo závislými gramatikami so symbolovými tabuľkami, podmienkami a syntaktickými predikátmi.
- Generované analyzátory sú kompilované do bajtkódu a vykonávané vo virtuálnej strojnej syntaktickej analýze.
- Jasné oddelenie syntaktických a lexikálnych pravidiel s možnosťou nastavenia neexplicitného preskakovania bielych znakov.
- Podpora priamej a nepriamych ľavých rekurzií, s úrovňami priorit pre oddeľovanie podvýrazov so zmiešanými ľavými a pravými rekurziami.
- Úplná podpora analýzy textu vo formáte UTF-8, vrátane úrovne 1 a čiastočného súladu s úrovňou 2 technického štandardu UTS #18 Unicode Regular Expressions.
- Spracovanie chýb a obnova pomocou označených zlyhaní, pravidiel obnovy a obsluhy chýb.
- Automatické sledovanie čísel riadkov a stĺpcov, prispôsobiteľná šírka a zarovnanie tabulátorov.
- Header-only knižnica, ktorá využíva iba štandardnú knižnicu a možnosti štandardu C++17. Perspektívne je kompatibilná so štandardmi C++20 a C++23.
- Relatívne malá veľkosť knižnice, s cieľom udržať celkový počet riadkov vo všetkých hlavičkových súboroch pod úrovňou 6000 riadkov stručného kódu.
Zoznam zmien:
- Implementované sú direktívy kolekcií a atribútov objektov. Nová direktíva collect<C>[e] syntetizuje sekvenciu alebo asociatívny kontajner typu C, pozostávajúci z prvkov, zhromaždených z dedičných alebo syntetizovaných atribútov vo výraze e. Podobne pribudli nové direktívy synthesize<C,A…>[e], synthesize_shared<C,A…>[e] a synthesize_unique<C,A…>[e] na syntézu objektov, zdieľaných ukazovateľov a unikátnych ukazovateľov, postavených z atribútov komponentov vo výraze e.
- Implementovaná direktíva synthesize_collect, ktorá spája direktívy collect a synthesize na zlepšenie čitateľnosti kódu a zníženie počtu šablón pri vytváraní zložitých dátových štruktúr z rozdelených prvkov. To je obzvlášť užitočné pri vytváraní vnorených kolekcií, ako sú polia objektov alebo asociatívne kontajnery so zloženými typmi hodnôt.
- Pridaná šablónová trieda lug::recursive_wrapper na spracovanie cyklických závislostí v stromoch abstraktného syntaktického stromu, konkrétne tých, ktoré používajú std::variant.
- Implementovaná podpora štandardu Unicode 16.0.0 a pridaná podpora nástrojov na zostavenie v CMakeLists.txt.
- Optimalizované porovnávanie rozsahu a sady ASCII znakov, čo viedlo k výraznému zvýšeniu výkonu pri vykonávaní bežných textových spracovaní. Pridané špecializované rýchle spôsoby na spracovanie iba ASCII znakov, ktoré sú výrazne rýchlejšie ako kód spracovania Unicode.
- Implementované opkódy test na optimalizáciu chýb a opkódy repeat na optimalizáciu preskakovania bielych znakov. Tieto optimalizácie budú úplne zahrnuté v nasledujúcom vydaní po plánovaných transformáciách stromu výrazov.
- Vylepšené spracovanie vstupných zdrojov s vylepšeným bufferingom a hlásením chýb pre std::istream, rovnako ako zlepšená podpora interaktívneho režimu, ktorá správne spracováva riadkový vstup pre terminálové relácie alebo pre lineárne orientované gramatiky.
- Podpora std::istream bola presunutá do samostatného hlavičkového súboru . To znižuje čas kompilácie a minimalizuje závislosti na hlavičkách pre projekty, ktoré nepotrebujú funkčnosť prúdu vstupu/výstupu.
- Prepracovaná logika fixácie parsera inlinovaním inštrukcií v lug::basic_parser pre lepšiu zhody s architektonickými zmenami zásobníkového rámca predstavenými vo verzii 0.4.0, čo zlepšilo organizáciu kódu a výkon.
- Opravený problém v príklade parsera BASIC, keď používateľské funkcie (napríklad FNA(X)) skončili počas hodnotenia. Toto bolo spôsobené zmenami vo verzii 0.4.0, ktoré resetovali lug::environment počas vnorených syntaktických operácií. Bola pridaná nová funkcia lug::environment::should_reset_on_parse na zabezpečenie jemnej kontroly nad týmto správaním, aby sa umožnilo prostrediu uchovať sa počas vnorených analýz, keď je to potrebné.
- Bola pridaná komplexná infraštruktúra na testovanie príkladov programu.
- Bola prebudovaná hierarchia adresárov include.
- Na zabezpečenie širšej kompatibility v GitHub CI bola pridaná podpora pre ďalšie kompilátory (GCC 9/10/11/12, Clang 14/15/16/17).
- Do GitHub CI boli pridané statické analyzátory Clang a MSVC.
- Do GitHub CI boli pridané Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) a Memory Sanitizer (MSan).
- Do GitHub CI bola pridaná integrácia clang-tidy.
- Z GitHub CI bola odstránená podpora pre Ubuntu 20.04.
Zdroj: linux.org.ru
