Boost.Spirit, Nabialek трюк и обработка ошибок - PullRequest
2 голосов
/ 27 января 2012

Можно ли как-то совместить "общую" обработку ошибок (как это дано в руководстве) с уловкой Набиалека?Например:

...
on_error<fail>
(
    start
  , std::cout
        << val("Error! Expecting ")
        << _4                               // what failed?
        << val(" here: \"")
        << construct<std::string>(_3, _2)   // iterators to error-pos, end
        << val("\"")
        << std::endl
);

start = *(keyword[_a = _1] > lazy(*_a));

some_other_rule.name("other rule's name");
...

Теперь, когда some_other_rule вызывается с отложенным вызовом и завершается неудачей, в сообщении об ошибке говорится, что "lazy" ожидалось дословно, а не "other rule's name" (что мне нужно).Это должно работать так, и я просто ошибаюсь где-то еще, или есть какие-то другие специфические уловки?

1 Ответ

3 голосов
/ 28 января 2012

Хорошо, я разобрался с этим (опубликуйте это здесь для того, кто решит проблему):

some_other_rule и другие правила, указатели которых выбираются парсером keyword, должны начинаться с qi::eps > ....

Это потому, что lazy сам по себе является синтаксическим анализатором, и в случае сбоя вызванного синтаксического анализатора lazy откатывается, чтобы попробовать другие возможные ветви. И поскольку единственное ожидание - это то, что предшествует ему (... > lazy()), ошибка ожидания повышается против lazy. Поэтому мы добавляем еще одно ожидание ближе к фактической ошибке.

...