19. märtsil ilmus C++ raamatukogu Lug, mis rakendab sisseehitatud objektorienteeritud keelt süntaksianalüsaatorite väljendamiseks laiendatud süntaksite väljendite grammatikat, ja jagatakse MIT litsentsi alusel.
Teegi võimalused:
- Looduslik süntaks, mis meenutab väliseid parserite genereerimise keeli, toetades atribuutide ja semantiliste tegevuste kasutamist.
- Võime töötada konteksti sõltuvate grammatikatega, mis sisaldavad sümbolite tabeleid, tingimusi ja süntaktilisi predikaate.
- Genereeritud parserid kompileeritakse byte-koodiks ja käivitatakse süntaksite analüüsi virtuaalses masinas.
- Selge eraldatus süntaktiliste ja leksikaalsete reeglite vahel, võimaldades kohandada varjatud tühikute vahelejätmist.
- Toetatakse otsest ja kaudset vasakut rekursiooni, koos prioriteetide tasemetega, et eraldada alamnäidisid, kus esinevad segatud vasakud ja paremad rekursioonid.
- Täielik support UTF-8 formaadis teksti parsimiseks, sealhulgas tase 1 ja osaline vastavus tase 2 tehnilisele standardile UTS #18 Unicode regulaarsed avaldised.
- Vigade haldus ja taastamine märgistatud tõrgete, taastamisreeglite ja vigade käsitlejate abil.
- Automaatne ridade ja veergude numbrite jälgimine, kohandatav vahe ja tahvli joondamine.
- Ainult päisefailidest koosnev teek, mis kasutab ainult standardset teeki ja C++17 standardi võimalusi. Tulevikus on see ühilduv C++20 ja C++23 standarditega.
- Raamatukogu suhteliselt väike suurus, eesmärgiga hoida kõigi päisefailide koguste arv alla 6000 rida lakoonilist koodi.
Muudatuste nimekiri:
- Teostatud on kogumite ja objektide atribuutide direktiivid. Uus direktiiv collect<C>[e] sünteesib järjestuse või assotsiatiivse konteineri tüüpi C, mis koosneb elementidest, mis on kogutud päritud või sünteesitud atribuutidest väljendis e. Samuti on lisandunud uued direktiivid synthesize<C,A…>[e], synthesize_shared<C,A…>[e] ja synthesize_unique<C,A…>[e], mis sünteesivad vastavalt objekte, jagatud näitajaid ja unikaalseid näitajaid, mis on koostatud komponentide atribuutidest väljendis e.
- Rakendatud on директиiv synthesize_collect, mis ühendab collect ja synthesize direktiivid, et parandada koodi loetavust ja vähendada šabloonide arvu keerukate andmestruktuuride koostamisel. See on eriti kasulik, kui luua sisseurutatud kollektsioone, nagu objektimassiivid või assotsiatiivsed konteinerid koos keerukate väärtuse tüüpidega.
- Lisatud on šabloonklass lug::recursive_wrapper, et käsitleda tsüklilisi sõltuvusi abstraktse süntaksi puudes, eelkõige std::variant'i kasutamisel.
- Rakendatud on Unicode 16.0.0 standardi toetamine ja teave CMakeLists.txt abivahendite toetamiseks.
- Optimeeritud on vahemike ja ASCII-märkide komplekti vastavust, mis on toonud kaasa märkimisväärse jõudluse kasvu sagedaste tekstiprotsessimise operatsioonide läbiviimisel. Lisatud on spetsialiseeritud kiired meetodid ainult ASCII-märkide töötlemiseks, mis on oluliselt kiiremad Unicode'i töötlemise koodist.
- Teostatud on test-opkoodid vigade optimeerimiseks ja repeat-opkoodid tühikute vahekorra optimeerimiseks. Need optimeerimised lisatakse täielikult järgmisse väljaandesse pärast planeeritud väljendipuude ümberkujundusi.
- Sisse sisendallikate töötlemine on paranenud, pakkudes paremat puhverdust ja veateate edastamist std::istream jaoks, samuti on paranenud interaktiivse režiimi tugi, mis käsitleb rida-realt sisendit korrektselt terminali sessioonide või lineaarselt suunatud grammatikate jaoks.
- Tugi std::istream jaoks on viidud eraldi pealkirjafaili . See vähendab kompileerimise aega ja minimeerib pealkirjade sõltuvusi projektides, mis ei vaja voogedastuse funktsionaalsust.
- Parseri lukustamise loogikat on ümber töötatud, sisestades juhised lug::basic_parserisse, et paremini vastata versioonis 0.4.0 tutvustatud virnaraami arhitektuuri muudatustele, mis on parandanud koodi korraldust ja jõudlust.
- Parandatud on probleem parseri näites. BASIC, kui kasutajafunktsioonid (nt FNA(X)) lõpetati hindamise käigus. See oli tingitud muudatustest versioonis 0.4.0, mis lähtestavad lug::environment süntaktiliste analüüside ajal. Lisatud uus funktsioon lug::environment::should_reset_on_parse, et tagada peen kontroll selle käitumise üle, võimaldades keskkonna säilitamist süntaktiliste analüüside ajal, kui see on vajalik.
- Lisatud ulatuslik testimisinfrastruktuur näidiste jaoks.
- Uuendatud include kataloogide hierarhiat.
- Laiema ühilduvuse tagamiseks on GitHub CI-sse lisatud toetused täiendavatele kompilaatoritele (GCC 9/10/11/12, Clang 14/15/16/17).
- GitHub CI-sse on lisatud staatilised analüsaatorid Clang ja MSVC.
- GitHub CI-sse on lisatud Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) ja Memory Sanitizer (MSan).
- GitHub CI-sse on lisatud integreerimine clang-tidy.
- GitHub CI-s on lõpetatud Ubuntu 20.04 kasutamine.
Allikas: linux.org.ru
