gpt4 book ai didi

raku - 解析模块规范的语法

转载 作者:行者123 更新时间:2023-12-04 04:09:05 25 4
gpt4 key购买 nike

Raku 模块可以用不同的方式指定,例如:
MyModuleMyModule: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/

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