是否有某个文档描述了各种spirit :: x3规则定义操作如何影响属性兼容性?
我很惊讶:
x3::lexeme[ x3::alpha > *(x3::alnum | x3::char_('_')) ]
无法移动到融合适应的结构中:
struct Name {
std::string value;
};
暂时,我摆脱了第一个强制字母字符,但我仍然想表达一个规则,该规则定义名称字符串必须以字母开头。这是其中一种情况,我需要尝试添加eps
,直到它工作,或者是否有一个明确的原因,为什么上述不起作用?
如果在某处写下来我道歉,我找不到。
答案 0 :(得分:8)
如果您不在开发分支上,那么您没有针对该单元素序列适应错误的修复,所以是的,可能就是这样。
由于属性转换/传播的通用性,有很多摆动空间,但当然它只是记录在案并最终在代码中。换句话说:没有魔力。
在Qi时代,我只需通过qi::as<>
或qi::attr_cast<>
拼出所需的变换来“解决”这个问题。 X3还没有它(但是),但你可以使用一个规则很容易地模仿它:
<强> 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 << "\n";
else
std::cout << "Parse failed\n";
}
打印:
Parsed: Halleo123_1
因为X3与c ++ 14核心语言功能的结合非常好,所以减少输入并不难: