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
答案 0 :(得分:7)
在letters
或my
之前的our
正则表达式声明中。
默认情况下,声明method
,regex
,token
或rule
声明符,并在其前面隐含has
声明符。
我仍在思考这里还发生了什么,但想根据您的第一条评论更新我的答案。
Type check failed in binding to parameter ''; expected Word but got Match (Match.new(orig => "what_ev...)
parameter ''
绝对不及真棒。
奇怪的是,以my method
或our method
声明的例程的签名以其封闭类或语法为类型,并假设Mu
在主线中声明,而对于regex
,token
或rule
而言,主诉人始终为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
显示语法中每个例程声明的签名。我在每个例程的末尾将输出添加为注释。