不急的Kleene明星在提振精神气

时间:2014-12-07 16:32:54

标签: c++ parsing boost boost-spirit

我试图执行以下操作来解析一些" a",然后一个" a":

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

不幸的是,boost :: spirit :: qi中的Kleene明星*以一种急切的方式消耗所有" a" s,之后没有回溯,而最后一个{ {1}}无法匹配。

当然,使用(例如)lit(a),以下方法可行:

grep

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

使用$ echo "aaa" | grep "a*a" aaa 代替+无法解决我的问题;假设我有一个解析器*解析整数但没有产生属性,那么我可能想要使用:

ignore_int_

仅存储最后一个整数。

1 个答案:

答案 0 :(得分:1)

你只能提前消极地断言:

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

此处graph将匹配,除非遇到z。如果您在输入/表达式的末尾需要它,请考虑例如。

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

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

简而言之,您需要一个肯定的前瞻来“断言”。隐式断言不会让你得到预期的回溯,因为Spirit是一个PEG解析器生成器,而不是正则表达式匹配器。