2017-07-18 3 views
2

Je finis par obtenir ces erreurs de mouvement beaucoup et je ne sais pas pourquoi, sinon d'avoir quelque chose à voir avec la façon dont je suis l'analyse des chaînes. Supprimer tout ce qui a trait à 'mannequin' et les erreurs reviennent. Quelqu'un a mentionné using attr_gen (n'a pas pu trouver ceci dans les docs) et en faisant ainsi, je peux passer ces erreurs de compilation de «traits :: move_to», mais l'analyseur échoue toujours. J'ai marqué les lignes que j'ai ajoutées pour le compiler, mais ne pense pas être nécessaire avec "< ---".X3, qu'est-ce que attr_gen?

#define BOOST_SPIRIT_X3_DEBUG 

#include <complex> 
#include <iostream> 
#include <string> 
#include <vector> 

#include <boost/spirit/home/x3.hpp> 
#include <boost/fusion/include/adapt_struct.hpp> 
#include <boost/fusion/include/io.hpp> 

namespace client { 
    namespace ast { 
     struct number { 
      int num1; 
      int num2; 
     }; 

     struct comment { 
      std::string text; 
      bool dummy;  // <--- 
     }; 

     struct input { 
      std::vector<comment> comments; 
      std::vector<number> numbers; 
     }; 
    } 
} 

BOOST_FUSION_ADAPT_STRUCT(client::ast::comment, text, dummy) // <--- 
BOOST_FUSION_ADAPT_STRUCT(client::ast::number, num1, num2) 
BOOST_FUSION_ADAPT_STRUCT(client::ast::input, comments, numbers) 

namespace client {  
    namespace parser { 

     namespace x3 = boost::spirit::x3; 
     namespace ascii = boost::spirit::x3::ascii; 

     using namespace x3; 
     x3::attr_gen dummy; // <---     

     auto const comment = char_ % ' ' >> dummy(false);  // <--- 
     //auto const comment = lexeme[+graph] >> dummy(false); 
     auto const number = int_ >> int_; 

     auto lines = [](auto p) { return *(p >> eol); }; 

     auto const input = skip(blank) [ 
      lines(comment) >> 
      lines(number) 
     ]; 
    } 
} 

int main() 
{ 
    namespace x3 = boost::spirit::x3; 
    using boost::spirit::x3::ascii::blank; 
    using x3::char_; 

    std::string const iss(R"(this is a test 
    1 2)"); 

    auto iter = iss.begin(), eof = iss.end(); 

    client::ast::input types; 

    bool ok = parse(iter, eof, client::parser::input, types); 

    if (iter != eof) { 
     std::cout << "Remaining unparsed: '" << std::string(iter, eof) << "'\n"; 
    } 
    std::cout << "Parsed: " << (100.0 * std::distance(iss.begin(), iter)/iss.size()) << "%\n"; 
    std::cout << "ok = " << ok << std::endl; 

    for (auto& item : types.comments) { std::cout << boost::fusion::as_deque(item) << "\n"; } 
    for (auto& item : types.numbers) { std::cout << boost::fusion::as_deque(item) << "\n"; } 
} 
+0

Si vous divisez la question sur l'analyse syntaxique jusqu'à la fin de la ligne ... Poser deux questions sans rapport à la fois rend la question inutile aux autres à l'avenir. – sehe

+0

Alors, vous avez oublié l'autre question? J'ai la réponse [assis ici en attente] (https://stackoverflow.com/a/45162122/85371) – sehe

+0

A dû courir, pensait que cela avait l'air assez simple. Suppression de la question "till eol". Cependant, j'ai essayé toutes ces trois méthodes et continue d'obtenir des erreurs. Je ne connais pas trop les différences entre Qi et X3, mais j'utilise X3. J'ai changé mon analyse en phrase_parse mais en quelque sorte la règle ne se mélange pas bien avec ce que j'ai."keep keep workaround" est la méthode sur laquelle j'ai choisi de me concentrer, car cela me semblait une bonne solution de contournement. – Ender

Répondre

0
comment = char_ % ' '; 

Cette analyse 1 ou plusieurs caractères arbitraires séparés par des littéraux seul espace. Dans votre cas, il peut correspondre seulement 't' parce que ce qui suit est 'h', pas un ' '.

Je naturellement épelle

comment = *(char_ - eol); 

Donc, il correspondre à quelque chose jusqu'à ce que eol. Si vous insistez sur l'adéquation entre les choses « verbeux », par tous les moyens

comment = skip(blank) [ *lexeme[+graph_] ]; 

Synthétiser l'entrée adaptée dans un attribut de chaîne, l'envelopper dans raw[]:

comment = raw [ skip(blank) [ *graph_ ] ]; 

Ou si, en effet vous voulez pas d'autre des espaces que ' ', rendent si

comment = raw[ skip(' ') [ *graph_ ] ]; 

il est un peu bizarre de ce sort comme

comment = raw[ (+graph_) % ' ' ]; 

Parce que

  • il ne correspond pas à une ligne vide
  • il ne correspond pas "hello world" ou ` "bonjour \ tworld" »