Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

1.6 Обнаружение ошибок и сообщение о них

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

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

При синтаксическом анализе выявля­ются ошибки, при которых поток нарушает структурные правила (синтаксис) языка.

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

1.7 Фазы анализа

В процессе трансляции изменяется внутреннее представление исходной программы. Для примера рассмотрим инструкцию.

pos := i + r * 60 (1)

На рис. 2 показано внутреннее представление инструкции после каждой фазы.

При лексическом анализе символы исходной программы считываются и группируют­ся в поток лексем, в котором каждая лексема представляет логически связанную последо­вательность символов — идентификатор, ключевое слово (if, while и т.п.), символ пунктуации или многосимвольный оператор типа :=. Последовательность символов, формирующая слово образует лексему.

Некоторые лексемы дополняются "лексическим значением". Например, когда найден идентификатор r, лексический анализатор не только генерирует лексему id, но и вносит лексему r в таблицу символов, если ее там нет. Лексическое значение, свя­занное с этим появлением лексемы id, указывает на запись r в таблице символов.

Инструкция (1) после лекси­ческого анализа выглядит так:

id1 = id2 + id3 * 60 (2)

Рис. 2. Трансляция инструкции

При синтаксическом анализе на поток лексем налагается ие­рархическая структура, которую можно изобразить с помощью синтаксического дере­ва, приведенного на рис. 3(а). Типичная структура данных для такого дерева показа­на на рис. 3(6). Ее внутренний узел представляет собой запись с полем для оператора и двумя полями с указателями на дочерние записи. Лист представляет собой запись с двумя или более полями. Дополнительная информация о языковых конструкциях может содержаться в дополнительных полях записей для узлов.

a) б)

Рис. 3. Структура данных (б) для дерева (а)

Вопросы

  1. Постройте структуры и проанализируйте следующие примеры двусмысленных предложений русского языка:

«Я мечтаю жить в Париже, как мой отец.» (мечтаю, как отец, или жить в Париже, как отец?);

«Вывешены списки студентов, которые находились в деканате.» (списки или студенты находились в деканате?);

«Мать велела сыну налить воды себе.» (кому налить воды, сыну или матери?).

  1. Что такое синтаксис и семантика языка?

  2. В чем отличие компилятора от транслятора?

  3. От чего зависит количество проходов выполняемых компилятором?

  4. Почему компилятор языка Си работает дольше, чем компилятор языка Паскаль?