If you're not on the develop branch you don't have the fix for that single-element sequence adaptiation bug, so yeah it's probably that.
Due to the genericity of attribute transformation/propagation, there's a lot of wiggle room, but of course it's just documented and ultimately in the code. In other words: there's no magic.
In the Qi days I'd have "fixed" this by just spelling out the desired transform with qi::as<>
or qi::attr_cast<>
. X3 doesn't have it (yet), but you can use a rule to mimick it very easily:
Live On Coliru
#include <iostream>
#include <boost/fusion/adapted/struct.hpp>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
struct Name {
std::string value;
};
BOOST_FUSION_ADAPT_STRUCT(Name, value)
int main() {
std::string const input = "Halleo123_1";
Name out;
bool ok = x3::parse(input.begin(), input.end(),
x3::rule<struct _, std::string>{} =
x3::alpha >> *(x3::alnum | x3::char_('_')),
out);
if (ok)
std::cout << "Parsed: " << out.value << "
";
else
std::cout << "Parse failed
";
}
Prints:
Parsed: Halleo123_1
Automate it
Because X3 works so nicely with c++14 core language features, it's not hard to reduce typing:
Understanding the List Operator (%) in Boost.Spirit
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…