Разбор собственных матриц с Boost Spirit X3 - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь проанализировать матрицу Eigen::Matrix3f с Boost Spirit X3, где входная строка равна matrix(a,b,c,d,tx,ty), а полученная матрица Eigen 3x3 будет следующей:

[a, c, tx
 b, d, ty
 0, 0, 1]

Я уже могу синтезировать атрибуты std::vector<float>, но вместо этого я бы хотел синтезировать Eigen::Matrix3f. Каков наилучший способ синтеза Eigen::Matrix3f (или любого другого пользовательского типа матрицы в этом отношении)?

1 Ответ

0 голосов
/ 10 июня 2019

Я нашел решение, используя Semantic Actions, вот код:

auto identity = [&](auto& ctx){x3::_val(ctx) = Eigen::Matrix3f::Identity();};
auto a = [&](auto& ctx){x3::_val(ctx)(0,0) = x3::_attr(ctx);};
auto b = [&](auto& ctx){x3::_val(ctx)(1,0) = x3::_attr(ctx);};
auto c = [&](auto& ctx){x3::_val(ctx)(0,1) = x3::_attr(ctx);};
auto d = [&](auto& ctx){x3::_val(ctx)(1,1) = x3::_attr(ctx);};
auto tx = [&](auto& ctx){x3::_val(ctx)(0,2) = x3::_attr(ctx);};
auto ty = [&](auto& ctx){x3::_val(ctx)(1,2) = x3::_attr(ctx);};

auto matRule = x3::rule<class MatId, Eigen::Matrix3f>() = x3::eps[identity] >> x3::no_case["matrix"]
                                                                                >> "("
                                                                                >> x3::float_[a]
                                                                                >> ","
                                                                                >> x3::float_[b]
                                                                                >> ","
                                                                                >> x3::float_[c]
                                                                                >> ","
                                                                                >> x3::float_[d]
                                                                                >> ","
                                                                                >> x3::float_[tx]
                                                                                >> ","
                                                                                >> x3::float_[ty]
                                                                                >> ")";

std::string teststr = "matrix(2,3,4,5,6,7)";
Eigen::Matrix3f mat;
bool success = x3::phrase_parse(teststr.begin(), teststr.end(), matRule, x3::space, mat);

if (success) std::cout << mat << std::endl;
...