我试图执行以下操作来解析一些"a",然后解析一个"a":
*(lit("a")) >> lit("a")
不幸的是,Kleene明星在boost::spirit::qi中*
急切地消耗了所有的"a",之后没有回溯,最后的lit(a)
无法匹配任何东西。
当然,使用(例如)grep
,以下内容将起作用:
$ echo "aaa" | grep "a*a"
aaa
在这里解决气行为的最佳方法是什么?我知道回溯会搞砸语义操作,所以让我们假设 qi 仅用于在 AST 中存储属性。
使用+
而不是 *
并不能解决我的问题;例如,假设我有一个解析器ignore_int_
解析整数但不产生任何属性,那么我可能想要使用:
*ignore_int_ >> int_
仅存储最后一个整数。
你只能提前否定断言:
*(graph - 'z') >> 'z'
在这里,graph
将匹配,除非遇到 z。如果您在输入/表达式结束时需要它,请考虑例如
*(graph - (graph >> eoi)) >> graph >> eoi
或
*(!(graph >> eoi) >> graph) >> graph >> eoi
简而言之,你需要一个积极的前瞻性来"断言"。隐式断言不会让你得到你所期望的回溯,因为Spirit是一个PEG解析器生成器,而不是一个正则表达式匹配器。