Boost spirit语法问题

Boost spirit grammar issue

我有一些简单的代码来解析一些消息,如下所示,

if (msgtype == BATSAddOrderMsg::longMsgCode)
    m_wire_msg = ( p_ts >> qi::char_(BATSAddOrderMsg::longMsgCode)
                        >> p_orderId
                        >> qi::char_(BATSAddOrderMsg::sideFlag)
                        >> p_shares
                        >> qi::as_string[qi::repeat(6)[qi::char_]]
                        >> m_price
                        >> qi::char_(BATSAddOrderMsg::displayFlag)
                        >> qi::as_string[qi::repeat(4)[qi::char_]] )
                        [qi::_val = phi::construct<BATSAddOrderMsg>(
                                qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, qi::_9)];
else if (msgtype == BATSAddOrderMsg::shortMsgCode)
    m_wire_msg = ( p_ts >> qi::char_(BATSAddOrderMsg::shortMsgCode)
                        >> p_orderId
                        >> qi::char_(BATSAddOrderMsg::sideFlag)
                        >> p_shares
                        >> qi::as_string[qi::repeat(6)[qi::char_]]
                        >> m_price
                        >> qi::char_(BATSAddOrderMsg::displayFlag) )
                        [qi::_val = phi::construct<BATSAddOrderMsg>(
                                qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, "")];

上面的长消息类型只是短消息类型多了一个字段qi::as_string[qi::repeat(4)[qi::char_]]

当我尝试重构到下面时,

auto shared = p_ts >> qi::char_(BATSAddOrderMsg::longMsgCode)
                   >> p_orderId
                   >> qi::char_(BATSAddOrderMsg::sideFlag)
                   >> p_shares
                   >> qi::as_string[qi::repeat(6)[qi::char_]]
                   >> m_price
                   >> qi::char_(BATSAddOrderMsg::displayFlag);
if (msgtype == BATSAddOrderMsg::longMsgCode)
   m_wire_msg = shared >> qi::as_string[qi::repeat(4)[qi::char_]] )
                       [qi::_val = phi::construct<BATSAddOrderMsg>(
                              qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, qi::_9)];

else if (msgtype == BATSAddOrderMsg::shortMsgCode)
    m_wire_msg = shared[qi::_val = phi::construct<BATSAddOrderMsg>(                                
    qi::_1, qi::_2, qi::_3, qi::_4, qi::_5, qi::_6, qi::_7, qi::_8, "")];

代码可以编译,但是当我 运行 我的单元测试时,它会因 运行 时间异常而死。

有人知道为什么 Boost Spirit 会出现这种行为吗?

您无法将 auto 安全地用于 Spirit Parser Expressions。参见例如boost spirit V2 qi bug associated with optimization level

不过,它看起来也像

  • 您的 "short" 版本只有一个默认值 "",请参阅
  • 你或许可以避免语义操作(Boost Spirit: "Semantic actions are evil"?)