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

标签 parsing dart

我正在阅读 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/

相关文章:

parsing - 使用模板的 ConvertFrom-String 未按预期解析

algorithm - 解决 LL(1) 中的 PREDICT/PREDICT 冲突

python - 解析 CSV 以绘制股票行情数据图表

dart - Flutter - 键入文本动画

dart - 使用 Dart 从主目录中的 URL 读取数据内容

ios - Objective-C 类(最佳实践)

c# - 使用自定义格式字符串将字符串解析为 int/long

dart - 无法通过 flutter app 打开浏览器 URL

flutter - 是否有可能实现一个代表用户在 Flutter/Dart 中的通知数量的图标?

postgresql - Flutter + Dart App与Postgres数据库的连接与查询