3
votes

I want to create a parser that will match exactly two alphanumeric words from a string, such as:

message1 message2

and then save that into two variables of type std::string.

I've read this previous answer which seems to work for an endless amount of repetitions, which uses the following parser:

+qi::alnum % +qi::space

However when I try to do this:

 bool const result = qi::phrase_parse(
            input.begin(), input.end(),
            +qi::alnum >> +qi::alnum,
            +qi::space,
            words
    );

the words vector contains every single letter in a different string:

't'
'h'
'i'
's'
'i'
's'

This is extremely counter-intuitive, and I'm not sure as to why it's happening. Could someone please explain that?

Also, can I have two predefined strings to be populated instead of a std::vector?

Final note: I would like to avoid the using statement, as I would like to have every namespace clearly defined to help me understand how Spirit works.

1

1 Answers

4
votes

Yes, but the skipper ignores the whitespace before you can act on it.

Use lexeme to control the skipper:

bool const result = qi::phrase_parse(
        input.begin(), input.end(),
        qi::lexeme [+qi::alnum] >> qi::lexeme [+qi::alnum],
        qi::space,
        words
);

Note the skipper should be qi::space instead of +qi::space.

See also Boost spirit skipper issues