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

问题描述 投票:7回答:2

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

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

我期望第二个替代品拥有最长的令牌,因为它有一个贪婪的量词。虽然Synopsis 5表明它不应被包括在内,但看起来非贪婪量词被算作最长令牌的一部分。

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

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

这应该是这样发生的吗?引擎认为这些令牌的长度是多少?官方文档非常模糊,所以我正在利用Synopsis 5来证明这是如何工作的。

perl6
2个回答
7
投票

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

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

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

S05中的建议行为对我来说很有意义,因此我认为以这种方式指定和实现它。我打开this issue跟踪它。


0
投票

我相信目前的行为是正确的。

只有NFA或DFA可以匹配的东西才能成为最长令牌匹配的一部分,而据我所知,节俭量词并不能转化为自动机形式(通过将所有角色都输入自动机,并且在读取完整字符串之前没有接受的概念)。

© www.soinside.com 2019 - 2024. All rights reserved.