gpt4 book ai didi

regex - 为什么 Perl 6 语法原型(prototype)的正文中不能有任何内容?

转载 作者:行者123 更新时间:2023-12-03 15:50:52 24 4
gpt4 key购买 nike

声明 proto 时,可以用附加代码包围多方法/子代码。举个愚蠢的例子:

proto sub foo(|) { 'Camelia says “' ~ {*} ~ '!”' }
multi sub foo(1) { "hi" }
multi sub foo($) { "bye" }

say foo(1) # Camelia says “hi!”

我还没有遇到过任何时候(还)我觉得这非常有用,但另一方面,我在正则表达式/语法世界中遇到了一些地方,我偶尔会发现自己在所有 proto 标记中重复自己——并不是我不能转换成单独的标记,而是增加了一层额外的层次结构和操作。比较假设
grammar Bar { 
token TOP { <meta>* }
token metastart { '#' }
proto token meta { <metastart> {*} }
token meta:name { ( \w* ) }
token meta:date { (\d**6) }
}

除了 TOP 之外,他们只有必要的操作方法将是 meta:namemeta:date
grammar Bar { 
token TOP { <meta>* }
token metastart { '#' }
token meta { <metastart> <metacontent> }

proto token metacontent { * }
token metacontent:name { \w* }
token metacontent:date { \d**6 }
}

这现在需要三种方法: metacontent:name , metacontent:date然后是相当多余的 meta他的整个 body 就是 make $<metacontent>.made .

虽然我看到文档/评论说你可以在语法内部的原型(prototype)中折腾代码,但如果任何东西放在原型(prototype) token /正则表达式/规则的主体中而不是单个 * ,然后编译器提示: Proto regex body must be {*} (or <*> or <...>, which are deprecated)
这是尚未实现的功能,还是计划不再允许原型(prototype)中的任何内容?如果是后者,为什么 proto需要代号吗? (我猜这是因为 proto token /正则表达式/规则的调度方式有些特殊,因为在语法中删除 proto 会导致运行时失败,这与子/方法世界不同。

最佳答案

事实上,proto regexes只不过是几个 token 的分组设备。文档说:

the name of a group of values we'll create



它们并没有真正声明例程 multi,事实上,遵循该 proto 的标记没有声明为 multi,它们只是具有有趣名称的标记(它们是正则表达式,它们是方法)。

在您的情况下,您可以通过使用交替来简单地避免额外的 proto 标记,这实际上是语法中的 protos 所代表的:
grammar Bar { 
token TOP { <meta>* }
token metastart { '#' }
token meta { <metastart> [ <name> | <date> ] }
token name { \w* }
token date { \d**6 }
}

say Bar.parse( "#Hey" );
say Bar.parse( "#3333" );

关于regex - 为什么 Perl 6 语法原型(prototype)的正文中不能有任何内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57280435/

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