Здравствуйте, 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, то синтаксического оверхеда на единицу осмысленных дейсвий будет вроде совсем немного.