gpt4 book ai didi

regex - Perl 6/Raku 中捕获和非捕获正则表达式范围的差异

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

尽管文档声明将 token /规则/正则表达式称为 <.foo>而不是 <foo>使它们无法捕获,似乎范围有所不同,但我不确定是否有意。

这是一个简化的测试。在模块文件中:

unit module Foo;
my token y {  y }
my token a is export { x <y> }
my token b is export { x <.y> }

在另一个脚本文件中:
grammar A {
use Foo;
token TOP { <a> }
}

grammar B {
use Foo;
token TOP { <b> }
}

如果我们调用 A.parse("xy")一切都按预期运行。但是,调用 B.parse("xy")导致错误 No such method 'y' for invocant of type 'B' .这是预期的行为还是潜在的错误?

最佳答案

S05 的意图
意向照the relevant speculation/design doc包括:

<foo ...>

This form always gives preference to a lexically scoped regex declaration, dispatching directly to it as if it were a function. If there is no such lexical regex (or lexical method) in scope, the call is dispatched to the current grammar, assuming there is one.

...

A leading . explicitly calls a method as a subrule; the fact that the initial character is not alphanumeric also causes the named assertion to not capture what it matches.

...

A call to <foo> will fail if there is neither any lexically scoped routine of that name it can call, nor any method of that name that be reached via method dispatch. (The decision of which dispatcher to use is made at compile time, not at run time; the method call is not a fallback mechanism.)


表格示例
  • <bar>如上所述。它优先解析为名为 my 的早期绑定(bind)词法 ( our/&bar ) 例程/规则.否则,它会解析为调用名为 has 的 has (bar) 方法/规则的后期绑定(bind)尝试。 .如果成功,它将匹配存储在名为 bar 的捕获下。 .
  • <.bar>调用名为 has 的具有 (bar) 方法/规则如果它找到一个。它不捕获。
  • <bar=.bar>调用名为 has 的具有 (bar) 方法/规则如果它找到一个。如果成功,它将匹配存储在名为 bar 的捕获下。 .换句话说,它与 <bar> 相同。除了它只尝试调用一个名为 .bar 的 has 方法;它不会首先尝试解析为词汇 &bar .
  • <&bar><.&bar>意思相同。他们调用一个名为 &bar 的词法例程。并且不捕获。要执行相同的操作,但要捕获,请使用 <bar=&bar><bar=.&bar> .

  • (如果您阅读上面链接的推测/设计文档并尝试一下,您会发现文档提到的大多数设计细节已经在 Rakudo 中实现,即使它们没有得到官方支持/烘焙/记录。)
    范围示例
    首先是常见情况:
    grammar c {
    has rule TOP { <bar> }
    has rule bar { . { say 'has rule' } }
    }
    say c.parse: 'a';
    显示:
    has rule
    「a」
    bar => 「a」
    ( has 声明符是可选的,将它们排除在外是惯用的。)
    现在引入一个词法范围到语法 block 的规则:
    grammar c {
    my rule bar { . { say 'inner my rule' } }
    has rule TOP { <bar> }
    has rule bar { . { say 'has rule' } }
    }
    say c.parse: 'a';
    显示:
    inner my rule
    「a」
    bar => 「a」
    即使是在语法 block 之外声明的词法规则也优先于 has 规则:
    my rule bar { . { say 'outer my rule' } }
    grammar c {
    has rule TOP { <bar> }
    has rule bar { . { say 'has rule' } }
    }
    say c.parse: 'a';
    显示:
    outer my rule
    「a」
    bar => 「a」

    关于regex - Perl 6/Raku 中捕获和非捕获正则表达式范围的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58158010/

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