Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

247

Здесь пропущена закрывающая скобка. Это не обнаружится до тех пор,

пока не встретится fi. Однако неясно, где должна стоять эта скобка: после r,

после q, после p или 2. Выяснить, что предполагал программист, невозможно.

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

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

9.4 СИНТАКСИЧЕСКИЕ ОШИБКИ

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Термин «синтаксическая ошибка» употребляется для обозначения ошибки, обнаруживаемой контекстно-свободным синтаксическим анализатором.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Современные анализаторы обладают этим важным свойством – обна-

руживать синтаксически неправильную программу на первом недопустимом символе, т.е. они могут генерировать сообщения при чтении символа, кото-

рый не должен следовать за прочитанной к тому времени последовательно-

стью символов [2].

Ошибка в виде пропуска или неправильного употребления, допущен-

ная на более раннем этапе, может проявиться совсем в другом месте про-

граммы.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Это можно проиллюстрировать следующим примером. while x > y; begin <something> end.

248

Никакого сообщения об ошибке при встрече «;» на данной стадии син-

таксический анализатор не выдаст. Последствия ее могут появиться на более поздней фазе анализа.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

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

кие-либо символы, включить какие-либо символы или изменить их. Суще-

ствует ряд стратегий исправления ошибок. Практически все они хорошо сра-

батывают в одних случаях и плохо – в других. «Хорошая» стратегия заклю-

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

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

9.4.1 МЕТОДЫ ИСПРАВЛЕНИЯ СИНТАКСИЧЕСКИХ ОШИБОК

Режим переполоха. Один из наиболее распространенных методов ис-

правления синтаксических ошибок носит название «режим переполоха».

При появлении недопустимого символа весь последующий исходный текст, вплоть до соответствующего ограничителя (например, «;» или end),

игнорируется. Ограничитель заканчивает какую-то конструкцию языка, и

элементы удаляются из стека разбора до тех пор, пока не встретится адрес возврата. Этот элемент тоже удаляется из стека, а разбор продолжается,

начиная с адреса в таблице разбора, содержащего следующий входной сим-

вол. Такой метод довольно легко реализуется, но имеет серьезный недоста-

ток: длинные последовательности кода, соответствующие игнорируемым символам, не анализируются.

Исключение символов. Метод исключения символов также легко реа-

лизуется и не требует изменения степени разбора. Когда считывается недо-

пустимый символ, и он сам, и все последующие символы исключаются из

249

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

дельных случаях он весьма эффективен.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Например, в записи

c := d+3; end,

где символ «;» является недопустимым, исправление ошибки – идеальное.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Однако исключение скобок обычно разрушает блочную структуру и приводит к дальнейшим синтаксическим ошибкам.

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

становки одного из таких символов перед недопустимым символом, который вызвал ошибку.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Например, последовательность

end begin

никогда не будет допустимой. Однако включение «;» между end begin позво-

лит анализатору продолжить работу.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Конечно, в таких ситуациях может иметь место неправильная подста-

новка, даже если анализатор продолжит работу.

Правила для ошибок. Один из способов исправления некоторых ти-

пов синтаксических ошибок заключается в расширении синтаксиса языка за

250

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

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

допустимым и не потребует никаких исправлений.

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Так, можно обращаться, например, с ошибками типа «;» перед end или пропуск «;».

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Дополнительные правила, включенные в грамматику, обычно называ-

ются правилами для ошибок. Они неизбежно приводят к увеличению грамма-

тики, и поэтому включать их следует только для наиболее часто встречаю-

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

9.4.2 ПРЕДУПРЕЖДЕНИЯ

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Наряду с сообщениями о синтаксических ошибках, анали-

затор может выдавать предупреждения, когда ему встрети-

лась допустимая, но маловероятная последовательность симво-

лов.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

Пример маловероятной последовательности символов:

;do

·· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·