2012-01-27 3 views
2

「一般的な」エラー処理(チュートリアルで与えられているような)とNabialekのトリックをどういう形で組み合わせることはできますか?このように:some_other_ruleは怠け者-と呼ばれ、失敗した場合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"); 
... 

、エラーメッセージが(私が必要とする)"lazy"が逐語的に期待されていたと言い、そしてない"other rule's name"。それはそのように動作するはずですが、私は単に他の場所と間違えられているのでしょうか?

some_other_ruleをし、そのポインタをkeywordパーサを介して、選択されている他のルールはqi::eps > ...で始める必要があります。

答えて

3

さて、私は(問題を打つ誰かのためにそれをここに投稿する)それを働いてきました。

lazyはパーサーそのものであり、呼び出されたパーサーが失敗するとlazyがロールバックされて他の可能な分岐が試されるためです。唯一の期待は前のもの(... > lazy())なので、期待失敗はlazyに対して発生します。したがって、実際のエラーに近い別の期待値を追加することです。