Пред.Страница След.Страница  Раздел Содержание

6.6. Удаление вспомогательных символов, комментариев и обработка ошибок.

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

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

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

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

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

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

 

 

Таблица 6.3.            Сообщения об ошибках

 

Состояние

Сообщение об ошибке

A

Недопустимый символ после идентификатора

B

Недопустимый символ после числа

C

Неверный составной разделитель

D

Неверный составной разделитель

E

Недопустимый символ после составного разделителя

F

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

I

Недопустимый входной символ

 

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

 

while(true) {

sym = nextchar(); //Чтение очередного символа из входного потока.

if(sym == ‘ ‘ || sym == ‘\t’); //Удаление пробелов и символов табуляции.

else if(sym == ‘\n) line number++;

switch(sym){

//Обработка символа.

}

}

 

Пред.Страница След.Страница  Раздел Содержание