2013-10-16 11 views
28

Questo può essere molto ovvio, ma perché l'analisi basata sul flusso in boost duplica l'ultima lettera? Devo fare qualcosa di sbagliato:Boost Spirit Qi - Duplica ultima lettera con parsing basato sul flusso

#include <iostream> 
#include <sstream> 

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

namespace qi = boost::spirit::qi; 

int main() { 
    std::string input = "hello"; 
    std::stringstream ss(input); 

    std::string r1, r2; 
    boost::spirit::istream_iterator first(ss), last; 

    qi::phrase_parse(input.begin(), input.end(), qi::lexeme[qi::alpha >> *qi::alnum], qi::space, r1); 

    std::cout << r1 << std::endl; // prints "hello" 

    qi::phrase_parse(first, last, qi::lexeme[qi::alpha >> *qi::alnum], qi::space, r2); 

    std::cout << r2 << std::endl; // prints "helloo" 
} 

Testato con XCode 5.0 e Boost 1.54.0.

Modifica: Il problema sembra essere specifico per libC++. Qualcuno che usa Clang per confermare?

+2

Il tuo codice stampa due volte "ciao" sul mio sistema. Mingw, gcc 4.8.1, boost 1.54.0 –

+0

Grazie per il test. Proverò un paio di altre configurazioni ... – kloffy

+2

Ok, dipende se scelgo libC++ (output errato) o libstdC++ (output corretto). Questo è strano ... – kloffy

risposta

1

Se ho capito correttamente, you're not supposed to use input iterators, perché possono causare problemi con il backtracking. Forse è solo pura fortuna/una differenza nell'implementazione che a volte funziona a tutti.

+1

Buon punto, ma il esempio già usa un 'boost :: spirit :: istream_iterator', che secondo la mia comprensione dovrebbe funzionare. Vedi qui: http://boost-spirit.com/home/2010/01/05/stream-based-parsing-made-easy/. – kloffy

+0

@kloffy: hai ragione, ho completamente trascurato il boost :: spirit :: prima di esso. – ecotax