La biblioteca de plantilla de gramática de expresión de análisis (PEGTL) es una biblioteca de combinador analizador de encabezado C ++ de dependencia cero para crear analizadores de acuerdo con una gramática de expresión de análisis (PEG).
Durante el desarrollo de una nueva versión principal, la rama principal puede pasar por cambios incompatibles. Para una experiencia estable, descargue la última versión en lugar de usar la rama principal.
Para obtener preguntas y sugerencias sobre las historias de PEGTL, éxito o fracaso, y cualquier otro tipo de retroalimentación, no dude en abrir una discusión, un problema o una solicitud de extracción, o comuníquese con los autores de taocpp(at)icemx.net .
Las gramáticas se escriben como código C ++ regular, creado con programación de plantillas (no programación meta de plantilla), es decir, instancias de plantilla anidada que corresponden naturalmente a la definición inductiva de PEG (y otros enfoques de combinador de analizador).
Se incluye un conjunto integral de reglas de analizador que el usuario puede combinar y extender, al igual que los mecanismos para la depuración de las gramáticas y para adjuntar acciones definidas por el usuario a las reglas de gramática. Aquí hay un ejemplo de cómo se implementa una regla de gramática de expresión de análisis como clase C ++ con el 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 > > {};Las PEG son superficialmente similares a las gramáticas sin contexto (CFG), sin embargo, la naturaleza más determinista de las PEG da lugar a algunas diferencias muy importantes. El análisis gramatical incluido encuentra varios errores típicos en las clavijas, incluida la recursión a la izquierda.
La PEGTL está diseñada para ser "delgada y media", la biblioteca central consta de aproximadamente 6000 líneas de código. El énfasis está en la simplicidad y la eficiencia, prefiriendo un enfoque simple bien ajustado sobre las optimizaciones complicadas.
El PEGTL se preocupa principalmente por los combinadores de análisis y las reglas de la gramática, y por dar al usuario de la biblioteca (la posibilidad de) control total sobre todos los demás aspectos de una ejecución de análisis. Si se toman/qué acciones se toman y si qué estructuras de datos se crean durante una ejecución de análisis, depende completamente del usuario.
Se incluyen algunos ejemplos para una situación típica, como secuencias de escape sin cero en cadenas, construyendo una estructura genérica de datos JSON y evaluación sobre las expresiones aritméticas.
Mediante el uso de especializaciones de programación de plantillas y plantillas, es posible escribir una gramática una vez, y usarla de múltiples maneras con diferentes acciones (semánticas) en diferentes (o las mismas) ejecuciones de análisis.
Con el formalismo de PEG, la separación en etapas Lexer y Parser generalmente se cae, todo se hace en una sola gramática. Las reglas se expresan en C ++ como instanciaciones de plantilla, y es la tarea del compilador optimizar las gramáticas PEGTL.
Cada confirmación se prueba automáticamente con múltiples arquitecturas, sistemas operativos, compiladores y versiones de los mismos.
Cada confirmación se verifica con los desinfectantes GCC y Clang, el analizador estático de Clang y clang-tidy . Además, usamos CodeQL para escanear los problemas (de seguridad).
La cobertura del código se mide automáticamente y las pruebas unitarias cubren el 100% del código de biblioteca central (para versiones).
Las versiones se realizan de acuerdo con el versiones semánticas. Los cambios de API incompatibles solo se permiten ocurrir entre las versiones principales.
En aprecio de todas las contribuciones aquí están las personas que han contribuido directamente a PEGTL y/o su desarrollo.
El PEGTL es parte del arte de C ++.
Copyright (c) 2007-2023 Daniel Frey y Dr. Colin Hirsch
El PEGTL está certificado de software de código abierto. Tiene licencia bajo los términos de la licencia de software Boost, versión 1.0 reproducida aquí.
Licencia de software Boost - Versión 1.0 - 17 de agosto de 2003
El permiso se otorga, de forma gratuita, a cualquier persona u organización que obtenga una copia del software y la documentación que acompaña a esta licencia (el "software") para usar, reproducir, mostrar, distribuir, ejecutar y transmitir el software, y para preparar trabajos derivados del software, y permitir que terceros a quienes se proporciona el software, todo lo que está sujeto a lo que está sujeto a lo siguiente: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación: a continuación;
Los avisos de derechos de autor en el software y toda esta declaración, incluida la subvención de licencia anterior, esta restricción y el siguiente descargo de responsabilidad, deben incluirse en todas las copias del software, en su totalidad o en parte, y todos los trabajos derivados del software, a menos que dichas copias o trabajos derivados estén únicamente en forma de código de objeto ejecutable a máquina generado por un procesador de lenguaje fuente.
El software se proporciona "tal cual", sin garantía de ningún tipo, expresa o implícita, incluidas, entre otros, las garantías de comerciabilidad, idoneidad para un propósito particular, título y no infracción. En ningún caso, los titulares de derechos de autor o cualquiera que distribuya el software sea responsable de ningún daño u otro responsabilidad, ya sea en contrato, agravio o de otra manera, que surja, fuera o en relación con el software o el uso u otros tratos en el software.