2

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人まで減らすこともできますが、問題は、将来それ以上になることは間違いないということです.

アイデアをありがとう

4

1 に答える 1

5

必要な新しい制限を定義BOOST_MPL_LIMIT_VECTOR_SIZEしますが、これを高くすることは通常、設計上の問題のヒントになるため、検討する価値があるかもしれません。

于 2012-07-24T12:30:41.677 に答える