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

时间:2016-12-13 18:15:48

标签: perl6

我不知道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>规则不匹配。有什么想法吗?

1 个答案:

答案 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键继续),并告诉您哪些令牌/规则沿途匹配。