Использование $ / не совсем то же самое, что использование любой другой переменной в действиях по грамматике. - PullRequest
8 голосов
/ 01 июля 2019

Теоретически и в соответствии с документацией , вы можете использовать любой аргумент для методов в грамматических действиях.

grammar G {
    token TOP { \w+ }
}

class Action-Arg {
    method TOP ($match) { $match.make: ~$match }
}

class Action {
    method TOP ($/) { make ~$/ }
}

class Action-Fails {
    method TOP ($match) { make ~$match }
}

say G.parse( "zipi", actions => Action-Arg );
say G.parse( "zape", actions => Action );
say G.parse( "pantuflo", actions => Action-Fails );

Однако две первые версии работают как положено. Но третий (который будет прямым переводом второго) терпит неудачу с

Cannot bind attributes in a Nil type object
  in method TOP at match-and-match.p6 line 19
  in regex TOP at match-and-match.p6 line 7
  in block <unit> at match-and-match.p6 line 24

Возможно, существует какой-то особый синтаксис (в смысле make на самом деле $/.make, вероятно), но я просто хотел бы уточнить, соответствует ли он спецификации или это ошибка.

1 Ответ

8 голосов
/ 01 июля 2019

Это потому, что подпрограмма make является одним из тех редких случаев в Rakudo, когда она фактически пытается получить доступ к переменной $/ из области, из которой она вызывается.Вот как это задокументировано:

Форма работает с текущими $ /

(из документация )

...