Как улучшить отчетность об ошибках в грамматиках?

Есть ли способ заставить Perl 6 генерировать сообщение об ошибке, если грамматика не совпадает? Или, по крайней мере, вернуть позицию последних обработанных данных? Довольно сложно исправить синтаксические ошибки, если все, что я получаю от парсера, это "нет совпадения".

Ответы

Ответ 1

Если вы сфокусированы на создании сообщений для пользователей вашей грамматики, см. Генерация хороших ошибок синтаксического анализа с помощью анализатора и Grammar :: ErrorReporting.

Остальная часть этого ответа об отладке.

Во-первых, вы можете встроить произвольные замыкания (код) в правила Perl 6 (или токены или регулярные выражения). Просто введите { your code goes here } в середине правила. Таким образом, вы могли бы просто посыпать { say... } операторы там, где это полезно для отладки. (Обратите внимание, что $/ и его родственники $0, $1 и т.д. И именованные суб-захваты $<foo> и т.д. Автоматически обновляются для ссылки на текущий объект Match и его суб-захваты, соответствующие правилу включения, непосредственно перед входом в замыкание. так что вы можете проанализировать, как происходит совпадение в этой точке регулярного выражения.)

Но есть и лучшие варианты.

Используете ли вы дистрибутив Rakudo Star с "батарейками"? (Вы должны быть, если у вас нет веских причин не делать этого.) Если это так, вы можете добавить строку, use Grammar::Tracer; (как описано в слайдах на http://www.jnthn.net/papers/2011-yapceu-grammars.pdf), чтобы получить полный след анализа.

Лично я предпочитаю использовать отладчик Rakudo, который предоставляет все, что делает Grammar :: Tracer, а также многое другое (один шаг, точки останова и т.д. Всего кода Perl 6, включая регулярные выражения и грамматики). Отладчик представлен в этом видео.

Если у вас есть еще вопросы, я рекомендую вам посетить всегда дружелюбный IRC-канал # perl6.