我有一个类似的字符串"39 3A 3B 9:;",我想提取“ 39、3A,3B”
我试过了
my $a = "39 3A 3B 9:;";
grammar Hex {
token TOP { <hex_array>+ .* }
token hex_array { <[0..9 A..F]> " " }
};
Hex.parse($a);
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。甚至这似乎也不起作用。
my $a = "39 3A 3B ";
grammar Hex {
token TOP { <hex_array>+ }
token hex_array { <[0..9 A..F]> " " }
};
Hex.parse($a);
Run Code Online (Sandbox Code Playgroud)
我确实尝试过语法:: Tracer TOP和hex_array均失败
TOP
| hex_array
| * FAIL
* FAIL
Run Code Online (Sandbox Code Playgroud) 在将一种音乐语言翻译成另一种音乐语言(ABC 到 Alda)作为学习 Raku DSL 能力的借口的过程中,我注意到似乎没有办法终止.parse! 这是我缩短的演示代码:
#!/home/hsmyers/rakudo741/bin/perl6
use v6d;
# use Grammar::Debugger;
use Grammar::Tracer;
my $test-n01 = q:to/EOS/;
a b c d e f g
A B C D E F G
EOS
grammar test {
token TOP { <score>+ }
token score {
<.ws>?
[
| <uc>
| <lc>
]+
<.ws>?
}
token uc { <[A..G]> }
token lc { <[a..g]> }
}
test.parse($test-n01).say;
Run Code Online (Sandbox Code Playgroud)
Grammer::Tracer 显示的最后一部分说明了我的问题。
| score
| | uc
| | * MATCH "G" …Run Code Online (Sandbox Code Playgroud) 作为语法的一部分,我有:
rule EX1 { <EX2> ( '/' <EX2>)* }
Run Code Online (Sandbox Code Playgroud)
在我的动作课中,我写了:
method EX1($/) {
my @ex2s = map *.made, $/.<EX2>;
my $ex1 = @ex2s.join('|');
#say "EX1 making $ex1";
$/.make($ex1);
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我只是试图将所有的连接EX2在一起,并'|'在它们之间而不是一个'/'。但是我的代码有些不对劲,因为它只会拾取第一个EX2而不是随后的代码。我如何找出可选的是什么?