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

bli*_*ppy 5 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";
Run Code Online (Sandbox Code Playgroud)

输出如下:

at TOP
at word
(Any)
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它似乎与<num>规则不匹配.有任何想法吗?

sml*_*mls 8

您忘记了字符类语法中的斜角括号:

[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键继续),并告诉您哪些令牌/规则匹配办法.

  • Grammar :: Debugger的姐妹模块是与Grammar :: Debugger在同一位置的**Grammar :: Tracer**.`使用Grammar :: Tracer;`你将得到一个针对输入数据运行的语法的痕迹. (3认同)