短絡評価の実装

引き続きbjamインタプリタの実装中です。
現在、if/whileの条件部分と変数の代入までは出来ていて、あとはルール呼び出しを実装できればそれなりに動くはずというところです。


bjamの「&&」と「||」は優先順位が同じで、短絡評価もされるので次のようになりました。

cond
    =   cond0[cond.val = arg1]
        >> *(   space
                >> "&&"
                >> space
                >>  if_p(cond.val)
                    [
                        // true && arg1 => arg1
                        cond0[cond.val = arg1]
                    ]
                    .else_p
                    [
                        // false && arg1 => false
                        // 短絡評価のためパースのみ行う
                        no_actions_d
                        [
                            self.use_parser<bjam_grammar::cond0>()
                        ]
                    ]
            |   space
                >> "||"
                >> space
                >>  if_p(cond.val)
                    [
                        // true || arg1 => true
                        // 短絡評価のためパースのみ行う
                        no_actions_d
                        [
                            self.use_parser<bjam_grammar::cond0>()
                        ]
                    ]
                    .else_p
                    [
                        // false || arg1 => arg1
                        cond0[cond.val = arg1]
                    ]
            )
    ;

他のルールも同じような感じで実装中ですが、意外と時間がかかっています。
ブランチ作っておけばよかったです。