为什么这个 perl 6 语法不起作用?

Why doesn't this perl 6 grammar work?

我不了解 perl 5,但我想我可以尝试一下 perl 6。我正在尝试它的语法功能,但到目前为止我还没有运气。这是我的代码:

    grammar CopybookGrammar {
        token TOP { {say "at TOP" }  <aword><num>}
        token aword { {say "at word" } [a..z]+ }
        token num { {say "at NUM" } [0..9]+ }
}


sub scanit($contents) {
        my $match1 = CopybookGrammar.parse($contents);
        say $match1;
}

scanit "outline1";

输出结果如下:

at TOP
at word
(Any)

出于某种原因,它似乎不符合 <num> 规则。有什么想法吗?

您忘记了 character classes 语法中的尖括号:

[a..z]+ 应该是 <[a..z]>+

[0..9]+ 应该是 <[0..9]>+

就其本身而言,方括号 [ ] 在 Perl 6 正则表达式中仅充当 non-capturing group。所以 [a..z]+ 会匹配字母 "a",后跟任意两个字符,然后是字母 "z",然后整个匹配任意次。由于这与单词 "outline" 不匹配,<aword> 标记无法为您匹配,并且解析没有继续到 <num> 标记。


PS:在调试语法时,一个比在任何地方添加 {say ...} 块更方便的替代方法是使用 Grammar::Debugger。安装该模块后,您可以暂时将 use Grammar::Debugger; 行添加到您的代码中,然后 运行 您的程序 - 然后它将逐步通过您的语法(使用 ENTER 键继续),并且告诉你一路上哪个 tokens/rules 匹配。