Lug 0.5.0

Lug 0.5.0

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

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster