是否有可能将“通用”错误处理(如教程中给出的)与Nabialek技巧结合起来?像这样:
...
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"
(我需要的)。它是否应该以这种方式工作,我只是在其他地方弄错了,或者还有其他一些具体的技巧?
答案 0 :(得分:3)
好的,我已经解决了(在这里发布给遇到问题的人):
some_other_rule
以及通过keyword
解析器选择指针的其他规则应以qi::eps > ...
开头。
这是因为lazy
本身就是一个解析器,当被调用的解析器失败时,lazy
会回滚以尝试其他可能的分支。由于唯一的期望是它之前的期望(... > lazy()
),因此对lazy
提出期望失败。所以,我们所做的是增加另一个更接近实际错误的期望。