Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora1_Kalabin.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
755.2 Кб
Скачать
  1. Восстановление при синтаксических ошибках.

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

Для продолжения работы, можно: 1. сделать какие-то предположения о том, что на самом деле имел в виду

автор неправильной программы; 2. пропустить некоторую часть входной последовательности; 3. попытаться восстановить текст и при неудаче пропустить часть последовательности.

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

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

По построению программы грамматического разбора. При появлении неправильной конструкции процедура должна пропустить входной текст, пока не встретится символ, который по правилам может следовать за той конструкцией языка, которую она пыталась обнаружить. Это означает, что каждой процедуре грамматического разбора в момент ее текущей активации должно быть известно множество внешних символов (следующих за разбираемой конструкцией). В конце каждой процедуры вставляется явная проверка: действительно ли следующий символ входного текста содержится

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

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

Данная функция имеет три параметра: Множество s1 допустимых следующих символов; если текущий символ к нему не принадлежит, то имеет место ошибка. Множество s2 дополнительных символов возобновления, появление которых определенно является ошибкой, но которые ни в коем случае нельзя пропускать.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]