Диагностика ошибок в boost::spirit
От: Grigory Россия  
Дата: 05.03.06 15:21
Оценка:
Имеются в виду ошибки во входных данных.

info.stop.get_position() после вызова parse с невалидным буфером на ходится на начале самой верхней из вложенных рул. Хотелось бы получить позицию конкретного слова, вызвавшего неприятие.
Re: RTFM
От: MaximE Великобритания  
Дата: 06.03.06 06:33
Оценка:
On Sun, 05 Mar 2006 15:21:24 -0000, Grigory <10592@users.rsdn.ru> wrote:

> Имеются в виду ошибки во входных данных.

>
> info.stop.get_position() после вызова parse с невалидным буфером на ходится на начале самой верхней из вложенных рул. Хотелось бы получить позицию конкретного слова, вызвавшего неприятие.

http://boost.org/libs/spirit/doc/debugging.html

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: RTFM
От: Аноним  
Дата: 06.03.06 12:06
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>On Sun, 05 Mar 2006 15:21:24 -0000, Grigory <10592@users.rsdn.ru> wrote:


>> Имеются в виду ошибки во входных данных.

>>
>> info.stop.get_position() после вызова parse с невалидным буфером на ходится на начале самой верхней из вложенных рул. Хотелось бы получить позицию конкретного слова, вызвавшего неприятие.

ME>http://boost.org/libs/spirit/doc/debugging.html


Наверное, всё-таки, я не до конца точно выразился.
Мне НЕ НАДО ОТЛАЖИВАТЬ.
Мне надо вывести пользователю внятное сообщение об ошибке.
Re: Диагностика ошибок в boost::spirit
От: _Winnie Россия C++.freerun
Дата: 06.03.06 14:50
Оценка:
Здравствуйте, Grigory, Вы писали:

G>Имеются в виду ошибки во входных данных.


G>info.stop.get_position() после вызова parse с невалидным буфером на ходится на начале самой верхней из вложенных рул. Хотелось бы получить позицию конкретного слова, вызвавшего неприятие.


Можно попробовать сделать что-то вроде

    (TYPE >> (
        IDENTIFIER | 
        BRACE | 
        eps_p[error("жду скобку или идентификатор")])) | 
    CLASS_SPECIFIER | 
    EOF | 
    eps_p[error("жду функцию, переменную, класс или конец файла")]))


внутри функтора error — бросать исключение с описанием ошибки при вызове.
имхо, самое простое и понятное. Ну и eps_p[error("...")] можно для удобства сделать макросом.
к сожалению, используются исключения.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Диагностика ошибок в boost::spirit
От: Grigory Россия  
Дата: 06.03.06 16:24
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>Здравствуйте, Grigory, Вы писали:


G>>Имеются в виду ошибки во входных данных.


G>>info.stop.get_position() после вызова parse с невалидным буфером на ходится на начале самой верхней из вложенных рул. Хотелось бы получить позицию конкретного слова, вызвавшего неприятие.


_W>Можно попробовать сделать что-то вроде


_W>
_W>    (TYPE >> (
_W>        IDENTIFIER | 
_W>        BRACE | 
_W>        eps_p[error("жду скобку или идентификатор")])) | 
_W>    CLASS_SPECIFIER | 
_W>    EOF | 
_W>    eps_p[error("жду функцию, переменную, класс или конец файла")]))
_W>


_W>внутри функтора error — бросать исключение с описанием ошибки при вызове.

_W>имхо, самое простое и понятное. Ну и eps_p[error("...")] можно для удобства сделать макросом.
_W>к сожалению, используются исключения.
Исключения не проблема. Проблема — количество правил. Одних только терминальных символов 50.
Трудоёмко и код превратиться в кашу. Хотелось бы штатного средства.
Думал переехать с флекса и бизона на спирит, да, видно, не судьба.
Re[3]: Диагностика ошибок в boost::spirit
От: _Winnie Россия C++.freerun
Дата: 06.03.06 17:39
Оценка:
Здравствуйте, Grigory, Вы писали:

G>Здравствуйте, _Winnie, Вы писали:


_W>>Здравствуйте, Grigory, Вы писали:


G>>>Имеются в виду ошибки во входных данных.


G>>>info.stop.get_position() после вызова parse с невалидным буфером на ходится на начале самой верхней из вложенных рул. Хотелось бы получить позицию конкретного слова, вызвавшего неприятие.


