Parsing escapou Strings com espírito de impulso
-
26-09-2019 - |
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?
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 esccharescchar é 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).