Каков самый простой способ сделать семантическое действие, которое извлекает строку из типичного синтаксического анализатора идентификаторов на основе boost::spirit::x3::lexeme
?
Я думал, что можно обойти необходимость распаковывать атрибут и просто использовать итераторы во входном потоке, но, видимо, x3::_where
не делает то, что я думаю.
Следующее дает output
пустым. Я ожидал, что он будет содержать «foobar_hello».
namespace x3 = boost::spirit::x3;
using x3::_where;
using x3::lexeme;
using x3::alpha;
auto ctx_to_string = [&](auto& ctx) {
_val(ctx) = std::string(_where(ctx).begin(), _where(ctx).end());
};
x3::rule<class identifier_rule_, std::string> const identifier_rule = "identifier_rule";
auto const identifier_rule_def = lexeme[(x3::alpha | '_') >> *(x3::alnum | '_')][ctx_to_string];
BOOST_SPIRIT_DEFINE(identifier_rule);
int main()
{
std::string input = "foobar_hello";
std::string output;
auto result = x3::parse(input.begin(), input.end(), identifier_rule, output);
}
Нужно ли как-то извлекать строку из объектов boost::fusion в x3::_attr(ctx)
или я что-то не так делаю?