bjam_win その15 Grammarの戻り値

bjam_grammarのブロック、if、forを実装しました。
bjam_grammar.hppの差分
変数とルールのスコープがおかしかったバグとルール呼び出しの結果が常に空になるバグも修正しています。


今日ハマったのはSpiritのGrammarの戻り値に関してです。

struct bjam_grammar
    : boost::spirit::grammar<bjam_grammar,vars_closure::context_t>
{
    template<class ScannerT>
    struct definition
        : boost::spirit::grammar_def<
              boost::spirit::rule<ScannerT>
            , boost::spirit::rule<ScannerT, typename vars_closure::context_t>
            , boost::spirit::rule<ScannerT, typename invoke_closure::context_t>
            , boost::spirit::rule<ScannerT, typename cond0_closure::context_t>
            , boost::spirit::rule<ScannerT, typename if_closure::context_t>
        >
    {
        definition(const bjam_grammar& self)
        {

bjam_grammarは複数のスタートルールを持っていて、各スタートルールのクロージャは別の型になっています。
しかし、bjam_grammarのクロージャはvars_closureなので、戻り値はこの値です。
上の例ではselfを通して戻り値を設定することになります。
スタートルールのクロージャが戻り値に使われると勘違いして、かなり悩みました。