$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [Boost-users] [qi and lambda] Get wrong reaction of the qi::rule if I use lambda for the action
From: TONGARI (tongari95_at_[hidden])
Date: 2011-08-15 10:19:35
2011/8/15 <boost_mailinglist_at_[hidden]>
> Hello,
>
> if I execute the following example, I get the following output "The bad one
> The good one a" but I only expected "The good one a".
>
> Why does it happens?  Boost 1.47.0 was used.
>
>
> #include <boost/config/warning_disable.**hpp>
> #include <boost/spirit/include/qi.hpp>
> #include <boost/lambda/lambda.hpp>
>
> #include <iostream>
>
> int main()
> {
>    using boost::spirit::qi::char_;
>    using boost::spirit::qi::parse;
>
>    char const *first = "{a}", *last = first + std::strlen(first);
>
>    parse(first, last, '{' >> char_("a")[std::cout << "The good one " <<
> boost::lambda::_1 << '\n'] |
>        char_("b")[std::cout << "The bad one " << boost::lambda::_1 << '\n']
> >> '}');
>
>    return 0;
> }
>
Because  (std::cout << "The good one ") & (std::cout << "The bad one ") are
not lambda expressions so they are executed immediately, and it seems
Boost.Lambda just happened to work here.
The corrected version would be:
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <iostream>
int main()
{
   using boost::spirit::qi::char_;
   using boost::spirit::qi::parse;
   using boost::spirit::qi::_1;
   using boost::phoenix::val;
   char const *first = "{a}", *last = first + std::strlen(first);
   parse(first, last, '{' >> char_("a")[std::cout << phx::val("The good one
") << _1 << '\n'] |
       char_("b")[std::cout << phx::val("The bad one ") << _1 << '\n'] >>
'}');
   return 0;
}
HTH