Le 19 mars, la bibliothèque C++ a été lancée Lug, qui implémente un langage orienté objet pour exprimer des analyseurs syntaxiques sous forme de grammaires étendues de règles syntaxiques, et est distribuée sous licence MIT.
Fonctionnalités de la bibliothèque :
- Une syntaxe naturelle, similaire aux langages de générateurs externes de parseurs, avec un support des attributs et des actions sémantiques.
- Capacité à travailler avec des grammaires contextuellement dépendantes avec tables de symboles, conditions et prédicats syntaxiques.
- Les parseurs générés sont compilés en bytecode et exécutés dans une machine virtuelle d'analyse syntaxique.
- Séparation claire entre les règles syntaxiques et lexicales avec possibilité de configurer le passage implicite des espaces.
- Support de la récursion gauche directe et indirecte, avec niveaux de priorité pour délimiter les sous-expressions avec des récursions gauche et droite mélangées.
- Support complet de l'analyse de texte au format UTF-8, y compris le niveau 1 et conformité partielle avec le niveau 2 de la norme technique UTS #18 Expressions régulières Unicode.
- Gestion des erreurs et récupération à l'aide de défaillances marquées, règles de récupération et gestionnaires d'erreurs.
- Suivi automatique des numéros de ligne et de colonne, largeur et alignement de tabulation configurables.
- Bibliothèque uniquement sur les en-têtes, utilisant uniquement la bibliothèque standard et les fonctionnalités de la norme C++17. Compatible avec les normes C++20 et C++23 en perspective.
- Taille relativement petite de la bibliothèque, cherchant à maintenir le nombre total de lignes dans tous les fichiers d'en-tête en dessous de 6000 lignes de code concis.
Liste des changements :
- Directives de collections et d'attributs d'objets mises en œuvre. La nouvelle directive collect<C>[e] synthétise une séquence ou un conteneur associatif de type C, composé d'éléments collectés à partir d'attributs hérités ou synthétisés dans l'expression e. De même, de nouvelles directives synthesize<C,A…>[e], synthesize_shared<C,A…>[e] et synthesize_unique<C,A…>[e] ont été introduites pour la synthèse d'objets, de pointeurs partagés et de pointeurs uniques respectivement, construits à partir des attributs de composants dans l'expression e.
- La directive synthesize_collect a été mise en œuvre, combinant les directives collect et synthesize pour améliorer la lisibilité du code et réduire le nombre de modèles lors de la construction de structures de données complexes à partir d'éléments analysés. Cela est particulièrement utile pour créer des collections imbriquées, telles que des tableaux d'objets ou des conteneurs associatifs avec des types de valeurs complexes.
- Ajouté la classe modèle lug::recursive_wrapper pour la gestion des dépendances cycliques dans les arbres de syntaxe abstraite, en particulier ceux utilisant std::variant.
- Support de la norme Unicode 16.0.0 mis en œuvre et support des outils de construction ajoutés dans CMakeLists.txt.
- L'appariement de plages et d'ensembles de caractères ASCII a été optimisé, ce qui a conduit à une augmentation significative des performances lors de l'exécution d'opérations courantes de traitement de texte. Des méthodes rapides spécialisées pour traiter uniquement les caractères ASCII ont été ajoutées, qui sont nettement plus rapides que le code de traitement Unicode.
- Les opcodes test pour l'optimisation des erreurs et les opcodes repeat pour l'optimisation des sauts de caractères d'espacement ont été mis en œuvre. Ces optimisations seront pleinement intégrées dans la prochaine version après les transformations de l'arbre d'expressions prévues.
- Le traitement des sources d'entrée a été amélioré avec un meilleur tampon et un rapport d'erreur pour std::istream, ainsi qu'un support amélioré du mode interactif, qui gère correctement les entrées ligne par ligne pour les sessions terminales ou pour les grammaires orientées ligne.
- Le support de std::istream a été déplacé dans un fichier d'en-tête distinct . Cela réduit le temps de compilation et minimise les dépendances des en-têtes pour les projets n'ayant pas besoin de la fonctionnalité d'entrée/sortie de flux.
- La logique d'ancrage du parseur a été retravaillée par l'inlining des instructions dans lug::basic_parser pour mieux s'aligner sur les changements d'architecture du cadre de la pile introduits dans la version 0.4.0, améliorant ainsi l'organisation du code et les performances.
- Un problème dans l'exemple de parseur a été corrigé. BASIC, lorsque des fonctions utilisateurs (par exemple, FNA(X)) échouaient lors de l'évaluation. Cela était causé par des modifications dans la version 0.4.0 qui réinitialisaient lug::environment lors des opérations d'analyse syntaxique imbriquées. Une nouvelle fonction lug::environment::should_reset_on_parse a été ajoutée pour un contrôle fin de ce comportement, permettant à l'environnement de rester intact pendant les opérations d'analyse imbriquées lorsque cela est nécessaire.
- Une infrastructure de test complète pour les exemples de programmes a été ajoutée.
- La hiérarchie des répertoires include a été restructurée.
- Pour assurer une compatibilité plus large dans GitHub CI, le support de compilateurs supplémentaires (GCC 9/10/11/12, Clang 14/15/16/17) a été ajouté.
- Les analyseurs statiques Clang et MSVC ont été ajoutés dans GitHub CI.
- Les Address Sanitizer (ASan), Undefined Behavior Sanitizer (UBSan) et Memory Sanitizer (MSan) ont été ajoutés dans GitHub CI.
- L'intégration de clang-tidy a été ajoutée dans GitHub CI.
- L'utilisation d'Ubuntu 20.04 a été supprimée dans GitHub CI.
Source : linux.org.ru
