Articulo de referencia

Marco de trabajo del analizador Spirit

Spirit Parser Framework es un marco de trabajo generador de analizadores sintácticos descendentes recursivos orientados a objetos, implementado mediante técnicas de metaprograma...

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

  1. Guzman, Joel de; Kaiser, Hartmut. "Spirit 2.59 - Introducción" . Boost.org . Boost . Consultado el 22 de marzo de 2025 .
  • 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.