Den 19 mars slÀpptes C++-biblioteket Juli, som implementerar inbÀddade domÀnspecifikt sprÄk för att uttrycka parsers som utökade grammatik för syntaktiska uttryck, och distribueras under MIT-licensen.
Bibliotekets funktioner:
- Naturlig syntax som pÄminner om externa parsergeneratorsprÄk, med stöd för attribut och semantiska ÄtgÀrder.
- FörmÄga att arbeta med sammanhangskÀnslig grammatik med symboltabeller, villkor och syntaktiska predikat.
- De genererade tolkarna kompileras till bytekod och exekveras i en virtuell tolkmaskin.
- Tydlig separation av syntaktiska och lexikaliska regler med möjlighet att konfigurera implicit överhoppning av blanksteg.
- Stöd för direkt och indirekt vÀnsterrekursion, med prioritetsnivÄer för att avgrÀnsa underuttryck med blandad vÀnster- och högerrekursion.
- FullstÀndigt stöd för UTF-8-textanalys, inklusive nivÄ 1 och delvis överensstÀmmelse med nivÄ 2 i den tekniska standarden UTS #18 Unicode reguljÀra uttryck.
- Felhantering och ÄterstÀllning med mÀrkta fel, ÄterstÀllningsregler och felhanterare.
- Automatisk spÄrning av rad- och kolumnnummer, anpassningsbar flikbredd och justering.
- Enbart rubrikbibliotek som endast anvÀnder standardbiblioteket och funktionerna i C++17-standarden. Framtidskompatibel med standarderna C++20 och C++23.
- Relativt liten biblioteksstorlek, med mÄlet att hÄlla det totala antalet rader i alla rubrikfiler till mindre Àn 6000 rader med kortfattad kod.
Lista över Àndringar:
- Direktiv för samlingar och objektattribut har implementerats. Nytt kollektivdirektiv [e] syntetiserar en sekvens eller associativ behÄllare av typ C som bestÄr av element sammansatta frÄn Àrvda eller syntetiserade attribut i uttryck e. LikasÄ finns det nya syntetiseringsdirektiv [e], synthesize_shared [e] och synthesize_unique [e] för att syntetisera objekt, gemensamma pekare respektive unika pekare, konstruerade frÄn attributen för komponenterna i uttrycket e.
- Direktivet synthesize_collect har implementerats, som kombinerar insamlings- och syntetiseringsdirektiven för att förbÀttra kodlÀsbarheten och minska antalet mallar nÀr man bygger komplexa datastrukturer frÄn analyserade element. Detta Àr sÀrskilt anvÀndbart för att skapa kapslade samlingar, till exempel arrayer av objekt eller associativa behÄllare med komplexa vÀrdetyper.
- Lade till mallklass lug::recursive_wrapper för att hantera cykliska beroenden i abstrakta syntaxtrÀd, sÀrskilt de som anvÀnder std::variant.
- Implementerat stöd för Unicode 16.0.0-standarden och lagt till stöd för byggverktyg i CMakeLists.txt.
- Mappningen mellan intervall och ASCII-tecken har optimerats, vilket resulterat i betydande prestandaförbÀttringar för vanliga textbehandlingsoperationer. Lade till specialiserade genvÀgar för att endast bearbeta ASCII-tecken, som Àr betydligt snabbare Àn Unicode-bearbetningskod.
- Implementerade testopkoder för att optimera fel och upprepa opkoder för att optimera att hoppa över blanksteg. Dessa optimeringar kommer att vara fullt aktiverade i nÀsta version efter planerade expressionstrÀdtransformationer.
- FörbÀttrad hantering av indatakÀllor med förbÀttrad buffring och felrapportering för std::istream, och förbÀttrat stöd för interaktivt lÀge som korrekt hanterar rad-för-rad-inmatning för terminalsessioner eller för radorienterade grammatiker.
- Flyttade std::istream-stöd till en separat rubrikfil . Detta minskar kompileringstiden och minimerar header-beroendena för projekt som inte krÀver strömmande I/O-funktioner.
- Omarbetad parserfixeringslogik genom att infoga instruktioner i lug::basic_parser för att bÀttre matcha stackframe-arkitekturÀndringarna som introducerades i version 0.4.0, vilket förbÀttrade kodorganisation och prestanda.
- Fixat problem i parserexempel GRUNDLĂGGANDE, nĂ€r anpassade funktioner (t.ex. FNA(X)) slutfördes under utvĂ€rderingen. Detta orsakades av Ă€ndringar i version 0.4.0 som Ă„terstĂ€ller lug::environment under kapslade parsningsoperationer. En ny funktion, lug::environment::should_reset_on_parse, har lagts till för att ge finkornig kontroll över detta beteende, vilket gör att miljön kan bestĂ„ under kapslade analyser nĂ€r det behövs.
- En omfattande infrastruktur för att testa exempelprogram har lagts till.
- Inkludera-kataloghierarkin har byggts om.
- För att ge bredare kompatibilitet har GitHub CI lagt till stöd för ytterligare kompilatorer (GCC 9/10/11/12, Clang 14/15/16/17).
- Clang och MSVC statiska analysatorer har lagts till i GitHub CI.
- Lade till Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) och Memory Sanitizer (MSan) till GitHub CI.
- Lade till klangsnygg integration till GitHub CI.
- GitHub CI har tagit bort anvÀndningen av Ubuntu 20.04.
KĂ€lla: linux.org.ru
