Il 19 marzo è stata rilasciata una libreria C++ Lug, che implementa un linguaggio di dominio specifico per esprimere parser in forma di grammatiche estese di espressioni sintattiche, distribuita con licenza MIT.
Caratteristiche della libreria:
- Una sintassi naturale, simile ai linguaggi di generatori di parser esterni, con supporto per attributi e azioni semantiche.
- La possibilità di lavorare con grammatiche con dipendenze contestuali, con tabelle dei simboli, condizioni e predicati sintattici.
- I parser generati vengono compilati in bytecode e eseguiti in una macchina virtuale di parsing.
- Chiara separazione tra regole sintattiche e lessicali, con la possibilità di configurare l'ignoramento implicito dei caratteri spaziali.
- Supporto per ricorsione sinistra diretta e indiretta, con livelli di precedenza per differenziare sotto espressioni con ricorsioni miste sinistre e destre.
- Supporto completo per l'analisi di testi in formato UTF-8, compreso il livello 1 e la corrispondenza parziale con il livello 2 dello standard tecnico UTS #18 Espressioni Regolari Unicode.
- Gestione degli errori e recupero tramite guasti contrassegnati, regole di recupero e gestori degli errori.
- Tracciamento automatico dei numeri di riga e colonna, larghezza personalizzabile e allineamento della tabulazione.
- Biblioteca header-only che utilizza solo la standard library e le funzionalità dello standard C++17. Compatibile in prospettiva con gli standard C++20 e C++23.
- Dimensioni relativamente ridotte della libreria, con l'obiettivo di mantenere il numero totale di righe in tutti i file di intestazione al di sotto di 6000 righe di codice conciso.
Elenco delle modifiche:
- Implementate le direttive per collezioni e attributi degli oggetti. La nuova direttiva collect[e] sintetizza una sequenza o un contenitore associativo di tipo C, composto da elementi raccolti dagli attributi ereditati o sintetizzati nell'espressione e. Allo stesso modo, sono state introdotte nuove direttive synthesize[e], synthesize_shared[e] e synthesize_unique[e] per sintetizzare oggetti, puntatori condivisi e puntatori unici rispettivamente, costruiti dagli attributi dei componenti nell'espressione e.
- È stata realizzata la direttiva synthesize_collect, che combina le direttive collect e synthesize per migliorare la leggibilità del codice e ridurre il numero di modelli nella costruzione di strutture dati complesse a partire da elementi analizzati. Questo è particolarmente utile per creare collezioni annidate, come array di oggetti o contenitori associativi con tipi di valore complessi.
- È stata aggiunta la classe template lug::recursive_wrapper per gestire le dipendenze cicliche negli alberi di sintassi astratta, in particolare quelli che utilizzano std::variant.
- È stato implementato il supporto per lo standard Unicode 16.0.0 e aggiunto il supporto per gli strumenti di build in CMakeLists.txt.
- È stata ottimizzata la corrispondenza di intervalli e set di caratteri ASCII, portando a un significativo incremento delle prestazioni durante l'esecuzione delle operazioni di elaborazione del testo più comuni. Sono stati aggiunti modi rapidi specializzati per elaborare solo caratteri ASCII, che sono notevolmente più veloci del codice di elaborazione Unicode.
- Sono stati implementati gli opcode test per ottimizzare gli errori e gli opcode repeat per ottimizzare il passaggio dei caratteri bianchi. Queste ottimizzazioni saranno completamente incluse nel prossimo rilascio dopo le trasformazioni pianificate dell'albero delle espressioni.
- Migliorata la gestione delle sorgenti di input con un buffering avanzato e report di errore per std::istream, oltre a un miglior supporto per la modalità interattiva, che gestisce correttamente l'input linea per linea per sessioni terminali o per grammatiche orientate linearmente.
- Il supporto per std::istream è stato spostato in un header separato <lug/iostream.hpp>. Questo riduce il tempo di compilazione e minimizza le dipendenze dagli header per i progetti che non richiedono funzionalità di input/output di flusso.
- Riprogettata la logica di fissaggio del parser mediante l'inlining delle istruzioni in lug::basic_parser per meglio allinearsi ai cambiamenti dell'architettura dello stack frame introdotti nella versione 0.4.0, migliorando così l'organizzazione del codice e le prestazioni.
- Risolta un problema nell'esempio del parser. BASIC, quando le funzioni utente (ad esempio, FNA(X)) fallivano durante la valutazione. Questo è stato causato da modifiche nella versione 0.4.0 che resettavano lug::environment durante operazioni di parsing annidate. È stata aggiunta una nuova funzione lug::environment::should_reset_on_parse per garantire un controllo fine su questo comportamento, consentendo all'ambiente di persistere durante le operazioni di parsing annidate quando necessario.
- È stata aggiunta un'infrastruttura complessa per il testing degli esempi di programmi.
- Riordinata la gerarchia delle directory include.
- Per garantire una maggiore compatibilità in GitHub CI, è stato aggiunto il supporto per ulteriori compilatori (GCC 9/10/11/12, Clang 14/15/16/17).
- Aggiunti analizzatori statici Clang e MSVC in GitHub CI.
- Aggiunti Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) e Memory Sanitizer (MSan) in GitHub CI.
- Aggiunta integrazione clang-tidy in GitHub CI.
- Rimossa l'uso di Ubuntu 20.04 in GitHub CI.
Fonte: linux.org.ru
