Вот две грамматики. Один использует proto token
, а другой нет. Они оба делают то же самое. Это в основном примеры в S05 under "Variable (non-)interpolation". В этом простом примере они оба могут делать одни и те же вещи.Зачем вам использовать правило proto в грамматике Perl 6?
Какие ситуации оправдывают всю дополнительную напечатку? Токены proto
имеют различные методы в классе действий, и, возможно, там небольшое преимущество. Однако вам нужно набрать некоторые дополнительные материалы, чтобы получить эту выгоду.
Есть ли какая-то особенность proto
, которая упрощает другие части грамматики?
grammar NoProto {
token variable { <sigil> <identifier> }
token identifier { <ident>+ }
token sigil { < $ @ % & :: > }
}
grammar YesProto {
token variable { <sigil> <identifier> }
token identifier { <ident>+ }
proto token sigil { * }
token sigil:sym<$> { <sym> }
token sigil:sym<@> { <sym> }
token sigil:sym<%> { <sym> }
token sigil:sym<&> { <sym> }
token sigil:sym<::> { <sym> }
}
class Proto::Actions {
method variable ($/) {
say "found variable: " ~ $/;
}
method identifier ($/) {
say "found identifier: " ~ $/;
}
method sigil ($/) {
say "found sigil: " ~ $/;
}
method sigil:sym<$> ($/) {
say "found sym sigil: " ~ $/;
}
}
my $variable = '$butterfuly';
say "------No proto parsing";
my $no_proto_match = NoProto.parse(
$variable,
:rule<variable>,
:actions(Proto::Actions),
);
say "------Yes proto parsing";
my $yes_proto_match = YesProto.parse(
$variable,
:rule<variable>,
:actions(Proto::Actions),
);
Выходные данные показывают, что proto
вызывает другой метод в классе действий:
------No proto parsing
found sigil: $
found identifier: butterfuly
found variable: $butterfuly
------Yes proto parsing
found sym sigil: $
found identifier: butterfuly
found variable: $butterfuly
А, ладно. Но почему не вызвал метод 'sigil' в классе действий? Я вижу использование этого вне грамматик, но я пытаюсь придумать для него случай внутри грамматик. Примеры, которые я видел, не были сложными, или они были грузовым культом. –