代码之家  ›  专栏  ›  技术社区  ›  brian d foy

非锐利模式是Perl6最长令牌匹配的一部分吗?

  •  7
  • brian d foy  · 技术社区  · 8 年前

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

    say 'aaaaaaaaa' ~~ m/
        | a+?
        | a+
        /; # ï½¢aï½£
    

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

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

    say 'aaaaaaaaa' ~~ m/
        | a+
        | a+?
        /;  # ï½¢aaaaaaaaaï½£
    

    这应该是这样发生的吗?引擎认为这些令牌的长度是多少?官方文件很含糊,所以我要借鉴 简介5 想知道这是怎么回事。

    2 回复  |  直到 8 年前
        1
  •  7
  •   Jonathan Worthington    8 年前

    我去查了一下编译器,看看那里发生了什么事。这个 + 量词动作法 calls backmod 反过来 sets the backtrack property to "f" .

    然而, code to compile an NFA for a quantifier 根本不查看backtrack属性,因此无论其backtrack模式如何,都对每个量词进行相同的处理。因此它的作用就好像 ? 如果不存在,这意味着它将考虑长度相等的两个分支。然后,它使用申报单作为平手,导致它选择第一个分支。然后在选择后应用节俭量词,从而匹配单个“a”。(这也解释了交换顺序改变事物的原因。)

    这和 S05 envisions ,也就是说 a+? 应该被简单地认为是“命运”(在本例中指 A+? 替代方案将有一个长度为零的最长令牌)。然而,规范(即指定语言的测试套件)在这一问题上是沉默的,这使得它目前的行为是未定义的。

    在s05中提出的行为对我来说是有意义的,所以我主张用这种方式来指定和实现它。我已经打开 this issue 追踪它。

        2
  •  0
  •   moritz    8 年前

    我相信现在的行为是正确的。

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

    推荐文章