【发布时间】:2018-01-29 14:47:43
【问题描述】:
解析“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 时,“on_success”只在每个成员(b,c,d)的第一个节点“a”上调用 如何为每个成员编写“on_success” .. “a.b” “(a.b).c” “(a.b.c).d” 分开?
【问题讨论】:
标签: boost-spirit