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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top