История изменений
Исправление 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? Если второе, то для скриптов этого нет, для модулей это автоматически происходит за счёт прекомпиляции.