如何用x3中的继承属性重写qi解析器?

时间:2017-03-31 20:14:57

标签: c++ boost boost-spirit boost-spirit-qi boost-spirit-x3

如果在语义动作中使用了继承的属性,我们可以使用x3::with指令。

如果我们想将属性用作解析器的一部分,该怎么办?例如,简单的解析器匹配1个或多个字母字符,除了字符来自参数字符集。

qi::rule<std::string::const_iterator, qi::unused_type(char const*)> rule =
    +(qi::alpha - qi::char_(qi::_r1));

或者参数char set可以用作延迟解析器。

qi::rule<std::string::const_iterator, qi::unused_type(char const*)> rule =
    +(qi::alpha - qi::lazy(qi::_r1));

x3 :: with directive将此本地值放在上下文中。我不确定我们是否可以在语义操作之外使用此上下文并最终生成解析器。

1 个答案:

答案 0 :(得分:3)

简单地放弃旧规则的习惯。

'all the king's men and all the king's horses' -> 'all t'

Live On Coliru ,打印:

#include <boost/spirit/home/x3.hpp> #include <iostream> namespace x3 = boost::spirit::x3; template <typename Sub> auto negate(Sub p) { return +(x3::char_ - x3::as_parser(p)); }; int main() { std::string input("all the king's men and all the king's horses"), parsed; if (parse(input.begin(), input.end(), negate("horse"), parsed)) std::cout << "'" << input << "' -> '" << parsed << "'\n"; }

第二种味道:

'all the king's men and all the king's horses' -> 'all the king's men and all the king's '

Live On Coliru ,打印:

x3::with<>

更复杂的东西

您还可以在自定义解析器中聚合子解析器:

如果您需要传递规则,我建议with<>(虽然我不确定上下文为{{1}}构建重入状态,但您需要测试精确的语义,除非你能找到它的文档)