19. mars ble C++-biblioteket utgitt Lug, som implementerer en innebygd domene-spesifikk språk for å uttrykke parser-generatorer i form av utvidede grammatikk av syntaktiske uttrykk, og distribueres under MIT-lisensen.
Bibliotekets funksjoner:
- Naturlig syntaks, lik eksterne parser-generatorers språk, med støtte for attributter og semantiske handlinger.
- Mulighet til å arbeide med kontekstavhengige grammatikker med symboltabeller, betingelser og syntaktiske predikater.
- Genererte parsere kompileres til bytekode og kjøres i en parser-analysatorens virtuelle maskin.
- Tydelig skille mellom syntaktiske og leksikalske regler, med mulighet for tilpasning av implicit utelatelse av mellomrom.
- Støtte for direkte og indirekte venstre rekursjon, med prioritetsnivåer for å skille deluttrykk med blandet venstre og høyre rekursjon.
- Full støtte for parsing av tekst i UTF-8-format, inkludert nivå 1 og delvis samsvar med nivå 2 av den tekniske standarden UTS #18 Unicode-regulære uttrykk.
- Feilhåndtering og gjenoppretting ved hjelp av merket feil, gjenopprettingsregler og feilhåndteringsrutiner.
- Automatisk sporing av linje- og kolonnenumre, tilpasset bredde og tabulatorjustering.
- Header-only-bibliotek som bare bruker standardbiblioteket og egenskapene til C++17. Fremtidig kompatibelt med standarder C++20 og C++23.
- Relativt liten størrelse på biblioteket, med mål om å holde det totale antallet linjer i alle header-filer under 6000 linjer med konsis kode.
Endringslogg:
- Implementert samlings- og objektattributtdirektiver. Den nye direktiven collect<C>[e] syntetiserer en sekvens eller assosiativ beholder av typen C, bestående av elementer samlet fra arvede eller syntetiserte attributter i uttrykket e. Tilsvarende, nye direktiver synthesize<C,A…>[e], synthesize_shared<C,A…>[e] og synthesize_unique<C,A…>[e] for syntese av objekter, delte pekere og unike pekere henholdsvis, bygget fra attributter av komponentene i uttrykket e.
- Implementert direktivet synthesize_collect, som kombinerer direktivene collect og synthesize for å forbedre lesbarheten av koden og redusere antallet maler ved bygging av kompliserte datastrukturer fra analyserte elementer. Dette er spesielt nyttig for å opprette nestede samlinger, som objekter i matriser eller assosiative containere med komplekse verdityper.
- Legget til malklasssen lug::recursive_wrapper for å håndtere sirkulære avhengigheter i trestrukturer av abstrakt syntaks, spesielt de som bruker std::variant.
- Implementert støtte for Unicode-standarden 16.0.0 og lagt til støtte for byggverktøy i CMakeLists.txt.
- Optimalisert range-matching og sett med ASCII-tegn, noe som førte til betydelig ytelsesforbedring under utføring av vanlige tekstbehandlingsoperasjoner. Legget til spesialiserte hurtige metoder for kun behandling av ASCII-tegn, som er betydelig raskere enn koden for Unicode-behandling.
- Implementert opkoder test for optimalisering av feil og opkoder repeat for optimalisering av utelatelse av hvite tegn. Disse optimaliseringene vil være fullt inkludert i neste utgivelse etter planlagte omforminger av uttrykks-treet.
- Forbedret håndtering av inndata kilder med forbedret buffering og feilmelding for std::istream, samt forbedret støtte for interaktiv modus, som håndterer linjevis inndata skikkelig for terminaløkter eller for linjært orienterte grammatikk.
- Støtten for std::istream er flyttet til en egen header-fil <lug/iostream.hpp>. Dette reduserer kompileringstiden og minimerer avhengigheter til header-filer for prosjekter som ikke trenger funksjonalitet for strømmet inndata/utdata.
- Revurdert parser-logikken ved å inline instruksjoner i lug::basic_parser for bedre samsvar med endringer i arkitekturen til stakkrammen introdusert i versjon 0.4.0, noe som har forbedret kodeorganiseringen og ytelsen.
- Reparert problemet i eksempelparseren. BASIC, når brukerdefinerte funksjoner (for eksempel FNA(X)) ble avsluttet under evalueringen. Dette ble forårsaket av endringer i versjon 0.4.0, som tilbakestilte lug::environment under nestede syntaksanalyser. En ny funksjon lug::environment::should_reset_on_parse er lagt til for å gi fin kontroll over denne atferden, slik at miljøet kan bevares under nestede parsing-operasjoner når det er nødvendig.
- Omfattende infrastruktur for testing av programeksempler er lagt til.
- Kataloghierarkiet for include er ombygget.
- For å sikre bedre kompatibilitet i GitHub CI, er støtte for flere kompilatorer (GCC 9/10/11/12, Clang 14/15/16/17) lagt til.
- Clang- og MSVC-statiske analyseverktøy er lagt til i GitHub CI.
- Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) og Memory Sanitizer (MSan) er lagt til i GitHub CI.
- Integrasjon av clang-tidy er lagt til i GitHub CI.
- Bruken av Ubuntu 20.04 er fjernet fra GitHub CI.
Kilde: linux.org.ru
