从语法导出正则表达式

时间:2018-10-08 06:06:59

标签: grammar perl6

Grammars是类,因此,它们应遵循与其他类相同的规则。但是,从语法导出正则表达式似乎存在问题:

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」

那么那个参数实际上是什么?我们如何有效地使用从Grammar

导出的正则表达式/令牌/规则

1 个答案:

答案 0 :(得分:7)

lettersmy之前的our正则表达式声明中。

默认情况下,声明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

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