Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TYaP_posobie.doc
Скачиваний:
0
Добавлен:
03.01.2020
Размер:
951.3 Кб
Скачать

Лексический анализ

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

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

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

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

Лексема – это структурная единица языка, которая состоит из символов алфавита и не содержит в себе других структурных единиц языка. Лексемами языков программирования являются цепочки символов, представляющие собой идентификаторы, константы, ключевые слова, знаки операций и т.д. Каждая лексема имеет тип и, возможно, значение, позволяющее отличить её от лексем этого же типа. Идентификатор, константа, различные ключевые слова, знаки операций – это типы лексем. Типы лексем можно закодировать, например, натуральными числами. Значением лексемы типа идентификатор может быть, например, ссылка на соответствующий элемент таблицы идентификаторов, которая хранит основные характеристики лексемы, например: для переменной – имя переменной, её тип, область памяти; для константы – название константы, её значение и тип; для функции – имя функции, количество и типы формальных параметров, тип возвращаемого значения, адрес кода функции. Лексический анализатор, выделяя лексему, может формировать таблицы идентификаторов, но не все характеристики могут быть определены на этапе лексического анализа, например, тип переменной может быть определён на этапе синтаксического анализа, а область памяти – на этапе генерации кода.

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

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

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

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