Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по 2 RKG с нета / ТВПС / Ответы на экзамен (ТВПС).doc
Скачиваний:
37
Добавлен:
13.02.2016
Размер:
912.9 Кб
Скачать

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

Входом компилятора, а, следовательно, и лексического анализатора, служит цепочка символов некоторого алфавита.

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

Лексема – цепочка терминальных символов, с которой мы связываем лексическую структуру, состоящую из пары вида (тип лексемы, некоторые данные). Первой компонентой пары является синтаксическая категория, такая как «константа» или «идентификатор», а второй указатель: в ней указывается адрес ячейки, хранящей информацию о конкретной лексеме. Для данного языка число типов лексем считается конечным.

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

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

Этот выход образует вход синтаксического анализатора.

Пример.

Оператор Фортрана

COST=(PRICE+TAX)*0.98.

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

  • COST, PRICE и TAX – лексемы типа <идентификатор>;

  • 0.98 – лексема типа <константа>;

  • =, +, * - сами являются лексемами.

Пусть все константы и идентификаторы можно отображать в лексемы типа <идентификатор>. Предполагаем, что вторая компонента лексемы представляет собой указатель элемента таблицы, содержащей фактическое имя идентификатора вместе с другими данными об этом конкретном идентификаторе.

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

Вторая компонента используется на этапе генерации кода для изготовления объектного модуля.

Таким образом, выходом лексического анализатора будет последовательность лексем

<ИД1>=(<ИД2>+<ИД3>)*<ИД4>.

Вторая часть компоненты лексемы (указатель) – показана в виде индексов. Символы = + * трактуются как лексемы, тип которых представляется ими самими. Они не имеют связанных с ними данных и, следовательно, не имеют указателей.

Лексический анализ легко проводить, если лексемы, состоящие более чем из одного знака, изолированы с помощью знаков, которые сами являются лексемами (*, +, =).

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

Рассмотрим два правильных предложения Фортрана:

  1. DO 10 I=1.15;

  2. DO 10 I=1,15.

В операторе 1) цепочка DO 10 I – переменная, а цепочка 1.15 – константа.

В операторе 2) DO – ключевое слово, 10 – константа, I – переменная, 1 и 15 константы, т.е. операция «найти очередную лексему» закончится лишь тогда, когда анализатор дойдет до DO или DO 10 I. Таким образом лексических анализатор должен заглядывать вперед за интересующую его в данный момент лексему.

Другие языки, например PL/1, вообще требуют заглядывать при лексическом анализе вперед сколь угодно далеко.

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

Существует два крайних подхода к лексическому анализу.

  • Лексический анализатор работает прямо, если для данного входного текста (цепочки) и положения указателя в этом тексте анализатор определяет лексему, расположенную непосредственно справа от указанного места и сдвигает указатель вправо от части текста образующего лексему.

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