我正在用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
定义为您想要的任何新限制,但达到这么高通常意味着设计问题,因此可能值得考虑一下。