Comments 14
Эти книги можно сказать где-то?
спасибо за статью, возникла маленькая проблемка: не выводятся сообщения об ошибках в консоль (хотя код метода Main и хэдэра грамматики скопипастен).
т.е. ошибки есть 100% (смотрю на их количество), но эксэпшны не выходят за пределы сгенеренного класса. может, надо как-то дополнительно настроить сгенеренный парсер, или грамматику?
т.е. ошибки есть 100% (смотрю на их количество), но эксэпшны не выходят за пределы сгенеренного класса. может, надо как-то дополнительно настроить сгенеренный парсер, или грамматику?
Да. Вы правы. Надо дополнительно дописать в файл грамматики (*.g) следующий код:
Делатльно его дописать сразу после раздела «options».
@rulecatch
{
catch (RecognitionException e)
{
// Здесь Вы можете обработать исключение
throw e;
}
}
Делатльно его дописать сразу после раздела «options».
спасибо за ответ, но все равно не получилось так, как в Вашем примере. что-то здесь темно все :)
после добавления в грамматику "@rulecatch" действительно стали приходить исключения, но:
1) в них не содержалось почти никакой полезной информации об ошибке
2) уж никак после обработки этих исключений парсер не смог бы подняться и продолжить свое священное дело.
я понимаю, что вопросы по большому счету глупые, и при должном упорстве можно было бы и самостоятельно разобраться, но приведенный пример так и не заработал «из коробки». заранее спасибо
после добавления в грамматику "@rulecatch" действительно стали приходить исключения, но:
1) в них не содержалось почти никакой полезной информации об ошибке
2) уж никак после обработки этих исключений парсер не смог бы подняться и продолжить свое священное дело.
я понимаю, что вопросы по большому счету глупые, и при должном упорстве можно было бы и самостоятельно разобраться, но приведенный пример так и не заработал «из коробки». заранее спасибо
Вы на C# делаете?
да, на C#. после написания моего комментария выше пришла в голову мысль, что в принципе в обработчике исключений как раз и пишется код, который вывел бы строку, какую потом видно будет в консоли. Потом, видимо, в том же блоке catch нужно убрать строку «throw e;», чтобы парсер попытался бы продолжить свою работу. Но мне все равно показалось, что в исключении недостаточно данных для отображения соответствующего сообщения.
Если Вам интересно, то могу скинуть весь проект целиком. Ибо у меня работает и без @rulecatch
спасибо, я уже частично разобрался. надо переопределить метод ReportError в парсере, описав в нем логику вывода сообщения, и не пользоваться @rulecatch.
Странно. Я никогда этого не делал. У вас 3я версия ANTLR?
ANTLR версии 3.4, но я (не знаю зачем) использую CSharp3, а не 2
Хм. Может быть в этом и проблема. Попробуйте поменять.
ничего не поменялось, так а что должно было поменяться? если в Вашем коде срабатывает обработчик catch в методе Main, то, очевидно, парсер не будет продолжать свою работу. тем более, как мне кажется, со стороны разработчиков ANTLR было бы нелогично вставлять код вывода каких-либо сообщений на консоль из самого парсера, т.к. сгенеренный код может использоваться где угодно. почти не остается сомнений, что вывод сообщения на консоль именно в таком формате — дело рук не сгенеренного системой ANTLR кода, и тем более не блока catch в методе Main. я намекаю на то, что все-таки не было сказано о дополнительной логике вывода сообщений, а ее не может не быть в представленном проекте.
если Вам не сложно, скиньте мне пожалуйста этот проект, я потом отпишусь о результатах своего расследования :)
если Вам не сложно, скиньте мне пожалуйста этот проект, я потом отпишусь о результатах своего расследования :)
Sign up to leave a comment.
Грамматика арифметики или пишем калькулятор на ANTLR