_W>>Можно попробовать сделать что-то вроде


_W>>
_W>>    (TYPE >> (
_W>>        IDENTIFIER | 
_W>>        BRACE | 
_W>>        eps_p[error("жду скобку или идентификатор")])) | 
_W>>    CLASS_SPECIFIER | 
_W>>    EOF | 
_W>>    eps_p[error("жду функцию, переменную, класс или конец файла")]))
_W>>


_W>>внутри функтора error — бросать исключение с описанием ошибки при вызове.

_W>>имхо, самое простое и понятное. Ну и eps_p[error("...")] можно для удобства сделать макросом.
_W>>к сожалению, используются исключения.


G>Исключения не проблема. Проблема — количество правил. Одних только терминальных символов 50.

G>Трудоёмко и код превратиться в кашу. Хотелось бы штатного средства.
G>Думал переехать с флекса и бизона на спирит, да, видно, не судьба.

Ну а как ещё указывать, какая ошибка произошла, если не указать в грамматике её местонахождение? Ведь автоматически дать осмысленную дианостику при ошибке в правиле вроде (A >> C | B >> D) >> (X >> Y | Z >> T) невозможно?
Ну и если сделать макрос ERR, то синтаксического оверхеда на единицу осмысленных дейсвий будет вроде совсем немного.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[4]: Диагностика ошибок в boost::spirit
От: Grigory Россия  
Дата: 06.03.06 19:23
Оценка:
Здравствуйте, _Winnie, Вы писали:

[кусь]
_W>Ну а как ещё указывать, какая ошибка произошла, если не указать в грамматике её местонахождение? Ведь автоматически дать осмысленную дианостику при ошибке в правиле вроде (A >> C | B >> D) >> (X >> Y | Z >> T) невозможно?
Значит бизон умеет делать невозможные вещи?

_W>Ну и если сделать макрос ERR, то синтаксического оверхеда на единицу осмысленных дейсвий будет вроде совсем немного.

Сравни
"syntax error, unexpected ACTIONLISTON_TOK, expecting END_PART_TOK in D:\WINNT\inf\wmp.adm(73)"

и
"жду скобку или идентификатор"

А файл может быть несколько мегабайт...
Re[5]: Диагностика ошибок в boost::spirit
От: Sabrian  
Дата: 06.03.06 22:21
Оценка:
Боюсь никак. Да и трудно ожидать этого от LL парсера. Я и сам пытался получить от spirit'a внятные причины останова, но он упорно продолжал настаивать: ошибка где-то-там Вообще это конечно возможно, но потребует дикого изврата на экшенах и целой горы разных флагов, не стоит оно того. Да и не позиционируется spirit для создания парсеров чего-либо сложнее XML, это в первую очередь средство парсинга ВАЛИДНЫХ строк, причем жуткое время компиляции, и ооочень невысокая производительность пытаются намекнуть об обратном. Мне вообще непонятен смысл его существования, для простых вещей лучше справляется regex, для сложных — тот же бизон, позиция spirit'а мне не ясна — так ни рыба ни мясо.
Re[6]: Диагностика ошибок в boost::spirit
От: nau  
Дата: 07.03.06 00:48
Оценка:
Здравствуйте, Sabrian, Вы писали:

S>Мне вообще непонятен смысл его существования, для простых вещей лучше справляется regex, для сложных — тот же бизон, позиция spirit'а мне не ясна — так ни рыба ни мясо.


Он хорош в случаях динамического создания цепочек правил и динамической грамматики.
В теории практика не отличается от теории, но на практике — отличается
Re[7]: Диагностика ошибок в boost::spirit
От: srggal Украина  
Дата: 07.03.06 12:17
Оценка:
Здравствуйте, nau, Вы писали:

nau>Здравствуйте, Sabrian, Вы писали:


S>>Мне вообще непонятен смысл его существования, для простых вещей лучше справляется regex, для сложных — тот же бизон, позиция spirit'а мне не ясна — так ни рыба ни мясо.


nau>Он хорош в случаях динамического создания цепочек правил и динамической грамматики.

+1
Мои 5копеек:
Использование regexp, в случаях, когда с match нужно что-то ИМХО не очень удобно, спирит же, в свою очередь позволяет сразу задать соответсвующий action.

Как пример обдумайте (5 минут хватит) реализацию простого калькулятора с использованием regexp'ов, а потом гляньте, как это делается на спирите.

ИМХО спирит занимает свою нишу.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.