Më 19 mars, u publikua biblioteka C++ Lug, që implementon një gjuhë me fokus të veçantë për shprehjen e analizatorëve sintaktikë si gramatika të zgjeruara të shprehjeve sintaktike, dhe shpërndahet nën licencën MIT.
Veçoritë e bibliotekës:
- Sintaksë natyrale, e ngjashme me gjuhët e gjeneratorëve jashtmëdhenës, me mbështetje për atributet dhe veprime semantike.
- Mundësia për të punuar me gramatika të varura nga konteksti, me tabela simbolesh, kushte dhe predikate sintaktike.
- Analizuesit e gjeneruar kompilohet në kod të ndërsjellë dhe ekzekutohen në makinerinë virtuale të analizës sintaktike.
- Përçim i qartë i rregullave sintaktike dhe leksikore me mundësi për përshtatjen e kalimeve të paqarta të hapësirave.
- Mbështetje për rekursivitetin e drejtpërdrejtë dhe tërthor, me nivele precedence për ndarjen e nënshprehjeve me rekursivitet të përzier.
- Mbështetje e plotë për analizimin e teksteve në formatin UTF-8, duke përfshirë nivelin 1 dhe përputhje të pjesshme me nivelin 2 të standardit teknik UTS #18 Regex të Unicode.
- Përpunimi i gabimeve dhe rikuperimi përmes gabimeve të shënuara, rregullave të rikuperimit dhe trajtuesve të gabimeve.
- Gjeometria automatike e numrave të rreshtave dhe kolonave, gjerësi e personalizuar dhe rreshtim tabulash.
- Bibliotekë vetëm për kokë, e cila përdor vetëm bibliotekën standarde dhe mundësitë e standardit C++17. E pajtueshme me standardet C++20 dhe C++23 në perspektivë.
- Madhësi relativisht e vogël e bibliotekës, me qëllim për të mbajtur numrin total të linjave në të gjitha skedarët e kokës nën 6000 rreshta të kodit të shkurtër.
Lista e ndryshimeve:
- DirektivĂ«t e koleksioneve dhe atributet e objekteve janĂ« realizuar. DirektivĂ« e re collect<C>[e] sintezat njĂ« sekuencĂ« ose konteiner asociativ tĂ« tipit C, i pĂ«rbĂ«rĂ« nga elemente tĂ« mbledhura nga atributet e trashĂ«guara ose tĂ« sintetizuara nĂ« shprehjen e. Po ashtu, janĂ« futur drejtime tĂ« reja synthesize<C,AâŠ>[e], synthesize_shared<C,AâŠ>[e] dhe synthesize_unique<C,AâŠ>[e] pĂ«r tĂ« sintetizuar objekte, tregues tĂ« pĂ«rbashkĂ«t dhe tregues unikĂ« pĂ«rkatĂ«sisht, tĂ« ndĂ«rtuar nga atributet e komponentĂ«ve nĂ« shprehjen e.
- ĂshtĂ« realizuar direktiva synthesize_collect, e cila bashkon direktivat collect dhe synthesize pĂ«r tĂ« pĂ«rmirĂ«suar lexueshmĂ«rinĂ« e kodit dhe pĂ«r tĂ« zvogĂ«luar numrin e shablloneve kur krijoni struktura tĂ« komplikuara tĂ« dhĂ«nash nga elementĂ« tĂ« analizuar. Kjo Ă«shtĂ« veçanĂ«risht e dobishme pĂ«r krijimin e koleksioneve tĂ« thelluara, tĂ« tilla si arrat 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, sidomos ato qĂ« pĂ«rdorin 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 grupi i simboleve ASCII, e cila ka çuar nĂ« njĂ« rritje tĂ« konsiderueshme tĂ« performancĂ«s gjatĂ« kryerjes sĂ« operacioneve tĂ« zakonshme tĂ« pĂ«rpunimit tĂ« tekstit. JanĂ« shtuar metoda tĂ« specializuara tĂ« shpejta pĂ«r tĂ« pĂ«rpunuar vetĂ«m simbolet ASCII, tĂ« cilat janĂ« dukshĂ«m mĂ« tĂ« shpejta se kodi i pĂ«rpunimit tĂ« Unicode.
- Shtohen opcode-të test për optimizimin e gabimeve dhe opcode-të repeat për optimizimin e shpërndarjes së karaktereve bosh. Këto optimizime do të përfshihen plotësisht në publikimin e ardhshëm pas transformimeve të planifikuara të pemës së shprehjeve.
- Përmirësohet përpunimi i burimeve të hyrjes me një tamponim të përmirësuar dhe raportim gabimesh për std::istream, si dhe përmirësohet mbështetja për modin interaktiv, i cili trajton saktësisht hyrjen rresht pas rreshti për seancat terminale ose për gramatika të orientuara në linjë.
- Mbështetja për std::istream është transferuar në një skedar të veçantë titulli . Kjo zvogëlon kohën e kompilimit dhe minimizon varësitë nga titujt për projektet që nuk kërkojnë funksionalitetin e hyrjes/daljes nga kanali.
- Logjika e korrigjimit të parserit është rinovuar duke inkorporuar instrukcionet në lug::basic_parser për një përputhje më të mirë me ndryshimet e arkitekturës së kornizës stacked, të paraqitura në versionin 0.4.0, e cila përmirësoi organizimin e kodit dhe performancën.
- ĂshtĂ« zgjidhur njĂ« problem nĂ« shembullin e parserit BASIC, kur funksionet pĂ«rdoruesve (p.sh., FNA(X)) pĂ«rfunduan gjatĂ« vlerĂ«simit. Ky problem u shkaktua nga ndryshimet nĂ« versionin 0.4.0, tĂ« cilat rivendosnin lug::environment gjatĂ« operacioneve tĂ« brendshme tĂ« analizĂ«s. E shtuar njĂ« funksion i ri lug::environment::should_reset_on_parse pĂ«r tĂ« siguruar kontroll mĂ« tĂ« hollĂ«sishĂ«m mbi kĂ«tĂ« sjellje, duke lejuar mjedisin tĂ« ruhet gjatĂ« operacioneve tĂ« brendshme tĂ« analizĂ«s, kur Ă«shtĂ« e nevojshme.
- Shtuar një infrastrukturë gjithëpërfshirëse për testimin e shembujve të programeve.
- Ristrukturuar hierarkia e katalogëve përfshirës.
- Për të siguruar një përputhshmëri më të gjerë në GitHub CI, shtuar mbështetje për kompilerë të tjerë (GCC 9/10/11/12, Clang 14/15/16/17).
- Shtuar analizues statik Clang dhe MSVC në GitHub CI.
- Shtuar Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) dhe Memory Sanitizer (MSan) në GitHub CI.
- Shtuar integrimin clang-tidy në GitHub CI.
- Hequr përdorimi i Ubuntu 20.04 në GitHub CI.
Burimi: linux.org.ru
