gpt4 book ai didi

alias - 如何编写Raku正则表达式的别名?

转载 作者:行者123 更新时间:2023-12-03 15:39:56 27 4
gpt4 key购买 nike

我写了这样的语法:

grammar StatementFormat {
token TOP { (<plain> | '%' <placeholder>)* }

token plain { <-[%]> }

token placeholder {
| <verb>
| <noun>
| <adverb>
}

token verb {
'v'
{
# some actions
}
}

token noun {
'n'
{
# some actions
}
}

token adverb {
'a'
{
# some actions
}
}
}
因此,我可以用它来解析诸如“某人%v%n%a”之类的字符串。
但是,我发现有很多用法,例如“%v%n%a”,我想给它起一个别名,例如“%b”,这样解析“someone%b”等同于解析“someone%” v%n%a”。
那么有没有办法做到这一点?
当然, token alias { 'b' { ... } }可以做到这一点。但是以这种方式,我需要重复该 Action 代码。我想知道是否存在一种更简单的方法。

最佳答案

因此,有一种明显的方法,就是将操作的代码简单地放入子例程中,然后在b别名中调用它们:

sub verb-action($/) { }
sub noun-action($/) { }
sub adverb-action($/) { }

grammar StatementFormat {
# rest goes here

token verb {
'v'
{ verb-action($/) }
}

token noun {
'n'
{ noun-action($/) }
}

token adverb {
'a'
{ adverb-action($/) }
}

token alias {
'b'
{
verb-action($/);
noun-action($/);
adverb-action($/);
}
}
}
但是,那会带来什么乐趣呢?
相反,我建议使用内置的 action object feature of grammars
它是这样的:您有一个单独的类,将 Action 作为方法,与语法 Action 同名:
class StatementFormatActions {
method verb($/) { ... }
method noun($/) { ... }
method adverb($/) { ... }

}
当调用 parse时,您将传递该 Action 类的实例:
StatementFormat.parse($string, :actions(StatementFormatActions.new));
然后,当您引入 alias token 时,您还可以引入 alias方法:
method alias($/) {
self.verb($/);
self.noun($/);
self.adverb($/);
}
在 Action 内部,您还可以调用 make$/.make(...)将 Action 结果附加到match对象(然后在 $/.made中可用),以从解析树中填充AST。
(您可能还喜欢 my book on grammars,其中有几个示例和更深入的说明。对不起,对于插件,您无法抗拒)。

关于alias - 如何编写Raku正则表达式的别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62914298/

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