我已经实现了组合 GLR 解析器。其中有:
char(·)
使用指定字符或字符范围的解析器。many(·)
从零到无限次重复指定解析器的组合器。
示例:"char('a').many()"
将匹配带有任意数量"a"
-s 的字符串。
但是many(·)
组合器是贪婪的,因此,例如char('{') >> char('{') >> char('a'..'z').many() >> char('}') >> char('}')
(">>"
解析器的顺序链接在哪里)将成功地消耗整个"{{foo}}some{{bar}}"
字符串。
我想实现many(·)
在前面的例子中使用的惰性版本,它只会消耗"{{foo}}"
。我怎样才能做到这一点?
编辑:
可能是我把你们都弄糊涂了。在我的程序中,解析器是一个函数(或 C++ 中的“函子”),它接受“步骤”并返回“步骤”的森林。“步骤”可能是 OK 类型(表示解析器已成功使用部分输入)和 FAIL 类型(表示解析器遇到错误)。有更多类型的步骤,但它们是辅助的。
Parser = f(Step) -> Collection of TreeNodes of Steps.
所以当我解析输入时,我:
编写简单的预定义 Parser 函数以获得表示所需语法的复杂 Parser 函数。
从输入形成初始步骤。
将初始 Step 赋予复杂的 Parser 函数。
使用 Steps 过滤 TreeNodes,只留下 OK 的(或者如果输入有错误,则使用最少的 FAIL-s)。
从剩下的 Steps 中收集信息。