短絡評価の実装
引き続き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] ] ) ;
他のルールも同じような感じで実装中ですが、意外と時間がかかっています。
ブランチ作っておけばよかったです。