如何在自定义语法 (Raku) 中重用语言标记

tin*_*ino 6 raku nqp

我想在我的自定义俚语中重用token parameterfrom Perl6::Grammar来添加一个“custom-param”参数,而无需 cargo culting

我的意思是:

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);
Run Code Online (Sandbox Code Playgroud)

不确定是否清楚:这就像在角色的令牌中调用父令牌一样。我知道这个角色会覆盖它,所以我在$grammar.

已经测试:

  1. 将其定义为返回父对象的 Match 对象的方法,但出现以下错误:
P6opaque: no such attribute '$!pos' on type NQPMatch in a Scalar when trying to get a value 
Run Code Online (Sandbox Code Playgroud)
  1. 从正则表达式代码插值返回
Attempt to return outside of immediately-enclosing Routine (i.e. `return` execution is outside the dynamic scope of the Routine where `return` was used)
Run Code Online (Sandbox Code Playgroud)

tin*_*ino 5

介绍:在多次使用 nqp 出现类似错误后,我发现:

简介: nqp +Scalar在错误消息中 -> 替换=:=

解释:在标量中 使用绑定运算符:=而不是赋值= which autobox 因此标量的错误消息。

演示:一个完整的示例(在 BEGIN phaser 中使用)。尝试“我的”印记和“他们的”(用语言编译),以防我的失败。

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);
Run Code Online (Sandbox Code Playgroud)

注1:我删除say了演示的一些必需品。只需添加.Str到那些公开的对象(NQPMatches)。

注2:如果要创建临时变量(如$res),请保持绑定(:=)。