gpt4 book ai didi

raku - Peel 6 最长 token 匹配的非贪婪模式是不是一部分?

转载 作者:行者123 更新时间:2023-12-04 11:47:18 30 4
gpt4 key购买 nike

我在 2018.04 玩这个最长的 token 匹配,但我认为最长的 token 不匹配:

say 'aaaaaaaaa' ~~ m/
| a+?
| a+
/; # 「a」

我希望第二个选择具有最长的标记,因为它有一个贪婪的量词。尽管 Synopsis 5 看起来非贪婪量词被算作最长标记的一部分表示不应包含它。

如果我颠倒顺序,我会得到我期望的输出:
say 'aaaaaaaaa' ~~ m/
| a+
| a+?
/; # 「aaaaaaaaa」

这应该是这样发生的吗?引擎认为这些 token 的长度是多少?官方文档相当模糊,所以我正在使用 Synopsis 5弄清楚这应该如何工作。

最佳答案

我在编译器中挖掘了一下,看看那里发生了什么。 +量词 Action 方法 calls backmod反过来 sets the backtrack property to "f" .

然而,code to compile an NFA for a quantifier根本不查看回溯属性,因此对每个量词都一视同仁,无论其回溯模式如何。因此它就像 ?不在那里,这意味着它将考虑等长的两个分支。然后它使用声明顺序作为决胜局,导致它选择第一个分支。一旦选定,然后应用节俭量词,因此匹配单个“a”。 (这也解释了为什么交换顺序会改变事情。)

这似乎与 S05 envisions 不符,这就是 a+?应该简单地被视为“命运”(在这种情况下意味着 a+? 替代品将具有零长度的最长标记)。规范(即指定语言的测试套件)对此事没有提及,但目前使其成为未定义的行为。

S05 中提议的行为对我来说很有意义,所以我主张以这种方式指定和实现它。我已开通 this issue跟踪它。

关于raku - Peel 6 最长 token 匹配的非贪婪模式是不是一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50879757/

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