La bibliothèque du modèle de grammaire d'expression d'analyse (PEGTL) est une bibliothèque de combinatrice d'analyse en tête C ++ à dépendance zéro pour créer une grammaire d'expression d'analyse (PEG).
Lors du développement d'une nouvelle version majeure, la branche principale peut subir des changements incompatibles. Pour une expérience stable, veuillez télécharger la dernière version plutôt que d'utiliser la branche principale.
Pour des questions et des suggestions concernant les histoires PEGTL, le succès ou l'échec, et tout autre type de rétroaction, n'hésitez pas à ouvrir une discussion, un problème ou une demande de traction, ou contacter les auteurs de taocpp(at)icemx.net .
Les grammaires sont écrites comme du code C ++ régulier, créé avec une programmation de modèle (pas une programmation de méta du modèle), c'est-à-dire des instanciations de matrices imbriquées qui correspondent naturellement à la définition inductive des PEG (et d'autres approches de combinateur de parser).
Un ensemble complet de règles d'analyse qui peuvent être combinés et étendus par l'utilisateur est inclus, tout comme les mécanismes de débogage des grammaires et pour attacher des actions définies par l'utilisateur aux règles de grammaire. Voici un exemple de la façon dont une règle de grammaire d'expression d'analyse est implémentée sous forme de classe C ++ avec le PEGTL.
// PEG rule for integers consisting of a non-empty
// sequence of digits with an optional sign:
// sign ::= '+' / '-'
// integer ::= sign? digit+
// The same parsing rule implemented with the PEGTL:
using namespace tao ::pegtl ;
struct sign : one< ' + ' , ' - ' > {};
struct integer : seq< opt< sign >, plus< digit > > {};Les PEG sont superficiellement similaires aux grammaires sans contexte (CFG), mais la nature plus déterministe des PEG donne lieu à des différences très importantes. L'analyse de la grammaire incluse trouve plusieurs erreurs typiques dans les PEG, y compris la récursivité gauche.
Le PEGTL est conçu pour être "maigre et méchant", la bibliothèque de base se compose d'environ 6000 lignes de code. L'accent est mis sur la simplicité et l'efficacité, préférant une approche simple bien réglée par rapport aux optimisations compliquées.
Le PEGTL s'intéresse principalement aux combinateurs d'analyse et aux règles de grammaire, et à donner à l'utilisateur de la bibliothèque (la possibilité de) un contrôle total sur tous les autres aspects d'une analyse d'analyse. Si / quelles actions sont prises et si / quelles structures de données sont créées lors d'une analyse d'analyse, est entièrement à la hauteur de l'utilisateur.
Il y a quelques exemples pour une situation typique comme les séquences d'échappement sans échange dans les chaînes, la construction d'une structure de données JSON générique et l'évaluation à la volée des expressions arithmétiques.
Grâce à l'utilisation de spécialisations de programmation et de modèle de modèle, il est possible d'écrire une grammaire une fois et de l'utiliser de plusieurs manières avec différentes actions (sémantiques) dans différentes (ou les mêmes) exécutions d'analyse.
Avec le formalisme PEG, la séparation en étapes Lexer et Parser est généralement supprimée - tout est fait en une seule grammaire. Les règles sont exprimées en C ++ en tant qu'instanciations de modèle, et c'est la tâche du compilateur d'optimiser les grammaires PEGTL.
Chaque engagement est automatiquement testé avec plusieurs architectures, systèmes d'exploitation, compilateurs et versions de ceux-ci.
Chaque commit est vérifié auprès du GCC et des désinfections de Clang, de l'analyseur statique de Clang et clang-tidy . De plus, nous utilisons CodeQL pour rechercher des problèmes (de sécurité).
La couverture du code est automatiquement mesurée et les tests unitaires couvrent 100% du code de la bibliothèque de base (pour les versions).
Les versions sont effectuées conformément à la version sémantique. Les changements d'API incompatibles ne peuvent se produire que entre les grandes versions.
En appréciation de toutes les contributions, voici les personnes qui ont directement contribué au PEGTL et / ou à son développement.
Le PEGTL fait partie de l'art de C ++.
Copyright (C) 2007-2023 Daniel Frey et le Dr Colin Hirsch
Le PEGTL est un logiciel open source certifié. Il est concédé sous licence de la licence Software Boost, la version 1.0 reproduite ici.
Boost Licence du logiciel - Version 1.0 - 17 août 2003
L'autorisation est accordée gratuitement à toute personne ou organisation qui obtient une copie du logiciel et la documentation d'accompagnement couverte par cette licence (le "logiciel") à utiliser, à reproduire, à afficher, à distribuer, à exécuter et à transmettre le logiciel, et à préparer des œuvres dérivées du logiciel, et pour permettre des tiers à qui le logiciel est meublé, tous les sujets suivants:
Les avis du droit d'auteur dans le logiciel et cette déclaration entière, y compris la subvention de licence ci-dessus, cette restriction et la clause de non-responsabilité suivante, doivent être incluses dans toutes les copies du logiciel, en tout ou en partie, et toutes les œuvres dérivées du logiciel, à moins que ces copies ou des œuvres dérivées ne soient uniquement sous la forme d'un code d'objet exécutif à machine généré par un traceur de langue source.
Le logiciel est fourni "tel quel", sans garantie d'aucune sorte, express ou implicite, y compris, mais sans s'y limiter, les garanties de qualité marchande, d'adéquation à un usage particulier, de titre et de non-contrefaçon. En aucun cas, les titulaires de droits d'auteur ne seront pas responsables de tout dommage ou d'une autre responsabilité, que ce soit dans le contrat, le délit ou autrement, découlant de, hors du logiciel ou du logiciel ou de l'utilisation ou d'autres transactions dans le logiciel.