El Spirit Parser Framework es un marco generador de analizadores sintácticos descendentes recursivos orientado a objetos implementado mediante técnicas de metaprogramación de plantillas . Las plantillas de expresión permiten a los usuarios aproximarse completamente a la sintaxis de la forma Backus–Naur extendida (EBNF) en C++ . Los objetos del analizador se componen mediante la sobrecarga de operadores y el resultado es un analizador sintáctico LL(∞) con retroceso que es capaz de analizar gramáticas bastante ambiguas .
Spirit se puede utilizar tanto para análisis léxico como sintáctico, juntos o por separado.
Este marco es parte de las bibliotecas Boost .
Debido a las limitaciones del lenguaje C++, la sintaxis de Spirit ha sido diseñada en torno a las precedencias de operadores de C++, aunque guarda similitudes con EBNF y con expresiones regulares .
Este ejemplo muestra cómo utilizar una expresión de analizador 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 () { espacio de nombres qi = boost :: spirit :: qi ; std :: string input ; std :: cout << "Ingrese una línea: \n " ; getline ( std :: cin , input ); std :: cout << "Got '" << 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 coincide, incrementa el contador "count") o cualquier carácter (que se omitirá) ) El compilador construye el analizador mediante 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. */ regla automática = * ( qi :: lit ( "cat" ) [ ++ qi :: _val ] | qi :: omit [ qi :: char_ ]); qi :: parse ( entrada . begin (), entrada . end (), regla , count ); // Finalmente, muestra los resultados. std :: cout << "La entrada contenía " << count << " ocurrencias de 'cat' \n " ; }