Den 19 mars slÀpptes C++-biblioteket Lug, som implementerar en inbÀddad domÀnspecifik sprÄk för att uttrycka parserbyggare i form av utökade grammatiker för syntaxuttryck, och distribueras under MIT-licens.
Möjligheter i biblioteket:
- Ett naturligt syntax som pÄminner om sprÄk för externa parsergeneratorer, med stöd för attribut och semantiska handlingar.
- Möjlighet att arbeta med kontextberoende grammatik med symboltabeller, villkor och syntaktiska predikat.
- De genererade parserna kompileras till bytekod och körs i en parsermaskin.
- Tydlig uppdelning av syntaktiska och lexikala regler med möjlighet att konfigurera implicit utelÀmnande av vita tecken.
- Stöd för direkt och indirekt vÀnster rekursion, med prioritetsnivÄer för att sÀrskilja underuttryck med blandade vÀnster och höger rekursioner.
- FullstÀndigt stöd för analys av text i UTF-8-format, inklusive nivÄ 1 och delvis överensstÀmmelse med nivÄ 2 i den tekniska standarden UTS #18 Unicode Regular Expressions.
- Felkontroll och ÄterstÀllning med markerade fel, ÄterstÀllningsregler och felhanterare.
- Automatisk spÄrning av rad- och kolumnnummer, anpassningsbar bredd och tabulatorjustering.
- Ett header-only-bibliotek som endast anvÀnder standardbiblioteket och funktioner frÄn C++17-standarden. FramtidssÀkert kompatibelt med standarderna C++20 och C++23.
- Relativt liten storlek pÄ biblioteket, med syftet att hÄlla det totala antalet rader i alla headerfiler under 6000 rader koncis kod.
Ăndringslista:
- Direktiv för samlingar och objektattribut har implementerats. Det nya direktivet collect<C>[e] syntetiserar en sekvens eller associativ behĂ„llare av typ C, bestĂ„ende av element insamlade frĂ„n Ă€rvda eller syntetiserade attribut i uttrycket e. PĂ„ liknande sĂ€tt har nya direktiv synthesize<C,AâŠ>[e], synthesize_shared<C,AâŠ>[e] och synthesize_unique<C,AâŠ>[e] införts för att syntetisera objekt, delade pekare och unika pekare respektive, byggda av komponenternas attribut i uttrycket e.
- Direktivet synthesize_collect har införts, vilket kombinerar direktiven collect och synthesize för att förbÀttra kodens lÀsbarhet och minska antalet mallar vid byggande av komplexa datastukturer frÄn analyserade element. Detta Àr sÀrskilt anvÀndbart för att skapa inbÀddade samlingar, sÄsom array av objekt eller associativa containrar med komplexa vÀrdetyper.
- Den mallbaserade klassen lug::recursive_wrapper har lagts till för att hantera cykliska beroenden i abstrakta syntaxi-trÀd, specifikt de som anvÀnder std::variant.
- Stödet för Unicode-standard 16.0.0 har implementerats och stöd för byggverktyg har lagts till i CMakeLists.txt.
- Prioriteringen av omrÄdesmatchning och uppsÀttningar av ASCII-tecken har optimerats, vilket resulterat i en betydande ökning av prestanda vid utförandet av vanliga textbehandlingsoperationer. Snabbare specialiserade metoder för att bara bearbeta ASCII-tecken har lagts till, vilket Àr betydligt snabbare Àn Unicode-bearbetningskoden.
- Op-koderna test har implementerats för att optimera fel och op-koderna repeat har implementerats för att optimera utelÀmnande av vita tecken. Dessa optimeringar kommer att helt inkluderas i nÀsta version efter de planerade transformationerna av uttryckstrÀdet.
- Bearbetningen av ingÄngskÀllor har förbÀttrats med förbÀttrad buffring och felrapporter för std::istream, samt förbÀttrat stöd för interaktivt lÀge, som korrekt hanterar radvis inmatning för terminalsessioner eller för linjÀrt orienterade grammatik.
- Stödet för std::istream har flyttats till en separat headerfil <lug/iostream.hpp>. Detta minskar kompileringstiden och minimerar headerberoenden för projekt som inte krÀver strömning av in/ut-funktioner.
- Logiken för parserfixering har omdesignats genom att inlinna instruktioner i lug::basic_parser för att bÀttre anpassa sig till förÀndringar i stackramarkitekturen som presenterades i version 0.4.0, vilket förbÀttrade kodens struktur och prestanda.
- Ett problem i parserexemplet har ÄtgÀrdats. BASIC, nÀr anvÀndarfunktioner (t.ex. FNA(X)) avslutades under utvÀrdering. Detta orsakades av Àndringar i version 0.4.0 som ÄterstÀllde lug::environment under inbÀddade parseroperationer. En ny funktion lug::environment::should_reset_on_parse har lagts till för att sÀkerstÀlla finjusterad kontroll över detta beteende, vilket gör att miljön kan bevaras under inbÀddade parsingoperationer nÀr det Àr nödvÀndigt.
- En omfattande testinfrastruktur för programexempel har lagts till.
- Kataloghierarkin för include har omstrukturerats.
- För större kompatibilitet i GitHub CI har stöd för ytterligare kompilatorer lagts till (GCC 9/10/11/12, Clang 14/15/16/17).
- Clang och MSVC statiska analysatorer har lagts till i GitHub CI.
- Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) och Memory Sanitizer (MSan) har lagts till i GitHub CI.
- Integration av clang-tidy har lagts till i GitHub CI.
- AnvÀndningen av Ubuntu 20.04 har tagits bort i GitHub CI.
KĂ€lla: linux.org.ru
