Den 19. marts blev C++-biblioteket Lug, der implementerer en indlejret domæne-specifik sprog til at udtrykke parseres i form af udvidede grammatikker for syntaktiske udtryk, og distribueres under MIT-licensen.
Bibliotekets funktioner:
- Naturlig syntaks, der minder om sprog for eksterne parser-generatorer, med støtte for attributter og semantiske handlinger.
- Mulighed for at arbejde med kontekstafhængige grammatikker med symboltabeller, betingelser og syntaktiske prædikater.
- Genererede parserne kompileres til bytekode og køres i en syntaktisk analyse virtuel maskine.
- Tydelig opdeling af syntaktiske og leksikalske regler med mulighed for tilpasning af implicit overspring af blanke tegn.
- Understøttelse af direkte og indirekte venstre rekursion, med niveauer for præcedens for at adskille deludtryk med blandede venstre og højre rekursioner.
- Fuld støtte til analyse af tekst i UTF-8-format, herunder niveau 1 og delvis overensstemmelse med niveau 2 tekniske standard UTS #18 Unicode RegEx.
- Fejlbehandling og genopretning ved hjælp af markerede fejl, genoprettelsesregler og fejlbehandlere.
- Automatisk sporing af linje- og kolonnenumre, tilpasset bredde og justering af tabulering.
- Header-only bibliotek, der kun bruger standardbiblioteket og funktionerne i C++17-standard. Fremtidssikret kompatibel med C++20 og C++23 standarderne.
- Relativt lille biblioteksstørrelse, med det formål at holde det samlede antal linjer i alle headerfiler under 6000 linjer af kompakt kode.
Ændringslog:
- Implementeret samlings- og attributdirektiver for objekter. Ny direktiv collect<C>[e] syntetiserer en sekvens eller en associativ beholder af typen C, bestående af elementer samlet fra arvede eller syntetiserede attributter i udtrykket e. Tilsvarende er der nye direktiver synthesize<C,A…>[e], synthesize_shared<C,A…>[e] og synthesize_unique<C,A…>[e] til syntese af objekter, delte pointere og unikke pointere henholdsvis, bygget fra komponentattributter i udtrykket e.
- Implementeret er direktivet synthesize_collect, som kombinerer direktiverne collect og synthesize for at forbedre kode-læsbarheden og reducere antallet af skabeloner, når man bygger komplekse datastrukturer ud fra parserede elementer. Dette er især nyttigt til at skabe indlejrede samlinger, såsom arrays af objekter eller associative containere med komplekse værdityper.
- Tilføjet er skabelonklassen lug::recursive_wrapper til håndtering af cykliske afhængigheder i abstrakte syntaks-træer, især dem der bruger std::variant.
- Understøttelsen af Unicode 16.0.0 er blevet implementeret, og der er tilføjet support for build-værktøjer i CMakeLists.txt.
- Optimeret er matchning af interval og sæt af ASCII-tegn, hvilket har resulteret i en betydelig stigning i ydeevnen ved udførelsen af almindelige tekstbehandlingsoperationer. Der er tilføjet specialiserede hurtige metoder til kun at behandle ASCII-tegn, som er betydeligt hurtigere end koden til behandling af Unicode.
- Implementeret er bytecode test til optimering af fejl og bytecode repeat til optimering af overspring af hvide tegn. Disse optimeringer vil være helt inkluderet i næste udgave efter de planlagte transformationer af udtrykstræet.
- Forbedret er behandlingen af inputkilder med forbedret buffering og fejlrapportering for std::istream, samt en forbedret understøttelse af interaktiv tilstand, der korrekt håndterer linje-for-linje input til terminalsessioner eller for linært orienterede grammatikker.
- Understøttelsen af std::istream er flyttet til en separat headerfil . Dette reducerer kompileringstiden og minimerer afhængighederne af headers for projekter, der ikke kræver funktionaliteten af stream input/output.
- Logikken bag parser-fejlen er redesignede ved at inline instruktioner i lug::basic_parser for bedre at tilpasse sig ændringerne i arkitekturen af stack-rammen, præsenteret i version 0.4.0, hvilket har forbedret kodeorganiseringen og ydeevnen.
- En fejl i parser-eksemplet er blevet rettet. BASIC, når brugerdefinerede funktioner (f.eks. FNA(X)) afsluttedes under evalueringen. Dette blev forårsaget af ændringer i version 0.4.0, som nulstillede lug::environment under indlejrede syntaksanalyseoperationer. En ny funktion lug::environment::should_reset_on_parse er tilføjet for at give finere kontrol over denne adfærd, så miljøet kan bevares under indlejrede parse-operationer, når det er nødvendigt.
- Der er tilføjet en omfattende testinfrastruktur for eksempler i programmeringen.
- Inkludering af mappestrukturen er blevet ombygget.
- For at sikre bredere kompatibilitet i GitHub CI er der tilføjet support for yderligere kompilatorer (GCC 9/10/11/12, Clang 14/15/16/17).
- Clang og MSVC statiske analyseværktøjer er blevet tilføjet i GitHub CI.
- Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) og Memory Sanitizer (MSan) er blevet tilføjet i GitHub CI.
- Integration af clang-tidy er blevet tilføjet i GitHub CI.
- Brugen af Ubuntu 20.04 er blevet fjernet fra GitHub CI.
Kilde: linux.org.ru
