我有两个问题。我表现出的行为是否正确?如果是,它是否记录在某处?
我在玩语法TOP
方法。宣布为rule
,它意味着字符串的开头和结尾锚点以及:sigspace
:
grammar Number {
rule TOP { \d+ }
}
my @strings = '137', '137 ', ' 137 ';
for @strings -> $string {
my $result = Number.parse( $string );
given $result {
when Match { put "<$string> worked!" }
when Any { put "<$string> failed!" }
}
}
如果没有空格或只有尾随空格,则字符串将被解析。由于前导空格,它会失败:
<137> worked!
<137 > worked!
< 137 > failed!
我想这意味着rule
正在申请:sigspace
首先是锚点,然后是锚点:
grammar Foo {
regex TOP { ^ :sigspace \d+ $ }
}
我期待一个rule
允许前导空格,如果你改变顺序就会发生这种情况:
grammar Foo {
regex TOP { :sigspace ^ \d+ $ }
}
我可以添加一个显式标记rule
对于字符串的开头:
grammar Number {
rule TOP { ^ \d+ }
}
现在一切正常:
<137> worked!
<137 > worked!
< 137 > worked!
我没有任何理由认为应该是其中一种方式。这语法文档 https://docs.perl6.org/language/grammars说发生了两件事,但文档没有说明这些效果适用的顺序:
请注意,如果您使用 .parse 方法进行解析,则标记 TOP 会自动锚定
and
当使用规则而不是标记时,原子后面的任何空格都会变成对 ws 的非捕获调用。
我认为答案是该规则实际上并不是以模式意义为基础的。就是这样.parse
作品。光标必须从位置 0 开始,到字符串中的最后一个位置结束。这是模式之外的东西。