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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.