gpt4 book ai didi

grammar - 足够了 "Always succeed"吗? [乐]

转载 作者:行者123 更新时间:2023-12-02 17:04:20 26 4
gpt4 key购买 nike

在语法文档中的以下部分:

"Always succeed" assertion

我重现了那里提供的示例,并添加了代码来显示解析机制的每个阶段生成的表:

use v6.d;

grammar Digifier {
rule TOP { [ <.succ> <digit>+ ]+ }
token succ { <?> }
token digit { <[0..9]> }
}

class Letters {
has @!numbers;

method digit ($/) { @!numbers.tail ~= <a b c d e f g h i j>[$/]; say '---> ' ~ @!numbers }
method succ ($/) { @!numbers.push: '!'; say @!numbers }
method TOP ($/) { make @!numbers[^(*-1)] }
}

say 'FINAL ====> ' ~ Digifier.parse('123 456 789', actions => Letters.new).made;

结果如下:

[!]
---> !b
---> !bc
---> !bcd
[!bcd !]
---> !bcd !e
---> !bcd !ef
---> !bcd !efg
[!bcd !efg !]
---> !bcd !efg !h
---> !bcd !efg !hi
---> !bcd !efg !hij
[!bcd !efg !hij !]

FINAL ====> !bcd !efg !hij

我预计表 @!n​​umbers 中只会有 3 次推送,但我得到了 4 次。我对方法“TOP”中是否需要排除表 @!n​​umbers 的最后一个值感到困惑。

是的,我知道代码会产生正确的结果,但为什么呢?

最后一个“永远成功”的断言来自哪里?

最佳答案

量化组,例如[ A B ]+ ,实际上是一个循环,反复尝试匹配 A ,并且 iff 匹配,尝试匹配 B .

除非它是一个无限循环——在这种情况下你的程序会挂起——它最终会匹配N次然后继续。如果A 总是匹配,但是你的程序没有挂起,那么这一定意味着B最终失败了。如果是这样,A保证比 B 多匹配一次.

在您的代码中,A<.succ>减少到 <?> ,始终匹配。有 4 次尝试,因此 A匹配 4 次。相比之下B ,即<digit>+ ,第四次尝试失败,因此仅匹配 3 次。

关于grammar - 足够了 "Always succeed"吗? [乐],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60530396/

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