gpt4 book ai didi

parsing - 如何理解 ParserResult 的 "isCommitted"属性?

转载 作者:行者123 更新时间:2023-12-03 03:47:00 26 4
gpt4 key购买 nike

我正在阅读 polux 伟大的来源 parsers ,发现有一个特殊的isCommitted我无法理解的属性(property):

class ParseResult<A> {
final bool isSuccess;
final bool isCommitted;
/// [:null:] if [:!isSuccess:]
final A value;
final String text;
final Position position;
final Expectations expectations;
// ...
}

可以看到已经有一个 isSuccess表示解析结果是否成功,为什么需要 isCommitted ?我试图阅读相关代码,但仍然不明白。

想看源码可以找 here .

最佳答案

简短的回答是:不用担心 isCommited , 仅供内部使用。

长答案是:您可以调用commited在 paser 上,这意味着一旦成功,您肯定知道回溯是没有意义的(非常像 Prolog 的剪辑)。例如考虑这样的语法:

expr() => str('(') + rec(expr) str(')') ^ ...
| num()

假设我们解析字符串 "(..." .一旦我们识别出括号,我们肯定知道如果 ...原来 不是 要成为一个 expr,没有必要倒退到字符串的开头并尝试解析一个 num,因为 num 无论如何都不会以括号开头。我们可以提前失败。这是通过标记 ( 来完成的。作为“提交点”:
expr() => str('(').commited + rec(expr) str(')') ^ ...
| num()

这是一个应该非常小心使用的优化,因为它破坏了解析器相对于 | 的模块化。 .到目前为止,我个人从未使用过它。

无论何时调用 commited在解析器上,它返回一个新的解析器,其 isCommited属性为真。然后被 | 使用来决定是否回溯。这就是 isCommited是用来。作为最终用户,您永远不必关心。我可能应该将其设为私有(private)。

此功能的灵感来自 Polyparse's commit .

关于parsing - 如何理解 ParserResult 的 "isCommitted"属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432617/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com