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

Вопрос 34 ЛекАнализ программы

Определение 4.6. Лексический анализ (ЛА) – это первый этап процесса компиляции, на котором символы, составляющие исходную программу, группируются в отдельные минимальные единицы текста, несущие смысловую нагрузку – лексемы.

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

1) замена идентификаторов, констант, ограничителей и служебных слов лексемами делает программу более удобной для дальнейшей обработки;

2) ЛА уменьшает длину программы, устраняя из ее исходного представления несущественные пробелы и комментарии;

3) если будет изменена кодировка в исходном представлении программы, то это отразится только на ЛА.

В процедурных языках лексемы обычно делятся на классы:

  1. служебные слова;

  2. ограничители;

  3. числа;

  4. идентификаторы.

Каждую лексему можно представить парой чисел вида (n, k), где n – номер таблицы лексем, k - номер лексемы в таблице. Тогда входными данными ЛА будет текст транслируемой программы на входном языке, а выходными - последовательность лексем в числовом представлении.

Таблицы идентификаторов и чисел формируются в ходе лексического анализа.

лексема

x

0

>

13

!F

x

x

8

+

номер

1

2

3

4

5

6

7

8

9

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

Выделяются методы непрямого и прямого лексического анализа.

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

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

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

Обычно лексический анализатор строится в два этапа:

1) построение конечного автомата с действиями для распознавания и формирования внутреннего представления лексем;

2) написание по конечному автомату с действиями функции сканирования текста исходной программы.

Рассмотрим реализацию данной методики на примере ЛА для числовых констант.