我正在尝试执行以下操作来解析多个“ 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/