如果继承的属性用于语义操作,则可以使用x3::with
指令。
如果我们想将属性用作解析器的一部分怎么办?例如,一个简单的解析器匹配1个或多个字母字符,但该字符来自参数char集中。
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指令将此局部值放在上下文中。我不确定是否可以在语义 Action 之外使用此上下文并最终生成解析器。
最佳答案
只需摒弃规则化一切的旧习惯。
#include <boost/spirit/home/x3.hpp>
#include <iostream>
namespace x3 = boost::spirit::x3;
template <typename... Args>
auto negate(Args&&... p) {
return +(x3::char_ - x3::char_(std::forward<Args>(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";
}
Live On Coliru ,打印:
'all the king's men and all the king's horses' -> 'all t'
第二味:
#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";
}
Live On Coliru ,打印:
'all the king's men and all the king's horses' -> 'all the king's men and all the king's '
更复杂的东西
您还可以在自定义解析器中聚合子解析器:
如果您需要绕过的递归规则,建议您使用
x3::with<>
(尽管我不确定上下文是否为with<>
构建可重入状态,但除非您能找到相关文档,否则您需要测试精确的语义)关于c++ - 如何在x3中用继承的属性重写qi解析器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43149000/