Вы должны разработать свою грамматику с учетом контрольных точек. Под контрольными точками я подразумеваю точку с запятой для C, разрыв строки для Python или точку для COBOL (в качестве примеров). Эта контрольная точка определяет, сколько компиляторов восстанавливается, чтобы они могли сообщать больше, чем просто о первой найденной ошибке.
Я не использовал Bison, но YACC позволяет вам переопределить обработку ошибок, и я надеюсь, что эквивалентный инструмент GNU был бы по крайней мере таким же мощным, как наши старые UNIX-кланкеры.
Я делал это раньше с помощью файла конфигурации грамматики YACC. Допустим, у вас есть следующий правильно сформированный сегмент:
item = "bread" {
quantity = 7
price = 1.50
taxrate = 10
}
и по какой-то странной причине пользователь неверно произносит «количество», делая его неверным. В этот момент в ваших обратных вызовах вы можете просто поднять флаг ошибки, который будет препятствовать дальнейшей обработке, пока контрольная точка не будет достигнута. Вы позволяете анализатору продолжать работу (перехватывать и игнорировать дальнейшие ошибки) и следить за тем, чтобы ваши обратные вызовы ничего не делали в ответ на любые ложные успехи в поврежденном синтаксисе.
Это может быть простым игнорированием всех последующих строф вплоть до закрывающей скобки или даже установкой значения по умолчанию для цены и игнорированием только до разрыва строки (так что вы по крайней мере получите частично сформированный объект).
Как бы вы ни делали, просто сбросьте флаг ошибки, когда доберетесь до контрольной точки, чтобы продолжить обработку.
Я бы по-прежнему следил за тем, чтобы пользователь был уведомлен, иногда считается плохой формой продолжать работу с данными, которые клиент не хотел: -).