gpt4 book ai didi

raku - 在 Perl 6 中传递数据以形成语法规则

转载 作者:行者123 更新时间:2023-12-04 11:19:16 24 4
gpt4 key购买 nike

不确定是否grammars是为了做这样的事情:我想要tokens将在运行时定义(将来 - 使用文件中的数据)。所以我写了一个简单的测试代码,正如预期的那样,它甚至无法编译。

grammar Verb {
token TOP {
<root>
<ending>
}
token root {
(\w+) <?{ ~$0 (elem) @root }>
}
token ending {
(\w+) <?{ ~$0 (elem) @ending }>
}
}

my @root = <go jump play>;
my @ending = <ing es s ed>;

my $string = "going";
my $match = Verb.parse($string);
.Str.say for $match<root>;

在 Perl 6 中做这些事情的最佳方式是什么?

最佳答案

要匹配数组的任何元素,只需在正则表达式中写入数组变量的名称(以 @ 符号开头):

my @root = <go jump play>;
say "jumping" ~~ / @root /; # Matches 「jump」
say "jumping" ~~ / @root 'ing' /; # Matches 「jumping」

因此,在您的用例中,唯一棘手的部分是将数组从创建它们的代码(例如,通过解析数据文件)传递给需要它们的语法标记。

最简单的方法可能是使它们成为动态变量(由 * twigil 表示):

grammar Verb {
token TOP {
<root>
<ending>
}
token root {
@*root
}
token ending {
@*ending
}
}

my @*root = <go jump play>;
my @*ending = <ing es s ed>;

my $string = "going";
my $match = Verb.parse($string);

say $match<root>.Str;

另一种方法是通过 Capture 将数组添加到 args方法副词 .parse ,这会将它们传递给 token TOP ,从那里您可以使用 <foo(...)> 依次将它们传递给子规则或 <foo: ...>句法:

grammar Verb {
token TOP (@known-roots, @known-endings) {
<root: @known-roots>
<ending: @known-endings>
}
token root (@known) {
@known
}
token ending (@known) {
@known
}
}

my @root = <go jump play>;
my @ending = <ing es s ed>;

my $string = "going";
my $match = Verb.parse($string, args => \(@root, @ending));

say $match<root>.Str; # go

关于raku - 在 Perl 6 中传递数据以形成语法规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861495/

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