在学习一种音乐语言的翻译者(从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;
这是Grammer :: Tracer显示的最后一部分,展示了我的问题。
| score
| | uc
| | * MATCH "G"
| * MATCH "G\n"
| score
| * FAIL
* MATCH "a b c d e f g\nA B C D E F G\n"
「a b c d e f g
A B C D E F G
」
在倒数第二行,FAIL字告诉我.parse运行无法退出。我想知道这是否正确吗?.say会显示应有的所有内容,因此我不清楚FAIL有多真实?问题仍然存在,“我如何正确编写语法分析多行而没有错误?”
我不想干扰您的学习过程,但是以防万一您不知道,这里有一个ABC模块。
—
raiph
好吧,至少我们没有选择相同的曲调进行测试!
—
hsmyers