これらの他の質問の多くと同様に、Boost.Spirit.Qiを使用して、単純な文法を構造体のツリーに解析しようとしています。
私がやろうとしていることを可能な限り単純なケースに蒸留しようと思います。私は持っています:
struct Integer {
int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))
後で、文法構造体の中に、次のメンバー変数があります。
qi::rule<Iterator, Integer> integer;
私が定義している
integer = qi::int_;
しかし、実際に整数を解析しようとすると、
qi::phrase_parse(iter, end, g, space, myInteger);
myInteger.value
解析が成功すると、常に初期化されません。同様に、私は次の定義を試しました(明らかにコンパイルされないものは間違っています):
integer = qi::int_[qi::_val = qi::_1]; //compiles, uninitialized value
integer = qi::int_[qi::_r1 = qi::_1]; //doesn't compile
integer = qi::int_[phoenix::bind(&Integer::value, qi::_val) = qi::_1]; //doesn't
integer = qi::int_[phoenix::at_c<0>(qi::_val) = qi::_1]; //doesn't
明らかに、私はスピリット、フェニックス、または他の何かについて何かを誤解しています。私の理解では、これがここでqi::_1
の最初の属性でありqi::int_
、角括弧内の部分が関数オブジェクトとして実行されるときに、解析された整数を表す必要があります。integer
次に、関数オブジェクトが囲んでいる属性を受け取りqi::_val
、解析された整数をそれに割り当てようとすると仮定しています。私の推測では、私のBOOST_FUSION_ADAPT_STRUCT
呼び出しのおかげで、この2つは互換性があり、静的分析の観点からは確かにそうであるように見えますが、データは保存されていません。
どこかに欠けている参照(&)指定はありますか?