从语法中导出正则表达式

8

语法规则是类,因此它们应当受到与其他类相同的规则约束。然而,从语法规则中导出正则表达式时似乎存在问题:

grammar Word {
    token TOP { ^ <letters> $}
    regex letters   is export { <[\w] - [_]>+ };
    sub exported () is export  { return 'exported' };
}

import Word;

say exported;
say "what_ever" ~~ &letters;

import 有效地导入了 exported,并且不会对 letters 抱怨。然而,最后一行存在一个错误:

Type check failed in binding to parameter '<anon>'; expected Word but got Match (Match.new(orig => "what_ev...)

如果将&letters更改为/<letters>/,这是调用正则表达式的另一种方式,将会发生相同的错误。该错误似乎指出在语法中声明letters时存在一些隐藏参数,因为以下代码可行:
module Regexes {
    my regex letters   is export { <[\w] - [_]>+ };
}
import Regexes;
say "what_ever" ~~ /<letters>/;
# Output: 
# 「what」
#  letters => 「what」

那么有效的参数是什么?我们如何有效地使用从语法中导出的正则表达式/标记/规则?

1个回答

7

letters 正则表达式声明之前加上 myour

默认情况下,一个 methodregextokenrule 声明符号在其前面会自动声明一个 has 声明符号。


我仍然在思考这里发生了什么,但想根据您的第一条评论更新我的答案。

Type check failed in binding to parameter '';
expected Word but got Match (Match.new(orig => "what_ev...)

parameter ''这个参数有点糟糕。

奇怪的是,使用my methodour method声明的例程的签名具有其封闭类或语法作为其类型的特点,在主线中声明时假定为Mu,而对于regextokenrule,调用者始终为Mu

grammar g {
          method method              { ... }  # (g $: *%_)
      has method has-method          { ... }  # (g $: *%_)
      my  method my-method is export { ... }  # (g $: *%_)

          regex  regex               { ... }  # (g $: *%_)
      has regex  has-regex           { ... }  # (g $: *%_)
      my  regex  my-regex is export  { ... }  # (Mu $: *%_)

          sub    sub is export       { ... }  # ()
#     has sub    has-sub is export   { ... }  # Cannot use 'has' with sub declaration
      my  sub    my-sub is export    { ... }  # ()
}

import g;

say .signature
  for g.^lookup('method'),
      g.^lookup('has-method'),
      &my-method,
      g.^lookup('regex'),
      g.^lookup('has-regex'),
      &my-regex,
      &sub,
      &my-sub

在语法中,显示每个例程声明的签名。我已将输出作为每个例程末尾的注释添加。


我想这就是 subs 和 regexes 之间的差别了,涉及到默认范围和定义。我认为那并没有被记录下来... - jjmerelo
1
作用域方面的文档在 has 中有记录。(对于该方面,正则表达式与方法相同。) 我不记得看到签名变化被记录过。它可能与正则表达式/令牌/规则是方法但又不同的方式有关。我已经更新了我的回答,但我仍在思考它,以后可能会返回更新它。 - raiph
我会说正则表达式|令牌|规则实际上是方法,而不是子程序。这是针对我还是其他人?如果是针对我,您是在建议我编辑我的答案吗?我当然没有意思暗示其他。在这次交流中,我有些懒得写评论。我试图与您联系,并假设您知道正则表达式实际上是方法。如果我要编辑我的答案,也许可以这样说,正则表达式是方法,但regex不是method(就像语法是类,但grammar不是class)。但是,这过于淡化了它们之间的差异,我认为。 - raiph
这是关于编程的内容,请你将其翻译成中文。请仅返回翻译后的文本:对你来说,当然可以按照自己的方式进行回答,无论如何,你的回答都很棒。事实上,正则表达式|规则|标记只有在具有词法作用域时才是子程序,否则它们就是方法。 - jjmerelo
1
@jjmerelo 谢谢。"regexes|rules|tokens are methods unless they have a lexical scoper, in which case they are subs." 我完全理解你的观点,但它们在签名中仍然有一个调用者,并且仍将被类型检查为方法,而不是子例程。我会考虑一下,明天可能会编辑我的答案。 - raiph
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接