2010-10-26 3 views
4

je travaille avec l'Esprit 2.4 et je voudrais analyser une structure comme celle-ci:Parsing échappé cordes avec l'esprit boost

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 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 compile même pas. Une idée?

+0

L'erreur du compilateur (et la ligne sur laquelle il est) aiderait. –

Répondre

7

Votre grammaire pourrait être écrit:

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

-à-dire

  • texte est Text{ suivi par le contenu suivi par }

  • contenu est au moins une instance de soit un caractère (mais pas }) ou un escChar

  • escChar est un échappé \\, { ou }

Note, la règle escChar retourne maintenant un seul caractère et rejette l'échappement \\. Je ne suis pas sûr si c'est ce dont tu as besoin. De plus, j'ai supprimé le skipper pour les règles contenu et escChar, ce qui permet d'omettre le lexeme[] (une règle sans skipper agit comme un lexème implicite).

+1

Bonjour, merci et merci pour votre aide. J'ai essayé votre solution, mais elle ne parvient pas à l'analyser: Texte {\}}; Je pensais que c'était parce que le parser ~ char_ ('}') correspondait à la barre oblique inverse, mais j'ai essayé ce qui suit sans succès: content = + (~ char_ ("\\\\}") | escChar) ;. Une idée? – Bruno

+1

Oui, c'est vrai. ~ char_ ('}') correspond bien à l'antislash. Je suis désolé pour cet oubli. Si vous changez cela en ~ char _ ("\\}"), cela ne devrait plus être le cas. – hkaiser