Il 19 marzo è stato rilasciato il C++ library Lug, che implementa un linguaggio orientato agli oggetti per esprimere analizzatori sintattici sotto forma di grammatiche estese di espressioni sintattiche, e distribuito sotto licenza MIT.
Caratteristiche della libreria:
- Una sintassi naturale, simile ai linguaggi dei generatori di parser esterni, con supporto per attributi e azioni semantiche.
- Possibilità di lavorare con grammatiche contestuali con tabelle simboliche, condizioni e predicati sintattici.
- Gli analizzatori generati sono compilati in bytecode e vengono eseguiti in una macchina virtuale di analisi sintattica.
- Netta separazione delle regole sintattiche e lessicali con possibilità di configurare il passaggio implicito di caratteri bianchi.
- Supporto per la ricorsione diretta e indiretta a sinistra, con livelli di precedenza per la separazione delle sottoespressioni con miste ricorsioni a sinistra e a destra.
- Supporto completo per l'analisi di testo in formato UTF-8, incluso il livello 1 e parziale conformità al livello 2 dello standard tecnico UTS #18 Espressioni Regolari Unicode.
- Gestione degli errori e recupero tramite errori contrassegnati, regole di recupero e gestori di errori.
- Tracciamento automatico dei numeri di riga e colonna, larghezza e allineamento della tabulazione personalizzabili.
- Libreria header-only che utilizza solo la libreria standard e le funzionalità dello standard C++17. Compatibile in prospettiva con gli standard C++20 e C++23.
- Dimensione complessiva della libreria relativamente ridotta, con l'obiettivo di mantenere il numero totale di righe in tutti i file header al di sotto delle 6000 righe di codice conciso.
Elenco delle modifiche:
- Sono state implementate 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 da attributi ereditati o sintetizzati nell'espressione e. Analogamente, sono state introdotte nuove direttive synthesize[e], synthesize_shared[e] e synthesize_unique[e] per sintetizzare oggetti, puntatori condivisi e puntatori unici rispettivamente, costruiti da attributi dei componenti nell'espressione e.
- È stata implementata 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 templata lug::recursive_wrapper per gestire le dipendenze cicliche negli alberi della sintassi astratta, in particolare quando si utilizza std::variant.
- È stato implementato il supporto per lo standard Unicode 16.0.0 e sono stati aggiunti strumenti di compilazione in CMakeLists.txt.
- È stata ottimizzata l'elaborazione degli intervalli e dei set di caratteri ASCII, portando a un notevole aumento delle prestazioni durante l'esecuzione di comuni operazioni di elaborazione del testo. Sono stati aggiunti metodi rapidi specializzati per elaborare solo i caratteri ASCII, che sono notevolmente più veloci rispetto al codice di elaborazione Unicode.
- Sono stati implementati gli opcode test per ottimizzare gli errori e gli opcode repeat per ottimizzare il salto dei caratteri bianchi. Queste ottimizzazioni verranno completamente integrate nel prossimo rilascio dopo le trasformazioni pianificate dell'albero delle espressioni.
- È stata migliorata l'elaborazione delle sorgenti di input con un migliore buffering e reporting degli errori per std::istream, e inoltre è stato migliorato il supporto per la modalità interattiva, che gestisce correttamente l'input riga per riga per sessioni terminali o per grammatiche orientate alle linee.
- Il supporto per std::istream è stato spostato in un file di intestazione separato <lug/iostream.hpp>. Questo riduce i tempi di compilazione e minimizza le dipendenze di intestazione per i progetti che non necessitano della funzionalità di input/output a flusso.
- È stata rivisitata la logica di messa a punto del parser mediante l'inlining delle istruzioni in lug::basic_parser per una migliore corrispondenza con le modifiche all'architettura della cornice dello stack introdotte nella versione 0.4.0, migliorando così l'organizzazione del codice e le prestazioni.
- È stato risolto un problema nell'esempio del parser. BASIC, quando le funzioni utente (ad esempio, FNA(X)) venivano interrotte durante la valutazione. Questo è stato causato da modifiche nella versione 0.4.0, che resettavano lug::environment durante le operazioni di analisi sintattica annidate. È stata aggiunta una nuova funzione lug::environment::should_reset_on_parse per garantire un controllo fine di questo comportamento, permettendo all'ambiente di rimanere intatto durante le operazioni di parsing annidato, quando necessario.
- È stata aggiunta un'infrastruttura complessa per il testing degli esempi di programma.
- L'gerarchia delle directory include è stata ristrutturata.
- Per garantire una compatibilità più ampia nel GitHub CI è stato aggiunto il supporto per compilatori aggiuntivi (GCC 9/10/11/12, Clang 14/15/16/17).
- Sono stati aggiunti analizzatori statici Clang e MSVC nel GitHub CI.
- È stata aggiunta nel GitHub CI la funzionalità Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) e Memory Sanitizer (MSan).
- È stata integrata clang-tidy nel GitHub CI.
- È stato rimosso l'uso di Ubuntu 20.04 nel GitHub CI.
Fonte: linux.org.ru
