Pergunta

Estou trabalhando com o Spirit 2.4 e gostaria de analisar uma estrutura como esta:

Texto {text_field};

O ponto é que em text_field é uma string escapada com os símbolos '{', '}' e ''. Eu gostaria de criar um analisador para isso usando Qi. Eu tenho tentado o seguinte:

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( "\\}" );

Mas nem sequer compilou. Qualquer ideia?

Foi útil?

Solução

Sua gramática pode ser escrita 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_("\\{}");

ou seja

  • texto é Text{ seguido de conteúdo seguido por }

  • contente é pelo menos um exemplo de um personagem (mas não }) ou uma escchar

  • escchar é um único escapado \\, {, ou }

Note o escchar A regra agora retorna um único personagem e descarta a fuga \\. Não tenho certeza se é isso que você precisa. Além disso, removi o capitão para o contente e escchar regras, que permitem deixar de lado o lexeme[] (Uma regra sem capitão age como um lexeme implícito).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top