Framework Analizador Spirit

De borradopedia
Ir a la navegación Ir a la búsqueda

El artículo sucumbió a un borrado rápido. Ver el registro de borrado en Wikipedia


El Framework Analizador Spirit es un framework analizador de texto orientado a objetos, técnicas de metaprogramación. Las plantillas de expresiones permiten a los usuarios aproximar la sintaxis de BNF Extendido (EBNF) completamente en C++. Los objetos analizadores están compuestos por medio de la sobrecarga de operadores y el resultado es un analizador LL(∞) retrocedido que puede analizar gramáticas ambiguas.

Spirit puede ser utilizado para análisis léxico y análisis, junto o por separado.

Este framework es parte de las bibliotecas boost .

Operadores

Debido a limitaciones del lenguaje C++, la sintaxis de Spirit ha sido diseñada alrededor de las precedencias de operadores de C++, agregando parecido a ambos EBNF y expresiones regulares.

Ejemplo

Estos espectáculos de ejemplo cómo para utilizar un inline parser expresión 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 << "Input a line: \n";
  getline(std::cin, input);
  std::cout << "Got '" << input << "'.\n";
 
  unsigned count = 0;
  /*  
      Next, parse the input (input.c_str()),
      using a parser constructed with the following semantics:
 
      Zero or more occurrences of (
          literal string "cat" (when matched, increment the counter "count")
      or  any character (which will be skipped)
      )

     The parser is constructed by the compiler using operator overloading and
     template matching, so the actual work is done within qi::parse(), and the
     expression starting with * only initializes the rule object that the parse
     function uses.

  */
  auto rule = *(qi::lit("cat") [ ++qi::_val ] | qi::omit[qi::char_]);
  qi::parse(input.begin(), input.end(), rule, count);
  

  // Finally, show results.
  std::cout << "The input contained " << count << " occurrences of 'cat'\n";
}