
Hi, I get a different attribute composition depending on the use of expectation points. Here is a small example: //////////////////////////////////////////////////////////////////////////////////////////////// // BOOST_FUSION_DEFINE_STRUCT( (client), input, (int, index1) (std::string, text) (int, index2) ) namespace client { namespace fusion = boost::fusion; namespace phoenix = boost::phoenix; namespace qi = boost::spirit::qi; namespace char_enc = boost::spirit::iso8859_1; template <typename Iterator, typename Skipper> struct line_grammar : qi::grammar<Iterator, input(), Skipper> { line_grammar() : line_grammar::base_type(line) { using qi::int_; using qi::omit; using char_enc::char_; using qi::lit; line = int_ >> lit(",") #ifdef USE_EXPECTATION_POINT > *(char_ - ( "," >> int_ ) ) #else >> *(char_ - ( "," >> int_ ) ) #endif >> lit(",") >> int_ ; } qi::rule<Iterator, input(), Skipper > line; }; bool read_line( ) { typedef line_grammar<std::string::const_iterator, char_enc::space_type> grammar; grammar gr; // Our grammar input line_read; std::string source = "1,x,2"; std::string::const_iterator iter = source.begin(); std::string::const_iterator end = source.end(); bool r = phrase_parse(iter, end, gr, char_enc::space, line_read); return r && iter == end; } } // ///////////////////////////////////////////////////////////////////////////////////////////////////////// If USE_EXPECTATION_POINT is not defined then parsing succeeds and line_read == {1, "x", 2 }. But if USE_EXPECTATION_POINT is defined then parsing also succeeds but line_read == {1, "x\0x2", 0 }. So, it seems that expectation points somehow break the semantics of attribute composition. Tobias