2016-11-24 63 views
3

好的,我正在学习perl6,我正在尝试做一些非常简单的事情:使用语法根据操作对象更改匹配的文本。但是我失败了,我不知道为什么。请原谅我这样简单的问题。我不在技术或编程行业。所以,请耐心等待,好吗?perl6要替换的语法

我想将“jan”更改为01,将“feb”更改为02;那么简单:

grammar month { 
    regex TOP { (\s* <mon> \s*)+ } 
    proto regex mon {*} 
    regex mon:sym<jan> { <sym> } 
    regex mon:sym<feb> { <sym> } 
} 
class monAct { 
    method TOP ($/) { 
    make $<mon>.made; 
    } 
    method mon:sym<jan> ($/) { make "01"; }; 
    method mon:sym<feb> ($/) { make "02"; }; 
} 
my $m = month.parse("jan feb jan feb", actions => monAct.new); 
say $m.made; # it says Nil instead of "01 02 01 02" that I want; 

那么,我在这里做错了什么?谢谢。

+0

请注意你的行动是无状态的,你可以通过对象类型'monAct',而不是实例'monAct.new'到'.parse ' – Christoph

回答

3

<mon>的作用域为捕获组,而不是TOP规则。你可以索引匹配对象得到它,但它可能是更容易使用非捕获组,而不是:

regex TOP { [\s* <mon> \s*]+ } 

此外,由于+量词,你不会得到一个匹配的对象,但一个列表。您可以使用>>map得到的有效载荷,例如

method TOP ($/) { make $<mon>>>.made } 
+0

非常感谢Christoph!当我更改正则表达式TOP使用非捕获组而不更改相应的方法TOP时,它表示“方法”未找到类'Array'的调用者“。正如你所说的,当我改为方法TOP后,它就起作用了。谢谢。 – lisprogtor