Pe 19 martie a fost lansată biblioteca C++ Lug, care implementează un limbaj orientat pe subiect pentru exprimarea analizatorilor sintactici sub formă de gramatici extinse de expresii sintactice, și este distribuită sub licența MIT.
Capabilitățile bibliotecii:
- Sintaxă naturală, asemănătoare limbajelor generatorilor externi de parseri, cu suport pentru atribute și acțiuni semantice.
- Posibilitatea de a lucra cu gramatici contextuale, cu tabele de simboluri, condiții și predicate sintactice.
- Parserii generați sunt compilați în bytecode și executați în mașina virtuală de analiză sintactică.
- Separarea clară a regulilor sintactice și lexicale, cu posibilitatea de configurare a omisiei implicite a caracterelor de spațiu.
- Suport pentru recursie stângă directă și indirectă, cu niveluri de prioritate pentru delimitarea subexpresiilor cu recursii mixte stânga și dreapta.
- Suport complet pentru analiza textului în format UTF-8, inclusiv nivelul 1 și conformitate parțială cu nivelul 2 al standardului tehnic UTS #18 Exprimări Regulate Unicode.
- Gestionarea erorilor și recuperarea prin folosirea de puncte de eșec marcate, reguli de recuperare și gestionatori de erori.
- Urmărirea automată a numerelor de linie și coloane, lățime personalizabilă și alinierea tabulației.
- Bibliotecă header-only, care folosește doar biblioteca standard și caracteristicile standardului C++17. Este compatibilă în perspectivă cu standardele C++20 și C++23.
- Dimensiunea relativ mică a bibliotecii, cu scopul de a menține numărul total de linii în toate fișierele de antet sub 6000 de linii de cod concis.
Lista modificărilor:
- Au fost implementate directivele de colecție și atributele obiectelor. Noua directivă collect<C>[e] sintetizează o secvență sau un container asociativ de tip C, format din elemente adunate din atribute moștenite sau sintetizate în expresia e. De asemenea, au apărut directivele noi synthesize<C,A…>[e], synthesize_shared<C,A…>[e] și synthesize_unique<C,A…>[e] pentru sinteza obiectelor, pointerilor partajați și pointerilor unici, respectiv, construite din atributele componentelor în expresia e.
- A fost implementată directiva synthesize_collect, care combină directivele collect și synthesize pentru a îmbunătăți lizibilitatea codului și a reduce numărul de șabloane în construirea structurilor de date complexe din elemente analizate. Aceasta este deosebit de utilă pentru crearea de colecții înlănțuite, cum ar fi tablouri de obiecte sau containere asociative cu tipuri complexe de valori.
- A fost adăugat clasa șablon lug::recursive_wrapper pentru a gestiona dependențele circulare în arborii sintaxei abstracte, în special cele care utilizează std::variant.
- A fost implementat suportul pentru standardul Unicode 16.0.0 și a fost adăugat suportul pentru instrumentele de construcție în CMakeLists.txt.
- A fost optimizată potrivirea intervalelor și a seturilor de caractere ASCII, ceea ce a dus la o creștere semnificativă a performanței în executarea operațiunilor comune de prelucrare a textului. Au fost adăugate metode rapide specializate pentru a procesa doar caracterele ASCII, care sunt semnificativ mai rapide decât codul de prelucrare a Unicode.
- Au fost implementate opcodurile test pentru optimizarea erorilor și opcodurile repeat pentru optimizarea săriturilor prin caracterele goale. Aceste optimizări vor fi complet integrate în următoarea versiune după transformările planificate ale arborelui expresiilor.
- A fost îmbunătățită prelucrarea surselor de intrare cu un buffer mai bun și raportarea erorilor pentru std::istream, precum și a fost îmbunătățit suportul pentru modul interactiv care gestionează corect introducerea liniară pentru sesiuni terminale sau pentru gramatici orientate liniar.
- Suportul pentru std::istream a fost mutat într-un fișier header separat . Aceasta reduce timpul de compilare și minimizează dependențele de cabe pe proiecte care nu necesită funcționalitatea de intrare/ieșire prin fluxuri.
- Logica de fixare a parser-ului a fost reproiectată prin inlining-ul instrucțiunilor în lug::basic_parser pentru a se alinia mai bine cu modificările arhitecturii cadrul stivei, prezentate în versiunea 0.4.0, îmbunătățind organizarea codului și performanța.
- A fost corectată o problemă în exemplul parser-ului. BASIC, când funcțiile utilizatorului (de exemplu, FNA(X)) se finalizau în timpul evaluării. Acest lucru a fost cauzat de modificările din versiunea 0.4.0, care resetau lug::environment în timpul operațiunilor de analiză sintactică încorporate. A fost adăugată o nouă funcție lug::environment::should_reset_on_parse pentru a asigura un control fin asupra acestui comportament, permițând mediului să fie păstrat în timpul operațiunilor de analiză încorporate, atunci când este necesar.
- A fost adăugată o infrastructură complexă pentru testarea exemplelor de programe.
- A fost reconstruită ierarhia directoarelor include.
- Pentru a asigura o compatibilitate mai largă în GitHub CI, a fost adăugată suportul pentru compilatoare suplimentare (GCC 9/10/11/12, Clang 14/15/16/17).
- Analizatorii statici Clang și MSVC au fost adăugați în GitHub CI.
- În GitHub CI au fost adăugate Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) și Memory Sanitizer (MSan).
- În GitHub CI a fost adăugată integrarea clang-tidy.
- În GitHub CI a fost eliminată utilizarea Ubuntu 20.04.
Sursa: linux.org.ru
