我不知道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";
Run Code Online (Sandbox Code Playgroud)
输出如下:
at TOP
at word
(Any)
Run Code Online (Sandbox Code Playgroud)
出于某种原因,它似乎与<num>规则不匹配.有任何想法吗?
您忘记了字符类语法中的斜角括号:
[a..z]+ 应该 <[a..z]>+
[0..9]+ 应该 <[0..9]>+
方括号本身[ ]就可以作为Perl 6正则表达式中的非捕获组.所以[a..z]+匹配字母"a",后跟任意两个字符,后跟字母"z",然后再重复整个事件.由于这与单词"outline"不匹配,因此<aword>令牌无法与您匹配,并且解析没有继续到<num>令牌.
PS:调试语法时,{say ...}使用Grammar :: Debugger是一种比在任何地方添加块更方便的替代方法.安装该模块后,您可以暂时将该行添加use Grammar::Debugger;到您的代码中,并运行您的程序 - 然后它将逐步完成您的语法(使用ENTER键继续),并告诉您哪些令牌/规则匹配办法.