c++ - Boost.Spirit、Nabialek 技巧和错误处理

标签 c++ error-handling boost-spirit boost-spirit-qi

是否有可能以某种方式将“通用”错误处理(如教程中给出的那样)与 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/

相关文章:

c++ - 未调用 boost spirit 语义 Action

c++ - boost::spirit 从语法中组合语法

c++ - 是否可以从字符串访问变量?

c++ - Boost.Geometry Correct() 失败

c++ - 不使用 push_back 的 std::vector bad_alloc

c - c : different approaches 中的库错误管理

java - 检查错误页面 webdriver java

r - tryCatch 和 ggplot

c++ - 使用 Boost Spirit X3 和 Fusion 解析具有单个成员的结构变体

c++ - boost::format() 输出运算符