2016-11-24 13 views
3

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

Я хочу изменить «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

Большое спасибо, Кристоф! Когда я изменил regex TOP, чтобы использовать группу без захвата, не меняя соответствующий метод TOP, он говорит: «Метод« сделал »не найден для invocant класса« Array ». После того, как я перешел на метод TOP, как вы упомянули, он сработал. Благодарю. – lisprogtor