19. ožujka objavljena je C++ biblioteka Lug, koja implementira ugrađeni predmetno orijentirani jezik za izražavanje sintaktičkih analizatora u obliku proširenih gramatika sintaktičkih izraza, i distribuira se pod MIT licencom.
Mogućnosti biblioteke:
- Prirodna sintaksa koja podsjeća na jezike vanjskih generatora parsera, uz podršku za atribute i semantičke akcije.
- Mogućnost rada s kontekstno zavisnim gramatikama uz tablice simbola, uvjete i sintaktičke predikate.
- Generirani parseri se kompiliraju u bajtkod i izvršavaju u virtualnoj mašini sintaktičke analize.
- Jasna podjela sintaktičkih i leksičkih pravila uz mogućnost prilagođavanja implicitnog preskakanja razmaknih simbola.
- Podrška za izravnu i neizravnu lijevu rekurziju, s razinama prioriteteta za razdvajanje podizraza sa miješanim lijevim i desnim rekurzijama.
- Potpuna podrška za parsiranje teksta u UTF-8 formatu, uključujući razinu 1 i djelomično usklađenje s razinom 2 tehničkog standarda UTS #18 Unicode Redovni Izrazi.
- Obrada grešaka i obnova pomoću označenih grešaka, pravila obnove i rukovatelja greškama.
- Automatsko praćenje brojeva redaka i stupaca, prilagodljiva širina i poravnanje tabulacije.
- Header-only biblioteka koja koristi samo standardnu biblioteku i mogućnosti C++17. Perspektivno kompatibilna sa standardima C++20 i C++23.
- Relativno mala veličina biblioteke, s ciljem da ukupan broj redaka u svim zaglavljima bude ispod 6000 redaka sa sažetim kodom.
Popis promjena:
- Implementirane su direktive kolekcija i atributa objekata. Nova direktiva collect<C>[e] sintetizira sekvencu ili asocijativni kontejner tipa C, sastavljen od elemenata prikupljenih iz naslijeđenih ili sintetiziranih atributa u izrazu e. Slično tome, uvedene su nove direktive synthesize<C,A…>[e], synthesize_shared<C,A…>[e] i synthesize_unique<C,A…>[e] za sintezu objekata, zajedničkih pokazivača i jedinstvenih pokazivača, respektivno, iz atributa komponenti u izrazu e.
- Implementirana je direktiva synthesize_collect, koja spaja direktive collect i synthesize kako bi poboljšala čitljivost koda i smanjila broj predložaka prilikom izgradnje složenih struktura podataka iz razdvojenih elemenata. Ovo je posebno korisno za kreiranje ugniježdenih kolekcija, poput nizova objekata ili asocijativnih kontejnera sa složenim tipovima vrednosti.
- Dodana je predložak klasa lug::recursive_wrapper za obradu cikličnih zavisnosti u stablima apstraktnog sintaksa, posebno onim koji koriste std::variant.
- Implementirana je podrška za Unicode standard 16.0.0 i dodana je podrška za alate za izgradnju u CMakeLists.txt.
- Optimizirano je poređenje opsega i skupa ASCII-karaktera, što je dovelo do značajnog povećanja performansi prilikom izvođenja uobičajenih operacija obrade teksta. Dodane su specijalizovane brze metode za obradu samo ASCII-karaktera koje su znatno brže od koda za obradu Unicode.
- Implementirani su opkodi test za optimizaciju grešaka i opkodi repeat za optimizaciju preskakanja belih znakova. Ove optimizacije će biti potpuno integrovane u sledećem izdanju nakon planiranih transformacija stabla izraza.
- Unapređena je obrada ulaznih izvora sa poboljšanim keširanjem i izveštavanjem o greškama za std::istream, kao i poboljšana podrška za interaktivni režim, koja ispravno obradi ulaz liniju po liniju za terminalske sesije ili za linearno orijentisane gramatike.
- Podrška za std::istream premestena je u poseban header fajl . Ovo smanjuje vreme kompilacije i minimizira zavisnosti od headera za projekte kojima nije potrebna funkcionalnost ulaz/izlaz.
- Preuređena je logika fiksiranja parsera inlinanjem instrukcija u lug::basic_parser za bolje usklađivanje sa promenama arhitekture stika okvira predstavljenim u verziji 0.4.0, što je poboljšalo organizaciju koda i performanse.
- Ispravljena je greška u primeru parsera. BASIC, kada su se korisničke funkcije (npr. FNA(X)) završavale tijekom evaluacije. To je uzrokovano promjenama u verziji 0.4.0, koje su resetirale lug::environment tijekom ugniježđenih operacija parsiranja. Dodana je nova funkcija lug::environment::should_reset_on_parse za osiguranje precizne kontrole nad ovim ponašanjem, što omogućava očuvanje okruženja tijekom ugniježdenih operacija analize kada je to potrebno.
- Dodana je sveobuhvatna infrastruktura za testiranje uzoraka programa.
- Reorganizirana je hijerarhija direktorija include.
- Za osiguranje šire kompatibilnosti u GitHub CI dodana je podrška za dodatne kompajlere (GCC 9/10/11/12, Clang 14/15/16/17).
- U GitHub CI dodani su statički analizatori Clang i MSVC.
- U GitHub CI dodani su Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) i Memory Sanitizer (MSan).
- U GitHub CI dodana je integracija clang-tidy.
- U GitHub CI je uklonjena upotreba Ubuntu 20.04.
Izvor: linux.org.ru
