Spirit Parser Framework es un marco de trabajo generador de analizadores sintácticos descendentes recursivos orientados a objetos, implementado mediante técnicas de metaprogramación de plantillas. Las plantillas de expresiones permiten a los usuarios aproximar completamente la sintaxis de la forma extendida de Backus-Naur (EBNF) en C++ . [ 1 ] Los objetos del analizador se componen mediante sobrecarga de operadores , y el resultado es un analizador LL(∞) con retroceso capaz de analizar gramáticas bastante ambiguas .
Spirit se puede utilizar tanto para el análisis léxico como para el análisis sintáctico, de forma conjunta o por separado.
Este marco de trabajo forma parte de las bibliotecas Boost .
Operadores
Debido a las limitaciones del lenguaje C++, la sintaxis de Spirit se ha diseñado en torno a las precedencias de operadores de C++, a la vez que guarda similitud con EBNF y las expresiones regulares .
Ejemplo
Este ejemplo muestra cómo utilizar una expresión de analizador sintáctico en línea con una acción semántica.
#include <string> #include <iostream> #include <boost/spirit/include/qi.hpp> #include <boost/spirit/include/phoenix.hpp> int main () { namespace qi = boost :: spirit :: qi ;std :: string input ; std :: cout << "Ingrese una línea: \n " ; getline ( std :: cin , input ); std :: cout << "Se recibió '" << input << "'. \n " ; unsigned count = 0 ; /* A continuación, analice la entrada (input.c_str()), utilizando un analizador construido con la siguiente semántica: Cero o más ocurrencias de ( cadena literal "cat" (cuando coincida, incremente el contador "count") o cualquier carácter (que se omitirá) ) El analizador sintáctico es construido por el compilador utilizando sobrecarga de operadores y coincidencia de plantillas, por lo que el trabajo real se realiza dentro de qi::parse(), y la expresión que comienza con * solo inicializa el objeto de regla que utiliza la función de análisis . */ auto regla = * ( qi :: lit ( "cat" ) [ ++ qi :: _val ] | qi :: omit [ qi :: char_ ]); qi :: parse ( input . begin (), input . end (), regla , count );// Finalmente, muestra los resultados. std :: cout << "La entrada contenía " << count << " ocurrencias de 'cat' \n " ; }Referencias
- ↑ Guzman, Joel de; Kaiser, Hartmut. "Spirit 2.59 - Introducción" . Boost.org . Boost . Consultado el 22 de marzo de 2025 .
Enlaces externos
- Página de GitHub del framework de análisis sintáctico Spirit
- Marco de análisis Spirit
- Documentación en el proyecto Boost
- Artículo sobre Spirit del diseñador Joel de Guzman en Dr. Dobb's Journal.
- generadores de analizadores sintácticos
- Herramientas de programación informática