我试图定义一个规则没有完全预定义的解析器,即它们包含一个可变部分。这对灵气没有问题,但由于X3的静态特性,我无法实现。我尝试了with 指令,不幸的是没有记录,但到目前为止还没有运气。到目前为止,我发现的唯一示例是在 lambda 表达式中。
我构建了一个简单的例子来演示这个问题:解析整数,其中分隔符作为参数给出。
#include <boost/spirit/home/x3.hpp>
#include <iostream>
namespace x3 = boost::spirit::x3;
namespace parsing {
x3::rule<struct parser> parser {"parser"};
//struct separator {};
char separator(',');
//auto parser_def = x3::int_ % x3::lit(x3::get<separator>(/* context */)); // candidate function template not viable: requires single argument 'context'
auto parser_def = x3::int_ % x3::lit(separator);
BOOST_SPIRIT_DEFINE(parser)
}
void parse(const std::string &data, const char separator) {
using namespace std;
//auto parser = x3::with<parsing::separator>(ref(separator)) [parsing::parser] >> x3::eoi;
auto parser = parsing::parser >> x3::eoi;
if (x3::parse(data.begin(), data.end(), parser))
cout << "Parse succeeded\n";
else
cout << "Parse failed\n";
}
int main() {
parse("1 2 3", ' ');
parse("1,2,3", ',');
parse("1;2;3", ';');
}
我注释掉了我尝试使用with 指令的部分。
X3目前可以做到这一点吗?有没有人这样做过?