我不知道 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]>+
本身,方括号[ ]
只需充当 non-capturing group在 Perl 6 正则表达式中。所以[a..z]+
将匹配字母“a”,后跟任意两个字符,然后是字母“z”,然后再匹配整个事物任意次数。由于这与“大纲”一词不匹配,<aword>
token 未能为您匹配,并且解析没有继续到 <num>
token 。
PS:调试语法时,添加{say ...}
更方便的替代方法到处都是 block ,就是用Grammar::Debugger .安装该模块后,您可以临时添加行 use Grammar::Debugger;
到您的代码,并运行您的程序 - 然后它会一步一步地检查您的语法(使用 ENTER 键继续),并告诉您哪些 token /规则在此过程中匹配。
关于raku - 为什么这个 perl 6 语法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127906/