Заполнитель в
std::cout << val("set name statement to: ") << _3 << "\n"
относится к boost::spirit::_3
, который является заполнителем boost.phoenix v2. Заполнитель в
boost::bind(&writer::print, &w, ::_3)
является заполнителем boost.bind (естественно).
Эти заполнители не имеют одинаковое поведение или даже ссылаются на одни и те же данные. Заполнители Phoenix в форме _ N ссылаются на N-й податрибут вашего синтаксического анализатора, тогда как заполнители привязки имеют другое значение:
- _1 относится к атрибуту вашего парсера в целом
- _2 относится к контексту синтаксического анализатора
- _3 относится к
bool&
параметру 'hit'
Самое простое решение в вашем случае - использовать boost::phoenix::bind
вместо boost::bind
, чтобы вы могли продолжать использовать _3
для ссылки на третий податрибут вашего синтаксического анализатора вместо необходимости выбирать его вручную внутри writer::print
.
Либо добавьте семантическое действие только к tok.identifier
, чтобы ::_1
boost.bind работал так, как вы ожидаете:
set_name
= tok.set_
>> tok.name_
>> tok.identifier[boost::bind(&writer::print, &w, ::_1)]
;