简单的 x3 代码无法编译,因为第二个 ruleTest 或整个解析器没有附加任何内容。即使我们放x3::omit[ruleTest]
第二个ruleTest
,它仍然无法编译。
void Test(std::string const& str) {
auto const ruleTest = x3::rule<struct _, std::string>{} =
*(x3::char_ - ' ')[([](auto& ctx){x3::_val(ctx)+='x';})];
x3::parse(boost::begin(str), boost::end(str),
ruleTest[([](auto& ctx){std::cout<<x3::_attr(ctx)<<std::endl;})] >>
' ' >>
ruleTest
);
}
只有当我们将 lambda 或属性附加到 x3::parse 或使用 BOOST_SPIRIT_DEFINE 全局定义 ruleTest 时才能解决问题。
void Test(std::string const& str) {
auto const ruleTest = x3::rule<struct _, std::string>{} =
*(x3::char_ - ' ')[([](auto& ctx){x3::_val(ctx)+='x';})];
std::string attr;
x3::parse(boost::begin(str), boost::end(str),
ruleTest[([](auto& ctx){std::cout<<x3::_attr(ctx)<<std::endl;})] >>
' ' >>
ruleTest, attr);
}