解析类似“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”分开?
答案 0 :(得分:1)
你最好只是修改语义动作来完成额外的工作,正如你明确想要的那样。否则,拆分子规则(看起来你已经拥有)并使on_success
处理程序也运行。
如果您需要更多帮助,我建议发布一个自包含的示例。如果你制作一个,你也许可以建立我在boost::spirit access position iterator from semantic actions
中写的那个