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

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


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

当然,使用(例如)grep,将可以进行以下操作:

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


解决此处的气的最佳方法是什么?我知道回溯会弄乱语义动作,因此让我们假设qi仅用于在AST中存储属性。

使用+代替*不能解决我的问题。例如,假设我有一个解析器ignore_int_,它解析整数但不产生任何属性,那么我可能要使用:

*ignore_int_ >> int_

仅存储最后一个整数。

最佳答案

您只能提前否定断言:

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


除了遇到z以外,此处graph将会匹配。如果您在输入/表达式末尾需要此功能,请考虑例如

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


要么

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


简而言之,您需要积极的前瞻才能“断言”。隐式断言不会使您回溯到预期的状态,因为Spirit是PEG解析器生成器,而不是正则表达式匹配器。

关于c++ - 非渴望的Kleene明星在 boost spirit qi ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27344880/

10-13 08:34