Как проще всего заставить Grammar :: Tracer работать на самом Perl6?

Чтобы понять, как perl6 анализирует ваш код, вы можете использовать параметр --target:

$ perl6 --target=parse -e '"Hello World".say'
- statementlist: "Hello World".say
  - statement: 1 matches
    - EXPR: .say
      - 0: "Hello World"
        - value: "Hello World"
          - quote: "Hello World"
            - nibble: Hello World
      - OPER: .say
        - sym: .
        - dottyop: say
          - methodop: say
            - longname: say
              - name: say
                - identifier: say
        - O: <object>
      - dotty: .say
        - sym: .
        - dottyop: say
          - methodop: say
            - longname: say
              - name: say
                - identifier: say
        - O: <object>
$

Намного лучше модуль Grammar::Tracer, описанный здесь. Согласно документации модуля, нужно просто добавить use Grammar::Tracer, и будет отслеживаться любая грамматика, определенная в области, в которой появляется оператор использования.

У меня простой вопрос: если я использую "звездный выпуск", какой самый простой способ получить трассировку (используя Grammar :: Tracer) в самой грамматике Perl6?

Кроме того, если я использую rakudobrew, какой самый простой способ получить отслеживание саму грамматику Perl6?

рекомендуется, чтобы пользователи perl6 использовали звездные версии - было бы желание более внимательно изучить, как perl6 сам анализирует себя, используя грамматику :: Tracer, стоит ли вместо этого строить из исходников локально?


person Marty    schedule 29.03.2016    source источник


Ответы (1)


Таким образом, грамматика в Rakudo достаточно близка к грамматике Perl 6, но она реализована на уровне NQP https://github.com/rakudo/rakudo/blob/nom/src/Perl6/Grammar.nqp Итак, магия Grammar :: Tracer здесь не сработает. Однако вы можете использовать грамматику STD https://github.com/perl6/std/blob/master/STD.pm6 для синтаксического анализа кода, который должен работать с Grammar :: Tracer, я возился, пытаясь заставить его работать с Grammar :: Highlighter. Надеюсь, это поможет?

person Matt Oates    schedule 13.04.2016
comment
Это действительно помогает - и я поставил +1 за подсказку об использовании STD - но оставляет открытым вопрос о том, как перестроить perl6 так, чтобы он использовал STD. - person Marty; 14.04.2016
comment
Значит, вам нужна не трассировка Perl 6, а трассировка шага синтаксического анализа Rakudos во время его выполнения? --target = parse - это, по сути, то, что если вы посмотрите на первую ссылку грамматики, которую я дал, и ваш вывод. Вы можете использовать Grammar.parse () с STD для синтаксического анализа некоторого кода за пределами этапа компиляции - который вы можете отследить - но он не обязательно отражает то, что делает Rakudo. Если вы перейдете на IRC-канал # perl6 на freenode, у них могут быть лучшие предложения. - person Matt Oates; 14.04.2016