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"?)
我有一些简单的代码来解析一些消息,如下所示,
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"?)