грамматика perl6 для подстановки

Хорошо, я изучаю perl6 и пытаюсь сделать что-то действительно простое: использовать грамматику для изменения совпадающего текста в соответствии с объектом действия. Но я потерпел неудачу и не знаю почему. Извините, пожалуйста, за такие простые вопросы. Я не занимаюсь технологиями или программированием. Так что проявите ко мне терпение, хорошо?

Я хочу изменить «янв» на «01» и «февр» на «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; 

Итак, что я здесь сделал не так? Спасибо.


person lisprogtor    schedule 24.11.2016    source источник
comment
обратите внимание, что, поскольку ваши действия не имеют состояния, вы можете просто передать объект типа monAct вместо экземпляра monAct.new в .parse   -  person Christoph    schedule 24.11.2016


Ответы (1)


<mon> относится к группе захвата, а не правилу TOP. Вы можете проиндексировать объект соответствия, чтобы добраться до него, но, вероятно, проще использовать вместо этого группу без захвата:

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

Кроме того, благодаря квантификатору + вы получите не единичный объект соответствия, а список. Вы можете использовать >> или map, чтобы получить полезную нагрузку, например

method TOP ($/) { make $<mon>>>.made }
person Christoph    schedule 24.11.2016
comment
Большое спасибо, Кристоф! Когда я изменил регулярное выражение TOP для использования группы без захвата без изменения соответствующего метода TOP, он говорит, что метод «made» не найден для вызывающего класса «Array». После того, как я перешел на метод TOP, как вы упомянули, он сработал. Спасибо. - person lisprogtor; 24.11.2016