Главная страница проекта ИНФОРМАТИКА-21

Наука Школе

Как компилятор сообщает об ошибках

Вот что получается, если попытаться скомпилировать командой Ctrl+K простой модуль с синтаксическими ошибками (правое окошко):

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

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

Устраняйте самую первую ошибку — и сразу компилируйте снова, нажимая Ctrl+K (см. заповеди.)

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

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

Чтобы все-таки посмотреть, что за ошибки нашел компилятор в остальных случаях, достаточно кликнуть (один раз) мышкой по любому черному квадрату: в левой части статусной полоски возникнет соответствующее сообщение. Вот пять этих сообщений для пяти ошибок, показанных на картинке (в квадратных скобках — пояснения):

  1. повторно объявленный идентификатор [Смысл этого сообщения уже обсуждался выше.]
  2. необъявленный идентификатор [Ключевые слова должны целиком писаться заглавными буквами; здесь явно имелось в виду INTEGER.]
  3. пропущена ";" [Этот END закрывает оператор IF. Обычно после каждого оператора стоит точка с запятой, а опустить ее можно только в том случае, если дальше следует другое END.]
  4. идентификатор не обозначает тип записей [Пример, когда компилятор "сбился": в начале конструкции подразумевался идентификатор StdLog с заглавной L, обозначающий импортируемый модуль (см. оператор IMPORT в начале модуля), а вся конструкция StdLog.Real должна была обозначать вызов процедуры Real, содержащейся в этом модуле. Но компилятор воспринял конструкцию как левую часть присваивания полю Real переменной-записи Stdreal, что синтаксически выглядит так же. Поскольку Stdreal не была объявлена как запись, то и полей у нее быть не может. В подобных случаях (их в Компонентном Паскале немного) для каждого сообщения компилятора полезно было бы иметь список типичных ошибок, способных породить данное сообщение. Пока, к сожалению, такого списка не составлено.]

  5. ожидается идентификатор [В Компонентном Паскале/Обероне после END, закрывающего тело процедуры, должно быть повторено ее имя.]

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

Видно, что после вставки точки запятой (ошибка 3 в первоначальном списке), компилятор точнее интерпретирует данную ошибку (зато он перестал видеть пятую ошибку из списка). Исправляя Stdlog на StdLog и компилируя, получаем:

Компилятор снова увидел ошибку 5 из списка. Остается ее исправить (достаточно скопировать в это место имя процедуры) и нажать Ctrl+K:

В рабочем журнале теперь нет сообщения о найденных ошибках — зато указан размер получившегося машинного кода (64 байта; второе число — 0 — относится к глобальным переменным модуля, объявляемым до всех процедур модуля; таких переменных в данном примере нет).

Главная страница проекта ИНФОРМАТИКА-21

Наука Школе