gpt4 book ai didi

grammar - 使用 Perl 6 语法在原始正则表达式中传递变量

转载 作者:行者123 更新时间:2023-12-04 07:30:53 26 4
gpt4 key购买 nike

将变量传递给 tokenregexrule相当直截了当。例如,输出

grammar Foo {
token TOP { (.) {} <bar($0)> }
token bar($s) { {say ~$s} .+ }
}
Foo.parse("xyz")

简直是 x .但是在使用 proto 时事情会出错。例如,1 让我们制作一个简单的原型(prototype)来区分字符串的其余部分是字母还是数字:
grammar Foo {
token TOP { (.) {} <bar($0)> }
proto token bar { * }
token bar:sym<a> ($s) { {say ~$s} <alpha>+ }
token bar:sym<1> ($s) { {say ~$s} <digit>+ }
}

Foo.parse("xyz")

这个炸弹,声称它 expected 1 argument but got 2对于 bar .好的,在普通方法中,我们必须在 proto 声明中指定 args,所以让我们声明:
grammar Foo {
token TOP { (.) {} <bar($0)> }
proto token bar ($s) { * }
token bar:sym<a> ($s) { {say ~$s} <alpha>+ }
token bar:sym<1> ($s) { {say ~$s} <digit>+ }
}

Foo.parse("xyz")

现在我们得到相反的结果: expected 2 arguments but got 1 .嗯,也许这意味着 proto 声明正在吃值而不是传递任何东西。所以我试着把它滑进去:
grammar Foo {
token TOP { (.) {} <bar($0)> }
proto token bar (|) { * }
token bar:sym<a> ($s) { {say ~$s} <alpha>+ }
token bar:sym<1> ($s) { {say ~$s} <digit>+ }
}

Foo.parse("xyz")

这里同样的错误。它声称它 expected 2 arguments, but got 1 .2 不知何故使用 proto正在吃掉争论。目前,我发现的唯一解决方案使用动态变量,这让我认为可能存在一些隐藏步骤,其中变量没有从原型(prototype)传递到候选。
grammar Foo {
token TOP { (.) {} <bar($0)> }
proto token bar ($*s) { * }
token bar:sym<a> { {say ~$*s} <alpha>+ }
token bar:sym<1> { {say ~$*s} <digit>+ }
}

Foo.parse("xyz")

但这似乎是一个不完全直观的步骤。如何以非动态方式将变量直接传递给原型(prototype),以便候选人接收?

[1] 请注意,以上所有代码都已被打高尔夫球以专注于传递变量。实际使用的 token 与我的真实代码没有任何相似之处。
[2] 我也开始怀疑这是否(一般而言)是 LTA 错误消息。虽然我知道它基于第一个 arg = invocant,但它仍然感觉不对。也许它应该说“预期的调用者和一个论点,只收到调用者”之类的。

最佳答案

TL;DR

  • 这是一个错误。见 [BUG] Proto regex with params isn't called correctly (possibly NYI) in Rakudo .
  • 我有一种替代方法可用于传递非动态参数。但请看下一点。
  • 您的后续评论解释了您打高尔夫球的内容,这表明您的动态变量替代方案可能会更好。我也会讨论这个。

  • 另一种可行的方法

    开关 proto token...proto method...token foo:sym<...>转至 multi token s 没有 :sym<...>词缀:
    grammar Foo {
    token TOP { (.) {} <bar($0)> }
    proto method bar ($s) {*}
    multi token bar ($s where /<alpha>+/) { {say 'alpha start ', $s} .. }
    multi token bar ($s where /<digit>+/) { {say 'digit start ', $s} .. }
    }

    say Foo.parse("xyz")

    显示:
    alpha start 「x」
    「xyz」
    0 => 「x」
    bar => 「yz」

    您的动态变量替代方案可能会更好

    In my actual code, the variable is passed along to block certain matches (mainly to avoid certain types of recursion)



    听起来您可以有一个动态变量(例如 $*nope ),设置为您希望的任何值,然后系统地使用它。或者也许是一对。动态变量正是为这类事情而设计的。除了对动态变量的意识形态上的不满(在某种程度上它们被粗心地用作不受约束的全局变量,它们是坏消息),还有什么不喜欢的?

    关于grammar - 使用 Perl 6 语法在原始正则表达式中传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57244839/

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