2014-12-26 4 views
1

В последнее время я экспериментировал с Treetop, чтобы создать простой парсер для языка CFG DSL для одного из моих клиентов. Мне удалось реализовать все необходимые ему функции, но работа с Treetop оказалась довольно болезненным опытом.Механизм обработки ошибок парсера Treetop, обеспечивающий бесполезный вывод

Проблема в том, что я не смог получить какое-либо полезное сообщение об ошибке от Treetop. Единственным выходом, который я получаю, является

parser.rb:22:in `parse': Parser error at offset: 0 (Exception) 
Error: 
#<TranLanParser:0x007f960c852f60> 
    from parser.rb:28:in `<class:Parser>' 
    from parser.rb:10:in `<main>' 

который всегда указывает на первый символ в файле. Это действительно ужасно, чтобы найти какую-либо ошибку в анализируемом языке. Как я должен постепенно развивать свой парсер, если не могу найти, что не так?

Я попытался изменить свою грамматику, чтобы содержать рекурсивные правила, потому что я думал, что это поможет парсеру создать узлы AST как можно скорее, но это не помогло.

Мой вопрос: Я что-то не так? Есть ли хороший пример того, как создавать грамматики PEG для Treetop, которые предоставляют значимые сообщения об ошибках на частично полученных деревьях? Или это ошибка/ошибка в библиотеке Treetop?

Спасибо за ваше мнение.

ответ

2

Вы пытаетесь использовать parser.failure_reason? Это отображает список терминалов, которые позволили бы выйти за пределы самого правильного положения, которое достиг парсер (до его отслеживания).

Пробовал ли вы один токен или ультра-простую грамматику, работая, как вы идете?

Пробовал ли параметр parser.consume_all_input = false, чтобы увидеть, правильно ли он обрабатывался, но не до конца ввода?

Есть еще несколько «ловушек для молодых игроков», но вы не дали нам достаточной информации для продолжения. Как только вы «получите», разработка в Treetop - это легкий ветерок, но для достижения этой цели может потребоваться некоторое время.

+0

Спасибо, это действительно помогло. Кажется, что fail_rason предоставляет некоторую лучшую информацию. –