stringtranslate.com

Marco de análisis Spirit

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 .

Operadores

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 .

Ejemplo

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 " ; }       

Referencias

Enlaces externos