2012-01-27 60 views
2

是否有可能以某种方式将“通用”错误处理(如本教程中给出的)与Nabialek技巧结合使用?就像这样:Boost.Spirit,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"(我需要)。是否应该这样工作,我只是在其他地方弄错了,或者还有其他一些特定的技巧?

回答

3

好啦,我已经工作了(张贴在这里的人谁打的问题):

some_other_rule和其他规则,其指针通过keyword解析器选择应以qi::eps > ...开始。

这是因为lazy本身就是一个解析器,当被调用的解析器失败时,lazy被回滚以尝试其他可能的分支。而且由于唯一的预期是前一个(... > lazy()),所以预期失败将提升到lazy。所以,我们所做的是增加另一个更接近实际误差的期望值。