我不知道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>
规则不匹配。有什么想法吗?
答案 0 :(得分:8)
您忘记了character classes语法中的斜角括号:
[a..z]+
应为<[a..z]>+
[0..9]+
应为<[0..9]>+
方括号[ ]
本身只是在Perl 6正则表达式中充当non-capturing group。因此[a..z]+
将匹配字母“a”,后跟任意两个字符,后跟字母“z”,然后再重复整个事件。由于这与单词“outline”不匹配,<aword>
令牌无法与您匹配,并且解析没有继续到<num>
令牌。
PS:调试语法时,使用Grammar::Debugger是在任何地方添加{say ...}
块的更方便的替代方法。安装该模块后,您可以暂时将行use Grammar::Debugger;
添加到您的代码中,并运行您的程序 - 然后它将逐步完成您的语法(使用ENTER键继续),并告诉您哪些令牌/规则沿途匹配。