【问题标题】:Non eager Kleene star in boost spirit qi不急克林星在提升灵气
【发布时间】:2014-12-07 16:32:54
【问题描述】:

我试图执行以下操作来解析多个“a”,然后解析一个“a”:

*(lit("a")) >> lit("a")

不幸的是,boost::spirit::qi 中的 Kleene 星 * 以一种急切的方式消耗了所有的“a”,之后没有回溯,最后一个 lit(a) 无法匹配任何内容。

当然,使用(例如)grep,以下内容会起作用:

$ echo "aaa" | grep "a*a"
aaa

在这里解决 qi 行为的最佳方法是什么?我知道回溯会弄乱语义动作,所以我们假设 qi 仅用于在 AST 中存储属性。

使用+ 代替* 不能解决我的问题;假设我有一个解析器 ignore_int_ 解析整数但不产生属性,那么我可能想使用:

*ignore_int_ >> int_

只存储最后一个整数。

【问题讨论】:

    标签: c++ parsing boost boost-spirit


    【解决方案1】:

    你只能提前否定断言:

     *(graph - 'z') >> 'z'
    

    这里graph 会匹配,除非遇到z。如果您在输入/表达式的末尾需要这个,请考虑例如

     *(graph - (graph >> eoi)) >> graph >> eoi
    

     *(!(graph >> eoi) >> graph) >> graph >> eoi
    

    简而言之,您需要积极 提前“反对”。隐式断言不会让您获得预期的回溯,因为 Spirit 是 PEG 解析器生成器,而不是正则表达式匹配器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多