Më 19 mars u publikua një bibliotekë C++ Lug, që implementon një gjuhë të orientuar nga objekti për të shprehur analizatorët sintaksorë si gramatika të zgjeruara të shprehjeve sintaksore, dhe shpërndahet nën licencën MIT.
Mundësitë e bibliotekës:
- Sintaksa natyrale, e ngjashme me gjuhët e gjeneratorëve të jashtëm të parserëve, me mbështetje për atribute dhe veprime semantike.
- Mundësia për të punuar me gramatika kontekstualisht të varura me tabela simboresh, kushte dhe predikate sintaksore.
- Parserët e gjeneruar kompilohen në kod bajt dhe ekzekutohen në një makinë virtuale të analizës sintaksore.
- Shkëputje e qartë e rregullave sintaksore dhe leksikore me mundësi për të konfiguruar kalimin e fshehtë të karaktereve të zbrazët.
- Mbështetje për rekursivitetin e majtë direkt dhe të tërthortë, me nivele prioritare për ndarjen e nën-shprehjeve me rekursivitet të përzier majtas dhe djathtas.
- Mbështetje e plotë për analizimin e teksteve në formatin UTF-8, duke përfshirë nivelin 1 dhe përputhjen e pjesshme me nivelin 2 të standardit teknik UTS #18 Regulat e Regjistrimit të Unicode.
- Trajtimi i gabimeve dhe rimëkëmbja përmes dështimeve të shënuara, rregullave të rimëkëmbjes dhe trajtuesve të gabimeve.
- Ndjekje automatike të numrave të rreshtave dhe kolonave, gjerësia dhe rreshtimi i tabulave i konfiguruar.
- BibliotekĂ« vetĂ«m-header, qĂ« pĂ«rdor vetĂ«m bibliotekĂ«n standarde dhe mundĂ«sitĂ« e standardit C++17. ĂshtĂ« perspektivisht e pĂ«rshtatshme me standardet C++20 dhe C++23.
- Masa relativisht e vogël e bibliotekës, me qëllimin për të mbajtur numrin total të linjave në të gjitha skedarët e kokës nën 6000 linja kodi të përmbledhur.
nöqtÉlÉri ilÉ
- JanĂ« implementuar direktivat e koleksioneve dhe atributeve tĂ« objekteve. Direktiva e re collect<C>[e] sintetizon njĂ« kapsullĂ« ose kontejner asociativ tĂ« tipit C, i pĂ«rbĂ«rĂ« nga elemente tĂ« mbledhura nga atributet e trashĂ«guara ose tĂ« sintetizuara nĂ« shprehjen e. NjĂ«lloj, janĂ« shfaqur gjithashtu direktivat e reja synthesize<C,AâŠ>[e], synthesize_shared<C,AâŠ>[e] dhe synthesize_unique<C,AâŠ>[e] pĂ«r sintetizimin e objekteve, pikave tĂ« zakonshme dhe pikave unike pĂ«rkatĂ«sisht, tĂ« ndĂ«rtuara nga atributet e komponenteve nĂ« shprehjen e.
- ĂshtĂ« realizuar direktiva synthesize_collect, e cila kombinon direktivat collect dhe synthesize pĂ«r tĂ« pĂ«rmirĂ«suar lexueshmĂ«rinĂ« e kodit dhe pĂ«r tĂ« zvogĂ«luar numrin e shablloneve gjatĂ« ndĂ«rtimit tĂ« strukturave tĂ« dhĂ«nash komplekse nga elementĂ«t e shkĂ«putur. Kjo Ă«shtĂ« veçanĂ«risht e dobishme pĂ«r krijimin e koleksioneve tĂ« thelluara, siç janĂ« array-t e objekteve ose kontejnerĂ«t asociativĂ« me lloje tĂ« ndĂ«rlikuara vlerash.
- ĂshtĂ« shtuar klasa shabllon lug::recursive_wrapper pĂ«r trajtimin e varĂ«sive ciklike nĂ« pemĂ«t e sintaksĂ«s abstrakte, veçanĂ«risht duke pĂ«rdorur std::variant.
- ĂshtĂ« realizuar mbĂ«shtetje pĂ«r standardin Unicode 16.0.0 dhe Ă«shtĂ« shtuar mbĂ«shtetje pĂ«r mjetet e ndĂ«rtimit nĂ« CMakeLists.txt.
- ĂshtĂ« optimizuar pĂ«rshtatja e intervaleve dhe grupeve tĂ« simboleve ASCII, duke çuar nĂ« njĂ« rritje tĂ« konsiderueshme tĂ« performancĂ«s gjatĂ« kryerjes sĂ« operacioneve tĂ« zakonshme tĂ« pĂ«rpunimit tĂ« tekstit. JanĂ« shtuar mĂ«nyra tĂ« specializuara tĂ« shpejta pĂ«r tĂ« trajtuar vetĂ«m simbole ASCII, tĂ« cilat janĂ« shumĂ« mĂ« tĂ« shpejta se kodi i pĂ«rpunimit tĂ« Unicode.
- ĂshtĂ« realizuar opkodet test pĂ«r optimizimin e gabimeve dhe opkodet repeat pĂ«r optimizimin e shkĂ«putjeve tĂ« simboleve bosh. KĂ«to optimizime do tĂ« pĂ«rfshihen plotĂ«sisht nĂ« lĂ«shimin e ardhshĂ«m pas transformimeve tĂ« planifikuara tĂ« pemĂ«s sĂ« shprehjeve.
- ĂshtĂ« pĂ«rmirĂ«suar pĂ«rpunimi i burimeve tĂ« inputit me mbĂ«shtetje tĂ« pĂ«rmirĂ«suar pĂ«r buffer dhe raportimin e gabimeve pĂ«r std::istream, si dhe Ă«shtĂ« pĂ«rmirĂ«suar mbĂ«shtetje pĂ«r mĂ«nyrĂ«n interaktive, e cila trajton saktĂ« inputin rresht pĂ«r sesionet terminale ose pĂ«r gramatika linear-orientuara.
- Mbështetja për std::istream është zhvendosur në një skedar titulli të veçantë <lug/iostream.hpp>. Kjo ul kohën e kompilimit dhe minimizon varësitë nga titujt për projektet që nuk kërkojnë funksionalitetin e input/output-it të fluxit.
- Logjika e kapjes së parser-it është rishikuar përmes inlinimit të instrukcioneve në lug::basic_parser për të përmirësuar përputhshmërinë me ndryshimet arkitekturale të kuadrit të stack-ut, të prezantuara në versionin 0.4.0, duke përmirësuar organizimin e kodit dhe performancën.
- ĂshtĂ« rregulluar njĂ« problem nĂ« shembullin e parser-it BASIC, kur funksionet pĂ«rdoruese (p.sh. FNA(X)) pĂ«rfundonin gjatĂ« vlerĂ«simit. Kjo u shkaktua nga ndryshimet nĂ« versionin 0.4.0, tĂ« cilat rivendosnin lug::environment gjatĂ« operacioneve tĂ« thella tĂ« analizĂ«s sintaksore. Shtua njĂ« funksion i ri lug::environment::should_reset_on_parse pĂ«r tĂ« siguruar kontroll tĂ« saktĂ« mbi kĂ«tĂ« sjellje, duke lejuar ambientin tĂ« ruhet gjatĂ« operacioneve tĂ« thella tĂ« analizĂ«s, kur Ă«shtĂ« e nevojshme.
- Shtua një infrastrukturë komplekse për testimin e shembujve të programeve.
- Rikonstruktuar hierarkia e katalogëve include.
- Për të siguruar një përputhshmëri më të gjerë në GitHub CI, shtua mbështetje për kompilatorë të tjerë (GCC 9/10/11/12, Clang 14/15/16/17).
- Shtuar analizatorë statikë Clang dhe MSVC në GitHub CI.
- Shtuar Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) dhe Memory Sanitizer (MSan) në GitHub CI.
- Shtuar integrimin e clang-tidy në GitHub CI.
- Hequr përdorimi i Ubuntu 20.04 në GitHub CI.
Burimi: linux.org.ru
