【问题标题】:boost spirit on_success handler for partial results提升精神 on_success 处理程序以获得部分结果
【发布时间】: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


    【解决方案1】:

    按照您的明确意图,您最好只修改语义操作以完成额外的工作。否则,拆分子规则(看起来您已经拥有)并让 on_success 处理程序也为这些子规则运行。

    如果您需要更多帮助,我建议发布一个独立的示例。如果你制作有困难,也许你可以在我写的 boost::spirit access position iterator from semantic actions 的基础上构建一个

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    相关资源
    最近更新 更多