使用正则表达式,令牌或规则,可以像这样定义变量;
token directive {
:my $foo = "in command";
<command> <subject> <value>?
}
语言文档here中没有任何内容,S05 - Regexes and Rules中的内容很少,引用;
任何语法正则表达式实际上只是一种方法,您可以使用冒号后跟任何由Perl 6语法解析的范围声明符来声明变量,包括my,my,state和constant 。 (作为准声明者,temp和let也被识别。)单个语句(通过终止分号或行结束右括号)被解析为普通的Perl 6代码:
token prove-nondeterministic-parsing {
:my $threshold = rand;
'maybe' \s+ <it($threshold)>
}
我认为语法中的regexen与类中的方法非常相似;我知道你可以在一个规则内的任何地方启动一个块,如果解析成功到达那个点,那么块将被执行 - 但我不明白这个东西到底是什么。
有人可以清楚地定义它的范围;解释它需要满足什么,并给出典型的用例?
答案 0 :(得分:7)
:my $foo;
的范围是什么? :my $foo ...;
具有显示的规则/令牌/正则表达式的lexical scope。
(并且:my $*foo ...;
- 请注意表示动态变量的额外*
- 包含其出现的规则/令牌/正则表达式的词法和dynamic scope。)< / p>
以下没有这个结构会发生什么:
regex scope-too-small { # Opening `{` opens a regex lexical scope.
{ my $foo = / bar / } # Block with its own inner lexical scope.
$foo # ERROR: Variable '$foo' is not declared
}
grammar scope-too-large { # Opening `{` opens lexical scope for gramamr.
my $foo = / bar / ;
regex r1 { ... } # `$foo` is recognized inside `r1`...
...
regex r999 { ... } # ...but also inside r999
}
因此: ... ;
语法用于获得所需的范围 - 既不太宽也不太窄。
此功能通常用于大型或复杂的语法中,以避免松散的范围(会产生错误)。
有关精确 lexical only scoping 的合适示例,请参阅token babble
as defined in a current snapshot of Rakudo's Grammar.nqp source code中@extra_tweaks
的声明和使用。
P6支持action objects。这些类的方法与语法中的规则一一对应。只要规则匹配,它就会调用相应的操作方法。 Dynamic variables提供了正确的范围,用于声明作用于块的变量(方法,规则等),它们在词汇和动态中都被声明 - 后者意味着它们可用于相应的行动方法也是如此。有关此示例,请参阅the declaration of @*nibbles
in Rakudo's Grammar module和its use in Rakudo's Actions module。