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

Выполнение действий, связанных с лексемами

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

Выделение ключевых слов

Ключевые слова ( например begin, end, if, then, else ) обычно удовлетворяют правилам образования идентификаторов. Если ключевые слова зарезервированы, т.е. не могут использоваться в качестве идентификаторов, то распознать ключевое слово можно после распознавания идентификатора. Рассмотрим два способа распознавания ключевых слов после распознавания идентификатора.

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

2 способ. Множество ключевых слов представляет собой регулярный язык, который может быть распознан конечным распознавателем. Конечный распознаватель ключевых слов begin, end, if, then, else представлен ниже.

e g i

n

b h e

t n

i f

e

d

n

l e

s

На вход конечного распознавателя поступает выделенный идентификатор и, если он допускается, то он представляет собой ключевое слово.

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

б

*

ц

e g i

n

h e

b t n

i f

e

n d

l e

s

В этом распознавателе состояние 1 – начальное, состояние 16 – допускающее. Из каждого состояния, участвующего в распознавании ключевых слов, возможен переход в состояние 2 – промежуточное состояние распознавания идентификатора, не являющегося ключевым словом. Условия, при которых выполняются эти переходы, сведены в следующей таблице:

Текущее

состояние

Состояние

перехода

Условие перехода

1

2

буква, за исключением b, t, i, e

3

2

буква, за исключением e , или цифра

4

2

буква, за исключением g , или цифра

5

2

буква, за исключением i , или цифра

6

2

буква, за исключением n , или цифра

7

2

буква, за исключением h , или цифра

8

2

буква, за исключением e , или цифра

9

2

буква, за исключением n , или цифра

10

2

буква, за исключением f , или цифра

11

2

буква, за исключением n и l , или цифра

12

2

буква, за исключением d , или цифра

13

2

буква, за исключением s , или цифра

14

2

буква, за исключением e , или цифра

15

2

буква или цифра

Переходы в состояние 16 из состояний 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 выполняются в том случае, если обрабатываемый символ не буква и не цифра. Этот символ является границей ключевого слова или идентификатора, он может быть лексемой или началом очередной лексемы, поэтому состояние 16 отмечено звёздочкой. Если переход в состояние 16 произошёл из состояния 15, то это означает, что выделено ключевое слово, какое именно, можно определить по переходу в состояние 15. Если же переход в состояние 16 произошёл из какого нибудь другого состояния, то это означает, что выделен идентификатор.

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