我不了解perl 5,但我想我会喜欢perl6。我正在尝试它的语法功能,但到目前为止我还没有运气。这是我的代码:
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>
规则不匹配。有任何想法吗?
您忘记了字符类语法中的尖括号:
[a..z]+
应该 <[a..z]>+
[0..9]+
应该 <[0..9]>+
就其本身而言,方括号在Perl 6正则表达式中[ ]
仅充当非捕获组。因此,[a..z]+
将匹配字母“ a”,后跟任意两个字符,后跟字母“ z”,然后将整件事匹配任意次数。由于这与单词“大纲”不匹配,因此<aword>
令牌无法与您匹配,并且解析没有继续进行<num>
。
PS:调试语法时,{say ...}
使用Grammar :: Debugger可以更方便地替代在各处添加块的方法。安装该模块后,您可以将该行临时添加use Grammar::Debugger;
到代码中,然后运行您的程序-然后它将逐步进行语法检查(使用ENTER键继续),并告诉您哪些标记/规则与方式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句