Analizar cadenas escapado con espíritu impulso
-
26-09-2019 - |
Pregunta
Estoy trabajando con el Espíritu 2.4 y que me gustaría analizar una estructura como esta:
texto {} text_field;
El punto es que en text_field es una cadena escapada con los símbolos '{', '}' y '\'. Me gustaría crear un programa de análisis para este uso de qi. He estado tratando de esto:
using boost::spirit::standard::char_;
using boost::spirit::standard::string;
using qi::lexeme;
using qi::lit;
qi::rule< IteratorT, std::string(), ascii::space_type > text;
qi::rule< IteratorT, std::string(), ascii::space_type > content;
qi::rule< IteratorT, std::string(), ascii::space_type > escChar;
text %=
lit( "Text" ) >> '{' >>
content >>
"};"
;
content %= lexeme[ +( +(char_ - ( lit( '\\' ) | '}' ) ) >> escChar ) ];
escChar %= string( "\\\\" )
| string( "\\{" )
| string( "\\}" );
Pero no incluso compilar. Alguna idea?
Solución
Su gramática podría ser escrito como:
qi::rule< IteratorT, std::string(), ascii::space_type > text;
qi::rule< IteratorT, std::string() > content;
qi::rule< IteratorT, char() > escChar;
text = "Text{" >> content >> "};";
content = +(~char_('}') | escChar);
escChar = '\\' >> char_("\\{}");
es decir.
-
texto es
Text{
seguido por el contenido seguido por}
-
contenido es al menos una instancia de ya sea un personaje (pero no
}
) o un escChar -
escChar es una sola
\\
escapado,{
o}
Tenga en cuenta, el escChar regla ahora devuelve un solo carácter y los descartes del \\
escapar. No estoy seguro de si eso es lo que necesita. Además, me quita el patrón para el contenido y escChar reglas, lo que permite dejar fuera de la lexeme[]
(una regla sin patrón actúa como un lexema implícita).