为什么这个 perl 6 语法不起作用?
Why doesn't this perl 6 grammar work?
我不了解 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>
规则。有什么想法吗?
您忘记了 character classes 语法中的尖括号:
[a..z]+
应该是 <[a..z]>+
[0..9]+
应该是 <[0..9]>+
就其本身而言,方括号 [ ]
在 Perl 6 正则表达式中仅充当 non-capturing group。所以 [a..z]+
会匹配字母 "a",后跟任意两个字符,然后是字母 "z",然后整个匹配任意次。由于这与单词 "outline" 不匹配,<aword>
标记无法为您匹配,并且解析没有继续到 <num>
标记。
PS:在调试语法时,一个比在任何地方添加 {say ...}
块更方便的替代方法是使用 Grammar::Debugger。安装该模块后,您可以暂时将 use Grammar::Debugger;
行添加到您的代码中,然后 运行 您的程序 - 然后它将逐步通过您的语法(使用 ENTER 键继续),并且告诉你一路上哪个 tokens/rules 匹配。
我不了解 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>
规则。有什么想法吗?
您忘记了 character classes 语法中的尖括号:
[a..z]+
应该是 <[a..z]>+
[0..9]+
应该是 <[0..9]>+
就其本身而言,方括号 [ ]
在 Perl 6 正则表达式中仅充当 non-capturing group。所以 [a..z]+
会匹配字母 "a",后跟任意两个字符,然后是字母 "z",然后整个匹配任意次。由于这与单词 "outline" 不匹配,<aword>
标记无法为您匹配,并且解析没有继续到 <num>
标记。
PS:在调试语法时,一个比在任何地方添加 {say ...}
块更方便的替代方法是使用 Grammar::Debugger。安装该模块后,您可以暂时将 use Grammar::Debugger;
行添加到您的代码中,然后 运行 您的程序 - 然后它将逐步通过您的语法(使用 ENTER 键继续),并且告诉你一路上哪个 tokens/rules 匹配。