如何在自定义语法 (Raku) 中重用语言标记
How to reuse a language token in a custom Grammar (Raku)
我想在我的自定义俚语中重用 Perl6::Grammar 中的 token parameter
来添加一个 "custom-param" 参数 而无需货物崇拜 。
我的意思是:
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
token parameter { # the new one
"custom-param" || < here the token stolen from $main-grammar.^find_method('parameter'); >
}
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
my $actions = $main-actions.^mixin(Nogil::NogilActions);
$*LANG.define_slang('MAIN', $grammar, $actions);
不太清楚:好像是在角色的token中调用parent token。我知道角色会覆盖它,所以我在 $grammar
.
中保留了原始对象的备份
已测试:
- 将其定义为返回父级 Match 对象的方法,但出现以下错误:
P6opaque: no such attribute '$!pos' on type NQPMatch in a Scalar when trying to get a value
- Return 来自正则表达式代码插值
Attempt to return outside of immediately-enclosing Routine (i.e. `return` execution is outside the dynamic scope of the Routine where `return` was used)
简介: 在与 nqp 多次类似的错误后,我想通了:
简介: nqp
+ Scalar
在错误消息中 -> 将 =
替换为 :=
说明:
使用绑定运算符 := and not assignment =,它在标量中自动装箱,因此使用标量显示错误消息。
演示: 一个完整的示例(在 BEGIN phaser 中使用)。尝试 "my" €
sigil 和 "their"(用语言编译)以防我的失败。
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
method sigil {
# Bind
my $sigil-they := $main-grammar.^find_method('sigil');
my $sigil-me := self.sigil-eu;
# Check My
return $sigil-me if $sigil-me;
# Return Their
return $sigil-they(self);
}
token sigil-eu { '€' }
}
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
$*LANG.define_slang('MAIN', $grammar, $main-actions);
注意 1: 我删除了一些 say
对演示必不可少的内容。只需将 .Str
添加到那些公开的对象 (NQPMatches)。
注2:如果要创建临时变量(如$res
),保持绑定(:=
)。
我想在我的自定义俚语中重用 Perl6::Grammar 中的 token parameter
来添加一个 "custom-param" 参数 而无需货物崇拜 。
我的意思是:
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
token parameter { # the new one
"custom-param" || < here the token stolen from $main-grammar.^find_method('parameter'); >
}
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
my $actions = $main-actions.^mixin(Nogil::NogilActions);
$*LANG.define_slang('MAIN', $grammar, $actions);
不太清楚:好像是在角色的token中调用parent token。我知道角色会覆盖它,所以我在 $grammar
.
已测试:
- 将其定义为返回父级 Match 对象的方法,但出现以下错误:
P6opaque: no such attribute '$!pos' on type NQPMatch in a Scalar when trying to get a value
- Return 来自正则表达式代码插值
Attempt to return outside of immediately-enclosing Routine (i.e. `return` execution is outside the dynamic scope of the Routine where `return` was used)
简介: 在与 nqp 多次类似的错误后,我想通了:
简介: nqp
+ Scalar
在错误消息中 -> 将 =
替换为 :=
说明: 使用绑定运算符 := and not assignment =,它在标量中自动装箱,因此使用标量显示错误消息。
演示: 一个完整的示例(在 BEGIN phaser 中使用)。尝试 "my" €
sigil 和 "their"(用语言编译)以防我的失败。
my $main-grammar = $*LANG.slang_grammar('MAIN');
my $main-actions = $*LANG.slang_actions('MAIN');
role Nogil::NogilGrammar {
method sigil {
# Bind
my $sigil-they := $main-grammar.^find_method('sigil');
my $sigil-me := self.sigil-eu;
# Check My
return $sigil-me if $sigil-me;
# Return Their
return $sigil-they(self);
}
token sigil-eu { '€' }
}
my $grammar = $main-grammar.^mixin(Nogil::NogilGrammar);
$*LANG.define_slang('MAIN', $grammar, $main-actions);
注意 1: 我删除了一些 say
对演示必不可少的内容。只需将 .Str
添加到那些公开的对象 (NQPMatches)。
注2:如果要创建临时变量(如$res
),保持绑定(:=
)。