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?

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top