Raku 模块可以用不同的方式指定,例如:MyModule
MyModule:ver<1.0.3>
MyModule:ver<1.0.3>:auth<Name (email@example.com)>;
MyModule:ver<1.0.3>:auth<Name <email@example.com>>;
我写了以下grammar
解析模块规范,该规范适用于大多数规范,但如果 auth
则失败字段包含 <
或 >
.在这种情况下,如何修复语法以匹配?
我不知道怎么说匹配 <
之间的所有内容和 >
包括任何 <
和 >
也是。
#!/usr/bin/env perl6
grammar Spec {
token TOP { <spec> }
token spec { <name> <keyval>* }
token name { [<-[./:<>()\h]>+]+ % '::' }
token keyval { ':' <key> <value> }
proto token key { * }
token key:sym<ver> { <sym> }
token key:sym<version> { <sym> }
token key:sym<auth> { <sym> }
token key:sym<api> { <sym> }
token key:sym<from> { <sym> }
# BUG: fix specs that contains '<>' inside value;
token value { '<' ~ '>' $<val>=<-[<>]>* | '(' ~ ')' $<val>=<-[()]>* }
}
my \tests = (
'MyModule:ver<1.0.3>:auth<Name (email@example.com)>',
'MyModule:ver<1.0.3>:auth<Name <email@example.com>>',
);
for tests -> \spec {
say so Spec.parse: spec;
}
# Output:
True
False
最佳答案
如果您知道内部字段与值标记的格式基本相同,则可以使用 $<val>=[.*? <value>?]
递归匹配值.这甚至可以让您单独捕获内部字段的内容:
token value { '<' ~ '>' $<val>=[.*? <value>?] | '(' ~ ')' $<val>=<-[()]>* }
如果您不想要内部内容,则可以使用递归
<~~>
代替<value>
token value { '<' ~ '>' $<val>=[.*? <~~>?] | '(' ~ ')' $<val>=<-[()]>* }
关于raku - 解析模块规范的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58159909/