是否有可能以某种方式将“通用”错误处理(如教程中给出的那样)与 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"
(我需要)。它应该以这种方式工作,而我只是在其他地方弄错了,还是涉及其他一些特定的技巧?
最佳答案
好的,我已经解决了(将它张贴在这里以供遇到此问题的人使用):
some_other_rule
和其他通过 keyword
选择其指针的规则解析器应以 qi::eps > ...
开头.
那是因为lazy
是解析器本身,当调用的解析器失败时,lazy
回滚以尝试其他可能的分支。并且由于唯一的期望是它之前的期望( ... > lazy()
),因此针对 lazy
提出期望失败.因此,我们所做的是添加另一个更接近实际错误的期望。
关于c++ - Boost.Spirit、Nabialek 技巧和错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9032101/