2017-07-25 3 views
-1

Lorsque le fichier se termine au milieu d'une règle avec les attentes restantes, il ne déclenche pas d'erreur d'attente (il échoue, bien sûr, à analyser).Echec de l'attente non déclenché si le fichier se termine avec l'analyseur Boost Spirit Qi

Un exemple simplifié qui déclenche le comportement est ceci:

data_var_decls_r 
    %= (lit("data") 
     > lit('{')) 
    > lit('}'); 

Si l'entrée est seulement

data { 

l'erreur d'attente pour la finale attendue } n'est pas déclenchée.

Existe-t-il un moyen de gérer les erreurs d'attente qui dépassent la fin du fichier?

+1

Ce n'est pas un exemple selfcontained – sehe

Répondre

2

en faire un exemple autonome:

Voir ce Live On Wandbox

#include <boost/spirit/include/qi.hpp> 

namespace test { 
    using namespace boost::spirit::qi; 

    rule<std::string::const_iterator> rule = lit("data") > '{' > '}'; 
} 

int main() { 
    std::string const input("data{"); 

    bool ok = parse(input.begin(), input.end(), test::rule); 
} 

Est-ce que l'échec de l'attente de jet.

Même lors de l'utilisation de l'espace skipper, il jette encore:

Voir ce Live On Wandbox trop

#include <boost/spirit/include/qi.hpp> 

namespace test { 
    using namespace boost::spirit::qi; 

    rule<std::string::const_iterator, space_type> rule = lit("data") > '{' > '}'; 
} 

int main() { 
    std::string const input("data{"); 

    bool ok = phrase_parse(input.begin(), input.end(), test::rule, test::space); 
} 
+0

Merci pour l'exemple simple autonome. J'espérais que c'était un problème connu avec une solution connue. Je vais essayer de simplifier nos dizaines de fichiers et de grammaires dans un exemple qui illustre le problème. Je ne peux pas réussir car nos grammaires sont vraiment énormes à ce stade et je n'ai aucune idée d'où ce problème pourrait provenir. Y a-t-il des conseils généraux pour les grammaires debuggin Spirit Qi quelque part? Je finis juste d'écrire beaucoup d'actions sémantiques de rappel pour imprimer des progrès, mais c'est un processus très long. –

+0

Beaucoup d'entre eux sur SO (juste chercher mes réponses ...). Un lien vers un dépôt public pourrait vous aider. Regardez les macros 'BOOST_SPIRIT_DEBUG *'. Et, [ne pas compliquer avec des actions sémantiques ..: (] (https://stackoverflow.com/questions/8259440/boost-spirit-semantic-actions-are-evil) – sehe

+0

Aussi, devrais-je poster une nouvelle question ou éditer? Je ne suis jamais sûr du protocole sur StackOverflow et je vois des devs tout le temps sur les questions éditées.Je peux voir que ma question initiale a ennuyé quelqu'un assez pour downvote et je ne veux pas rester ennuyeux –