不急于提升灵气的克莱恩星

Non eager Kleene star in boost spirit qi

本文关键字:克莱恩 不急于      更新时间:2023-10-16

我试图执行以下操作来解析一些"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解析器生成器,而不是一个正则表达式匹配器。