Экспорт регулярных выражений из грамматик - PullRequest
0 голосов
/ 08 октября 2018

Грамматика - это классы, и поэтому они должны подчиняться тем же правилам, что и другие классы.Однако существует проблема с экспортом регулярных выражений из грамматики:

grammar Word {
    token TOP { ^ <letters> $}
    regex letters   is export { <[\w] - [_]>+ };
    sub exported () is export  { return 'exported' };
}

import Word;

say exported;
say "what_ever" ~~ &letters;

import эффективно импортирует exported и не вызывает жалоб на letters.Однако в последней строке есть эта ошибка:

Type check failed in binding to parameter '<anon>'; expected Word but got Match (Match.new(orig => "what_ev...)

Та же самая ошибка происходит, если &letters изменяется на /<letters>/, что является другим способом вызова регулярных выражений.Кажется, ошибка указывает на то, что letters имеет какой-то скрытый аргумент, когда они объявляются в грамматике, потому что это работает:

module Regexes {
    my regex letters   is export { <[\w] - [_]>+ };
}
import Regexes;
say "what_ever" ~~ /<letters>/;
# Output: 
# 「what」
#  letters => 「what」

Так что же это за параметр?Как мы можем эффективно использовать экспортированные регулярные выражения / токены / правила из Grammar

1 Ответ

0 голосов
/ 08 октября 2018

Префикс объявления регулярного выражения letters с my или our.

По умолчанию декларатор method, regex, token или rule объявляется с помощьюнеявный has декларатор, предшествующий ему.


Я все еще размышляю о том, что здесь происходит, но хотел бы обновить свой ответ в ответ на ваш первый комментарий.

Type check failed in binding to parameter '';
expected Word but got Match (Match.new(orig => "what_ev...)

Бит parameter '' определенно меньше, чем удивительный.

Любопытно, что подпись подпрограмм, объявленных с my method или our method, имеет класс или грамматику включениякак их тип, с предположением Mu, если они объявлены в основной строке, тогда как для regex, token или rule инвокант всегда равен Mu:

grammar g {
          method method              { ... }  # (g $: *%_)
      has method has-method          { ... }  # (g $: *%_)
      my  method my-method is export { ... }  # (g $: *%_)

          regex  regex               { ... }  # (g $: *%_)
      has regex  has-regex           { ... }  # (g $: *%_)
      my  regex  my-regex is export  { ... }  # (Mu $: *%_)

          sub    sub is export       { ... }  # ()
#     has sub    has-sub is export   { ... }  # Cannot use 'has' with sub declaration
      my  sub    my-sub is export    { ... }  # ()
}

import g;

say .signature
  for g.^lookup('method'),
      g.^lookup('has-method'),
      &my-method,
      g.^lookup('regex'),
      g.^lookup('has-regex'),
      &my-regex,
      &sub,
      &my-sub

отображает подпись для каждого стандартного объявления в грамматике.Я добавил вывод в виде комментариев в конце каждой процедуры.

...