Boost Spirit を使用して非常に複雑な文法を解析していますが、20 を超えるタイプ (ここでは 21) を持つバリアントの問題に直面しています。
namespace eddic { namespace ast {
typedef boost::mpl::vector<
Integer,
IntegerSuffix,
Float,
Litteral,
VariableValue,
DereferenceValue,
Expression,
Unary,
Null,
True,
False,
ArrayValue,
FunctionCall,
MemberFunctionCall,
Cast,
BuiltinOperator,
Assignment,
SuffixOperation,
PrefixOperation,
Ternary
> types_initial;
typedef boost::mpl::push_back<types_initial, New>::type types;
typedef boost::make_variant_over<types>::type Value;
}}
ブーストスピリットは、push_back で追加された最後のタイプ (eddic::ast::New) を認識しません。この要素を持つものを解析すると、次のエラーで失敗します。
エディック: /usr/include/boost/variant/detail/visitation_impl.hpp:264: typename Visitor::result_type boost::detail::variant::visitation_impl(int, int, Visitor&, VoidPtrCV, mpl_::false_, NoBackupFlag, which*, step0*) [With = mpl_::int_<0>; step0 = boost::detail::variant::visitation_impl_step、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl: :v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item 、boost::mpl::v_item、boost::mpl::v_item、0>、0>、0>、0>、0>、0>、0>、0>、0>、0>、0>、 0>、0>、0>、0>、0>、0>、0>、0>、0>、0>、0l>、ブースト::mpl::v_iter、ブースト::mpl::v_item、ブースト::mpl::v_item、boost::mpl::v_item、boost::mpl: :v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item 、boost::mpl::v_item、boost::mpl::v_item、boost::mpl::v_item、0>、0>、0>、0>、0>、0>、0>、0>、0 >、0>、0>、0>、0>、0>、0>、0>、0>、0>、0>、0>、0>、21l>>; ビジター = boost::variant、boost::mpl::vector、eddic::ast::Deferred、eddic::ast::Deferred、eddic::ast::Null、eddic::ast::True、eddic:: ast::False、eddic::ast::延期、eddic::ast::延期、eddic::ast::延期、eddic::ast::延期、eddic::ast::延期、eddic::ast: :Deferred, eddic::ast::Deferred, eddic::ast::Deferred, eddic::ast::Deferred >, 0> >, boost::detail::variant::void_, boost::detail::variant ::void_, boost::detail::variant::void_, boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail:: variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost ::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant ::void_, boost::detail::variant::void_, boost::detail::variant::void_>::assigner; VoidPtrCV = const void*; NoBackupFlag = boost::variant、boost::mpl::vector、eddic::ast::Deferred、eddic::ast::Deferred、eddic::ast::Null、eddic::ast::True、eddic:: ast::False、eddic::ast::延期、eddic::ast::延期、eddic::ast::延期、eddic::ast::延期、eddic::ast::延期、eddic::ast: :延期、eddic::ast::Deferred、eddic::ast::Deferred、eddic::ast::Deferred >、0> >、boost::detail::variant::void_、boost::detail::variant::void_ 、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail: :variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、 boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail:: variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_>::has_fallback_type_; typename Visitor::result_type = void; mpl_::false_ = mpl_::bool_]: アサーション `!"Boost.Variant 内部エラー: 'which'
2 つの要素 (Ternary と New など) を交換すると、New は正しく認識されますが、Ternary は認識されません。失敗するのは最後の要素だけです。
すでに push_front または vector21 を使用してみましたが、何も変わりません。問題があるのは常に最後の要素です。私の意見では、Spirit がバリアントを私の variant_over 型にコピーする前に内部的に使用しているという事実から来ています。
この問題の回避策はありますか?
おそらく20人まで減らすこともできますが、問題は、将来それ以上になることは間違いないということです.
アイデアをありがとう