Bap*_*cht 2 c++ boost-spirit boost-mpl
我正在使用 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;
}}
Run Code Online (Sandbox Code Playgroud)
Boost Spirit 无法识别使用push_back 添加的最后一个类型(eddic::ast::New)。当我解析具有此元素的内容时,它会失败并出现以下错误:
eddic: /usr/include/boost/variant/detail/visitation_impl.hpp:264: 类型名称 Visitor::result_type boost::detail::variant::visitation_impl(int, int, Visitor&, VoidPtrCV, mpl_::false_, NoBackupFlag, Which*, step0*) [with 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>, 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: :延迟、 eddic::ast:: 延迟、 eddic::ast:: 延迟、 eddic::ast:: 延迟 >、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::细节::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_、boost::detail::variant::void_>::分配器;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:: 延迟、 eddic::ast:: 延迟、 eddic::ast:: 延迟 >、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:: 变体::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_;类型名访客::result_type = void; mpl_::false_ = mpl_::bool_]: 断言 `!"Boost.Variant 内部错误:'which' 超出范围。"' 失败。
如果我交换两个元素(例如三元和新),新会被正确识别,但三元不会。只有最后一个元素失败了。
我已经尝试过使用push_front或vector21,但它不会改变任何东西,它总是最后一个有问题的元素。在我看来,这是因为 Spirit 在将其复制到我的variant_over 类型之前在内部使用了一个变体。
这个问题有解决方法吗?
我或许可以把这个数字减少到20个,但问题是我将来肯定会更多。
非常感谢您的任何想法
| 归档时间: |
|
| 查看次数: |
891 次 |
| 最近记录: |