Boost.Spirit语法对象复用疑问:能否用同一规则解析连续名称?
问题
假设有一条用于解析名称的Boost.Spirit.Qi规则:
m_sName = qi::lexeme[ (ascii::alpha | qi::char_('_')) >> *(ascii::alnum | qi::char_('_')) ]
能否使用同一个m_sName对象连续解析两个名称?还是必须实例化m_sName1和m_sName2?比如编写如下代码是否可行:
m_sName >> m_sName
回答
完全可以直接使用同一个m_sName对象连续解析两个名称,不需要额外实例化多个对象。
Boost.Spirit.Qi中的规则对象本质上是解析逻辑的封装,本身是无状态的——每次调用它都会执行定义好的解析逻辑,不会因为之前用过就改变行为。你写的m_sName >> m_sName代码是合法的,它会按照规则依次解析两个符合要求的名称(第一个名称解析完成后,接着解析第二个符合规则的名称)。
只有当你需要不同的解析逻辑时,才需要定义多个不同的规则对象;如果是相同的解析规则重复使用,直接复用同一个对象即可。
内容的提问来源于stack exchange,提问作者Frank Puck
相关产品推荐
相关产品推荐

