19. mars ble C++-biblioteket utgitt Juli, som implementerer innebygd domenespesifikt språk for å uttrykke parsere som utvidet grammatikk av syntaktiske uttrykk, og distribuert under MIT-lisensen.
Bibliotekets funksjoner:
- Naturlig syntaks som minner om eksterne parsergeneratorspråk, med støtte for attributter og semantiske handlinger.
- Evne til å arbeide med kontekstsensitive grammatikker med symboltabeller, betingelser og syntaktiske predikater.
- De genererte parserne kompileres til bytekode og kjøres i en virtuell parsingmaskin.
- Tydelig separasjon av syntaktiske og leksikalske regler med muligheten til å konfigurere implisitt hopping av mellomrom.
- Støtte for direkte og indirekte venstrerekursjon, med prioritetsnivåer for å avgrense underuttrykk med blandet venstre- og høyrerekursjon.
- Full støtte for UTF-8-tekstparsing, inkludert nivå 1 og delvis overholdelse av nivå 2 i den tekniske standarden UTS #18 Unicode regulære uttrykk.
- Feilhåndtering og gjenoppretting ved bruk av merkede feil, gjenopprettingsregler og feilbehandlere.
- Automatisk sporing av linje- og kolonnenummer, tilpassbar fanebredde og justering.
- Bare overskriftsbibliotek som bare bruker standardbiblioteket og funksjonene til C++17-standarden. Fremtidig kompatibel med C++20 og C++23 standarder.
- Relativt liten bibliotekstørrelse, med mål om å holde det totale antallet linjer i alle overskriftsfiler til mindre enn 6000 linjer med kortfattet kode.
Liste over endringer:
- Det er implementert direktiver for samlinger og objektattributter. Nytt tariffdirektiv [e] syntetiserer en sekvens eller assosiativ beholder av type C som består av elementer satt sammen fra arvede eller syntetiserte attributter i uttrykk e. På samme måte er det nye syntetiseringsdirektiver [e], synthesize_shared [e] og synthesize_unique [e] for å syntetisere objekter, henholdsvis vanlige pekere og unike pekere, konstruert fra attributtene til komponentene i uttrykket e.
- Synthesize_collect-direktivet er implementert, som kombinerer innsamlings- og syntetiseringsdirektivene for å forbedre kodelesbarheten og redusere antall maler når du bygger komplekse datastrukturer fra analyserte elementer. Dette er spesielt nyttig for å lage nestede samlinger, for eksempel arrays av objekter eller assosiative beholdere med komplekse verdityper.
- Lagt til template class lug::recursive_wrapper for å håndtere sykliske avhengigheter i abstrakte syntakstrær, spesielt de som bruker std::variant.
- Implementerte støtte for Unicode 16.0.0-standarden og lagt til støtte for byggeverktøy i CMakeLists.txt.
- Kartleggingen mellom rekkevidde og ASCII-tegn har blitt optimalisert, noe som resulterer i betydelige ytelsesforbedringer for vanlige tekstbehandlingsoperasjoner. Lagt til spesialiserte snarveier for kun å behandle ASCII-tegn, som er betydelig raskere enn Unicode-behandlingskode.
- Implementerte test-opkoder for å optimalisere feil og gjenta op-koder for å optimalisere hopping av mellomrom. Disse optimaliseringene vil være fullt aktivert i neste utgivelse etter planlagte transformasjon av uttrykkstre.
- Forbedret håndtering av inngangskilder med forbedret buffering og feilrapportering for std::istream, og forbedret støtte for interaktiv modus som korrekt håndterer linje-for-linje-inndata for terminalsesjoner eller for linjeorienterte grammatikker.
- Flyttet std::istream-støtte til en egen overskriftsfil . Dette reduserer kompileringstiden og minimerer overskriftsavhengigheter for prosjekter som ikke krever strømming I/O-funksjonalitet.
- Omarbeidet parserfikseringslogikk ved å legge instruksjoner i lug::basic_parser for bedre å matche stackrammearkitekturendringene introdusert i versjon 0.4.0, som forbedret kodeorganisering og ytelse.
- Rettet problem i parser eksempel BASIC, når egendefinerte funksjoner (f.eks. FNA(X)) ble fullført under evaluering. Dette ble forårsaket av endringer i versjon 0.4.0 som tilbakestilte lug::environment under nestede parseoperasjoner. En ny funksjon, lug::environment::should_reset_on_parse, er lagt til for å gi finkornet kontroll over denne oppførselen, slik at miljøet kan vedvare under nestede analyser når det er nødvendig.
- En omfattende infrastruktur for testing av eksempelprogrammer er lagt til.
- Inkluderingskataloghierarkiet har blitt gjenoppbygd.
- For å gi bredere kompatibilitet har GitHub CI lagt til støtte for ytterligere kompilatorer (GCC 9/10/11/12, Clang 14/15/16/17).
- Clang og MSVC statiske analysatorer er lagt til GitHub CI.
- Lagt til Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) og Memory Sanitizer (MSan) til GitHub CI.
- Lagt klangryddig integrasjon til GitHub CI.
- GitHub CI har fjernet bruken av Ubuntu 20.04.
Kilde: linux.org.ru
