Операционная система UNIX. Руководство программиста


         

ОБРАБОТКА ОШИБОК


Обработка ошибок - это чрезвычайно сложная область; многие связанные с ней проблемы являются семантическими. Когда ошибка найдена, может потребоваться, например, очистить память, в которой хранилось дерево разбора, удалить или изменить содержимое таблицы символов и (или), чаще всего, установить переключатели, препятствующие дальнейшему формированию выходных данных.

Далеко не всегда приемлемо при обнаружении ошибки вообще прекратить обработку. Полезнее продолжить сканирование исходного текста для того, чтобы обнаружить и другие синтаксические ошибки. При этом возникает проблема нейтрализации ошибки и возобновления разбора. Широкий класс алгоритмов нейтрализации достигает цели, пропуская несколько лексем во входной цепочке и пытаясь найти состояние, в котором можно возобновить разбор исходного текста.

Чтобы позволить пользователю как-то управлять данным процессом, в yacc'е зарезервирована лексема с именем error. Это имя можно использовать в грамматических правилах. Оно используется для указания мест, где ожидаются ошибки и может потребоваться их нейтрализация. Алгоритм разбора очищает стек, пока не окажется в состоянии, в котором допустима лексема error. Затем он поступает так, будто лексема error является текущей предварительно просмотренной, и выполняет действие, оказавшееся текущим. Предварительно просмотренная лексема затем устанавливается равной лексеме, которая вызвала ошибку. Если специальных "ошибочных" правил не задано, после того, как ошибка обнаружена, обработка прекращается.

Чтобы предотвратить каскад сообщений об ошибках, алгоритм разбора после их обнаружения остается в некорректном состоянии, пока успешно не прочитаны и не обработаны три лексемы. Если ошибка обнаруживается, когда разбор уже находится в некорректном состоянии, сообщение не выдается, и входная лексема молча отбрасывается.

Например, правило вида

stat : error

означает, что при синтаксической ошибке алгоритм разбора пытается перескочить оператор, в котором встретилась ошибка. Более точно, алгоритм продолжает сканирование, обнаруживает, что три лексемы за оператором могут оказаться допустимыми, и начинает обработку с первой из них. Если начало операторов недостаточно отчетливо выделяется, алгоритм может по ошибке стартовать с середины оператора и закончиться обнаружением второй ошибки, на самом деле не существовавшей.




Содержание  Назад  Вперед