【问题标题】:Boost.Spirit, Nabialek trick and error handlingBoost.Spirit、Nabialek 技巧和错误处理
【发布时间】:2012-01-27 10:44:26
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    some_other_rule 和其他通过keyword 解析器选择指针的规则应以qi::eps &gt; ... 开头。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2016-09-02
      • 2015-05-05
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多