如何使用Boost Spirit与20多种类型的变体



我正在用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;
}}

Boost Spirit无法识别添加了push_back的最后一个类型(eddic::ast::New)。当我解析包含此元素的东西时,它失败了,并出现以下错误:

eddic:/usr/include/boost/variation/detail/visition_impl.hpp:264:typename访问者::result_typeboost::detail::variant::visitation_impl(int,int,Visitor&,VoidPtrCV,mpl_::false_,NoBackupFlag,Which*,step0*)[使用Which=mpl_::int_<0>;步骤0=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\,boost::mpl::v_iter,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>、21l>>;访问者=boost::变体,boost:;mpl::vector,eddic::ast::递延,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::递延,eddic::ast::递延,eddic::ast::Deferred>,0>>,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variant::void_>::assigner;VoidPtrCV=常量void*;无备份标志=boost::变体,boost:;mpl::vector,eddic::ast::递延,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::递延,eddic::ast::递延,eddic::ast::Deferred>,0>>,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variation::void_,boost:;detail:,variation:,void_,boost::detail::variant::void_>::has_fallback_type_;类别名访问者::result_type=void;mpl_::false=mpl_::bool_]:断言`!"Boost.Variant内部错误:'which'超出范围。""失败。

如果我交换两个元素(例如三元和New),New会被正确识别,但不会被三元识别。这只是最后一个失败的元素。

我已经尝试过使用push_front或vector21,但它不会改变任何东西,它总是最后一个有问题的元素。在我看来,这是因为Spirit在将其复制到我的variant_over类型之前在内部使用了一个变体。

有解决这个问题的方法吗?

我可能会把这个数字减少到20,但问题是我将来肯定会有更多。

非常感谢您的任何想法

BOOST_MPL_LIMIT_VECTOR_SIZE定义为您想要的任何新限制,但达到这么高通常意味着设计问题,因此可能值得考虑一下。

最新更新