raku - 解析模块规范的语法

标签 raku

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/

相关文章:

scope - 在子中通过名称获取符号的值

Perl6 : getc in raw mode

testing - "Can' t 打开 perl 脚本 "t/spec/fudgeall": File or directory not found"

raku - 在 Perl 6 中使用循环组合正则表达式

raku - 如何在列之间插入分隔符?

loops - 为什么 Perl 6 的循环变量声明在外部作用域?

regex - Ruby 是否有类似于 Perl 6 语法的插件?

raku - 如何在 Perl 6 中使 `-n=3` 与 `-n 3` 相同?

macos - 为什么在 MacOS Big Sur 上使用 Pakku 时会崩溃 'Cannot locate native library libarchive.13.dylib'

使用元运算符进行测试不会打印测试描述