为部分结果提升精神on_success处理程序

时间:2018-01-29 14:47:44

标签: boost-spirit

解析类似“a.b.c”和“a()。b”

的规则
postfix = 
     primary  [_val=_1] >> *(
                (lit('(') > paralistopt  > lit(')'))  [_val = construct<common_node>(type_cmd_fnc_call,key_this, construct<common_node>(_val), key_parameter, construct<std::vector<common_node> >(_1))]
              | (lit('.') > name_pure)                [_val = construct<common_node>(type_cmd_dot_call,key_this, construct<common_node>(_val), key_propname, construct<std::wstring>(_1))]
       )
    ;        

规则的注释代码(common_node是AST条目)

void annotateNode(parserDataS & data,const std::wstring::const_iterator & pos1, const std::wstring::const_iterator & pos2, common_node & node)
 {
   // calc pos
   int p1=std::distance(data.init_pos, pos1);
   int p2=std::distance(data.init_pos, pos2);
   // range is from  >=p1 <=p2
   node.makeLocation(std::make_pair(p1, p2-1));
 }

处理程序设置

  on_success(postfix, phoenix::bind(&annotateNode, phoenix::ref(parserData),_1, _3,_val))

到目前为止没问题,使用“a.b”在节点上调用注释。 但是当使用a.b.c.d时,只在每个成员的第一个节点“a”上调用“on_success”(b,c,d) 如何为每个成员编码“on_succcess”..“a.b”“(a.b).c”“(a.b.c).d”分开?

1 个答案:

答案 0 :(得分:1)

你最好只是修改语义动作来完成额外的工作,正如你明确想要的那样。否则,拆分子规则(看起来你已经拥有)并使on_success处理程序也运行。

如果您需要更多帮助,我建议发布一个自包含的示例。如果你制作一个,你也许可以建立我在boost::spirit access position iterator from semantic actions

中写的那个