Как использовать Grammar :: Tracer с грамматикой в ​​единичной области? - PullRequest
8 голосов
/ 08 апреля 2019

Я использую Grammar :: Tracer со следующей настройкой:

p.p6

use v6;
use lib '.';
use MyGrammar;
my $res = MyGrammar.parse('hello 6 9 bye');
say $res;

MyGrammar.pm6 :

unit grammar MyGrammar;
use Grammar::Tracer;

rule TOP { [<number> || <word> ]* }
rule number { \d+ }
rule word { \w+}

Но трассировка не включена.Я полагаю, это потому, что грамматика MyGrammar не входит в лексическую область выражения use Grammar::Tracer?

1 Ответ

7 голосов
/ 08 апреля 2019

Модуль Grammar::Tracer работает путем экспорта пользовательского метакласса, который будет использоваться вместо метакласса по умолчанию для ключевого слова grammar.Это должно быть уже на месте до того, как будет найдено ключевое слово grammar, поскольку именно тогда мы разрешаем и фиксируем метакласс, который будет использоваться для объявленного типа.

Решение состоит в том, чтобы поставить useзаявление перед объявлением grammar:

use Grammar::Tracer;
unit grammar MyGrammar;
...