Perl 6最长的令牌匹配是否是非常规模式的一部分?

bri*_*foy 7 perl6

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

say 'aaaaaaaaa' ~~ m/
    | a+?
    | a+
    /; # ?a?
Run Code Online (Sandbox Code Playgroud)

我期望第二个替代品拥有最长的令牌,因为它有一个贪婪的量词.看起来非贪婪量词被计算为最长令牌的一部分,尽管概要5表明它不应被包括在内.

如果我颠倒顺序,我得到了我期望的输出:

say 'aaaaaaaaa' ~~ m/
    | a+
    | a+?
    /;  # ?aaaaaaaaa?
Run Code Online (Sandbox Code Playgroud)

这应该是这样发生的吗?引擎认为这些令牌的长度是多少?官方文档非常模糊,所以我借鉴了概要5来说明这是如何工作的.

Jon*_*ton 7

我在编译器中挖掘了一下,看看那里发生了什么.该+量词动作方法调用backmod这又原路返回属性设置为"F".

但是,为量词编译NFA代码根本不会查看回溯属性,因此无论其回溯模式如何,都会将每个量词视为相同.因此,它就好像?不在那里,这意味着它会考虑相同长度的两个分支.然后它使用声明顺序作为打破平局,导致它选择第一个分支.然后,一旦选择,就应用节俭量词,因此匹配单个"a".(这也解释了为什么交换订单会改变一些事情.)

这似乎与S05所设想的不符,那就是a+?应该简单地将其视为"命运"(在这种情况下意味着a+?替代方案将具有零长度最长的令牌).规范(即指定语言的测试套件)在此问题上保持沉默,但目前使其成为未定义的行为.

S05中的建议行为对我来说很有意义,因此我认为以这种方式指定和实现它.我已经打开这个问题来跟踪它.