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を通して戻り値を設定することになります。
スタートルールのクロージャが戻り値に使われると勘違いして、かなり悩みました。