Cordes avec Parsing échappées esprit boost
-
26-09-2019 - |
Question
Je travaille avec l'Esprit 2.4 et je voudrais analyser une structure comme ceci:
{Texte} text_field;
Le point est que dans text_field est une chaîne échappée avec les symboles « { », « } » et « \ ». Je voudrais créer un analyseur syntaxique pour cela en utilisant le qi. J'ai essayé ceci:
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( "\\}" );
Mais ne même pas compiler. Toute idée?
La solution
Votre grammaire peut être écrite comme:
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_("\\{}");
i.e..
-
text est
Text{
suivi par le contenu suivie}
-
contenu est au moins une instance de soit un caractère (mais pas
}
) ou un escChar -
escChar est un
\\
seul échappé,{
ou}
Note, escChar règle renvoie désormais un seul caractère et les rejets de la \\
échapper. Je ne sais pas si c'est ce dont vous avez besoin. De plus, je l'ai enlevé le skipper pour la contenu et escChar règles, ce qui permet de laisser tomber le lexeme[]
(règle sans skipper agit comme un lexème implicite).