3
我試圖定義一個解析器,其中規則沒有完全預定義,即它們包含可變部分。這與齊靈無關,但由於X3的靜態特性,我無法實現它。我嘗試了與指令,這是不幸的,但沒有記錄,但沒有運氣到目前爲止。目前爲止我發現的唯一例子是在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", ';');
}
我註釋掉的部分,我試圖用指令使用。
這是目前可能與X3?有沒有人做過這個?
只是想大聲這裏...您可以創建調用轉發給相應''%的解析函數自己'parse'功能。在這種情況下,你可能可以使用'x3 :: get'來從'context'(這是一個用於解析函數的參數)中獲得分隔符? – Arunmu