El Analizador Marco Espíritu es un objeto orientado descenso recursivo generador de analizadores sintácticos marco implementado usando plantilla metaprogramación técnicas. Las plantillas de expresión permiten a los usuarios aproximarse a la sintaxis del formulario extendido Backus-Naur (EBNF) completamente en C ++ . Los objetos del analizador se componen mediante la sobrecarga de operadores y el resultado es un analizador LL (∞) retroactivo que es capaz de analizar gramáticas bastante ambiguas .
Spirit se puede utilizar tanto para leer como para analizar, juntos o por separado.
Este marco es parte de las bibliotecas de 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 ++, al tiempo que se asemeja tanto a EBNF como a expresiones regulares .
sintaxis | explicación |
---|---|
x >> y | Coincide con x seguido de y. |
x > y | Después de hacer coincidir x, espere y. |
*x | Coincide con x repetido cero o más veces. Esto representa la estrella de Kleene ; C ++ carece de un postfijo unario operador *. |
x | y | Coincide con x. Si x no coincide, intente hacer coincidir y. |
+x | Coincidir con una serie de una o más ocurrencias de x. |
-x | Coincide con x cero o una vez. |
x & y | Empareja x e y. |
x - y | Coincide con x pero no con y. |
x ^ y | Coincide con x, o y, o ambos, en cualquier orden. |
x || y | Coincide con x, o y, o x seguido de y. |
x [ function_expression ] | Ejecute la función / functor devuelto por function_expression, si x coincide. |
( x ) | Coincidir x (se puede utilizar para agrupaciones prioritarias) |
x % y | Coincide con una o más apariciones de x, separadas por apariciones de y. |
~x | Coincide con cualquier cosa menos x (solo con clases de caracteres como ch_p o alnum_p) |
Ejemplo
Este ejemplo muestra cómo utilizar una expresión de analizador en línea con una acción semántica.
#include #include #include #include int main () { espacio de nombres qi = boost :: spirit :: qi ; std :: string input ; std :: cout << "Ingrese una línea: \ n " ; getline ( std :: cin , entrada ); std :: cout << "Got '" << input << "'. \ n " ; recuento sin firmar = 0 ; / * Luego, analice la entrada (input.c_str ()), usando 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 compilador construye el analizador mediante la sobrecarga del operador y la 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 usa la función de análisis . * / regla automática = * ( qi :: lit ( "gato" ) [ ++ qi :: _val ] | qi :: omitir [ qi :: char_ ]); qi :: parse ( input . begin (), input . end (), rule , count ); // Finalmente, muestra los resultados. std :: cout << "La entrada contenía" << count << "apariciones de 'cat' \ n " ; }
enlaces externos
- Página de SourceForge del marco del analizador de espíritu
- Documentación en el proyecto Boost
- Artículo sobre Spirit del diseñador Joel de Guzman en Dr. Dobb's Journal