2012-01-27 52 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。所以,我們所做的是增加另一個更接近實際誤差的期望值。