2

「一般的な」エラー処理(チュートリアルで説明されているような)と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"(私が必要としている)ものではないことを示しています。それはそのように機能するはずであり、私は単にどこかで間違っていますか、それとも他の特定のトリックが関係していますか?

4

1 に答える 1

2

さて、私はそれを解決しました(問題にぶつかった人のためにここに投稿してください):

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

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

于 2012-01-28T02:30:55.783 に答える