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

标签 raku

我不知道 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]>+
本身,方括号[ ]只需充当 non-capturing group在 Perl 6 正则表达式中。所以[a..z]+将匹配字母“a”,后跟任意两个字符,然后是字母“z”,然后再匹配整个事物任意次数。由于这与“大纲”一词不匹配,<aword> token 未能为您匹配,并且解析没有继续到 <num> token 。

PS:调试语法时,添加{say ...}更方便的替代方法到处都是 block ,就是用Grammar::Debugger .安装该模块后,您可以临时添加行 use Grammar::Debugger;到您的代码,并运行您的程序 - 然后它会一步一步地检查您的语法(使用 ENTER 键继续),并告诉您哪些 token /规则在此过程中匹配。

关于raku - 为什么这个 perl 6 语法不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41127906/

相关文章:

expression - `do` 关键字是运行 block 还是将其视为表达式?

raku - 在 Perl 6 中访问匹配部分

type-inference - Perl 6类型推断

oop - raku 内置访问器方法可以被子类覆盖吗?

json - perl6 类到 json 排除属性

raku - 无法运行 "cro stub"等

raku - 为什么 `will end` 在程序级范围内的行为与 `will leave` 不同?

dsl - 用 rakudo 编译和执行用 perl6 子集编写的程序

variables - 如何在用户定义的字符类中插入变量?

raku - 我可以删除 SetHash 的一个元素并在 Perl 6 中使用它的值吗?