gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:23:08 27 4
gpt4 key购买 nike

我想重用 token parameter来自 Perl6::Grammar在我的自定义俚语中添加“自定义参数”参数不带 cargo 培养 .

我的意思是说:

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 中调用父 token 一样。我知道角色会覆盖它,所以我在 $grammar 中保留了原始对象的备份.

已经测试过:
  • 将其定义为返回父级匹配对象的方法,但出现以下错误:
  • P6opaque: no such attribute '$!pos' on type NQPMatch in a Scalar when trying to get a value 
  • 从正则表达式代码插值返回
  • 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在错误消息中 -> 替换 =通过 :=
    说明:
    使用绑定(bind)运算符 :=而不是赋值=标量中的哪个自动装箱,因此标量的错误消息。

    演示:一个完整的工作示例(在 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);

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

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

    关于raku - 如何在自定义语法 (Raku) 中重用语言标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60975309/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com