LINUX.ORG.RU

История изменений

Исправление Lilly, (текущая версия) :

Что делать чтобы вывести информацию об ошибке и пальцем ткнуть в то самое место?

Если нужно отдебажить чужое, то: https://github.com/jnthn/grammar-debugger и оттуда Grammar::Tracer, например. Или https://github.com/nkh/P6-Grammar-Tracer-Compact

Но вообще, грамматики пишутся в инкрементальном стиле (т.е. шаг за шагом) и покрываются тестами. В правилах ты можешь вызывать любой свой код, так что для подсказок и диагностики можно что-нибудь в стиле таком писать:

grammar Foo {
    token foo {
        <relative-part> [ '?' <query> ] ? [ '#' <fragment> ] ?
        [ $ || <.panic('unexpected text at end')> ]
    }   # ^ пытаемся здесь сматчить конец строки, если не получается, вызываем panic

    method panic($reason) {
        say "Tried to parse self.orig()";
        # ну и другие методы кроме orig можно дёргать чтобы узнать, в каком месте строки курсор и т.п.
        die X::Foo:ParseError.new(...);
    }
}

Если ты наколбасил 100 правил сразу, ничего не проверяя, тестов нет, а глаза горят… То так не надо делать.

Хочу откомпилять в байткод, а потом байткод выполнить на moarvm

Эээээм… Ты хочешь написать компилятор (или скорее бекенд) в байткод moarvm? Или свой скрипт откомпилировать и дёргать его на moarvm напрямую, без бинарника perl6? Если второе, то для скриптов этого нет, для модулей это автоматически происходит за счёт прекомпиляции.

Исходная версия Lilly, :

Что делать чтобы вывести информацию об ошибке и пальцем ткнуть в то самое место?

Если нужно отдебажить чужое, то: https://github.com/jnthn/grammar-debugger и оттуда Grammar::Tracer, например. Или https://github.com/nkh/P6-Grammar-Tracer-Compact

Но вообще, грамматики пишутся в инкрементальном стиле (т.е. шаг за шагом) и покрываются тестами. В правилах ты можешь вызывать любой свой код, так что для подсказок и диагностики можно что-нибудь в стиле таком писать:

grammar Foo {
    token foo {
        <relative-part> [ '?' <query>] ? [ '#' <fragment> ] ?
        [ $ || <.panic('unexpected text at end')> ]
    }   # ^ пытаемся здесь сматчить конец строки, если не получается, вызываем panic

    method panic($reason) {
        say "Tried to parse self.orig()";
        # ну и другие методы кроме orig можно дёргать чтобы узнать, в каком месте строки курсор и т.п.
        die X::Foo:ParseError.new(...);
    }
}

Если ты наколбасил 100 правил сразу, ничего не проверяя, тестов нет, а глаза горят… То так не надо делать.

Хочу откомпилять в байткод, а потом байткод выполнить на moarvm

Эээээм… Ты хочешь написать компилятор (или скорее бекенд) в байткод moarvm? Или свой скрипт откомпилировать и дёргать его на moarvm напрямую, без бинарника perl6? Если второе, то для скриптов этого нет, для модулей это автоматически происходит за счёт прекомпиляции.