我试图执行以下操作来解析一些" 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_
仅存储最后一个整数。
答案 0 :(得分:1)
你只能提前消极地断言:
*(graph - 'z') >> 'z'
此处graph
将匹配,除非遇到z。如果您在输入/表达式的末尾需要它,请考虑例如。
*(graph - (graph >> eoi)) >> graph >> eoi
或
*(!(graph >> eoi) >> graph) >> graph >> eoi
简而言之,您需要一个肯定的前瞻来“断言”。隐式断言不会让你得到预期的回溯,因为Spirit是一个PEG解析器生成器,而不是正则表达式匹配器。