Boost.Spirit,Nabialek技巧和错误处理

Boost.Spirit, Nabialek trick and error handling

本文关键字:错误 处理 Spirit Nabialek Boost      更新时间:2023-10-16

是否可以将"通用"错误处理(如教程中所述)与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"(我需要它)。它应该是这样工作的,而我只是在其他地方弄错了,还是还涉及其他一些特定的技巧?

好的,我已经解决了(在这里为遇到问题的人发布):

CCD_ 4和通过CCD_ 5解析器选择其指针的其他规则应当以CCD_。

这是因为lazy本身就是一个解析器,当调用的解析器失败时,lazy会回滚以尝试其他可能的分支。由于唯一的期望是它前面的一个(... > lazy()),因此针对lazy提出了期望失败。因此,我们所做的是添加另一个更接近实际误差的期望值。