Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
бАКАЛАВР_РАБОТА.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.13 Mб
Скачать

4.1.3 Распознавание токенов

Анализ регулярных выражений осуществляется конечными детерминированными автоматами.

Регулярное выражение каждого токена можно представить в виде стилизованных блок-схем, именуемых диаграммами переходов. Диаграммы переходов содержит ряд узлов, именуемых состояниями. Каждое состояние представляет ситуацию, которая может возникнуть в процессе сканирования входного потока в поисках лексемы, соответствующей одному из нескольких шаблонов.Дугипредставляют собой направленные линии из одного состояния в другое. Каждая дуга помечена символом или множеством символов. Если мы находимся в некоторомсостоянии sи следующий входной символ – a, мы ищем дугу, исходящую из sи помеченную a. Эти диаграммы являются детерминированными, т.е. имеется не более одной дуги, выходящей из данного состояния с данным символом среди её меток. Различают конечное и стартовое состояния. Диаграмма всегда начинается со стартового(start) состояния и заканчивается в конечномсостоянии(out). Исключением являются ошибочные ситуации, в которых вызывается процедура восстановления после ошибки. Перед конечным состоянием происходит действие – возврат распознанного токена.

На рис. 4.1 приведена диаграмма состояний лексического анализатора, представляющая собой объединение диаграмм переходов для каждого токена в одну общую. Где otherдля состояния bозначает дополнение (отрицание) множестваисходящих дуг изсостоянияb, т.е. other(b)= {входной алфавит}\ {метки дуг исходящих из b}.

Рисунок 4.1 – Диаграммасостояний лексического анализатора

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

  1. Удаление входного символа из оставшегося входного потока

  2. Вставка пропущенного символа в оставшийся поток

На диаграмме переходов отображены процедуры восстановления после ошибки “error(…)”. В скобках этой процедуры указывается тип восстановления, всего существует пять возможных типов:

  1. inval_NE –некорректный символ “!=”(имя токена -NE ). Возникает при встрече одиночного символа “!”, т.к. он не соответствует ни одному токену, то необходимо сообщить о некорректности входного символа. В качестве действия по восстановлению после ошибки будет удаление этого символа из оставшегося входного потока;

  2. undef_sym – некорректный входной символ. В качестве действия по восстановлению после ошибки будет пропуск этого символаиз оставшегося входного потока;

  3. decim_point – отсутствие цифры после десятичной точки числа. В качестве действия по восстановлению после ошибки будет добавление нуляпосле десятичной точки;

  4. expon – отсутствие цифры после знака показателя степени“E” или “e.В качестве действия по восстановлению после ошибки будет добавление нуляпосле знака “e” или “E”;

  5. inval_suff– некорректный суффикс для чисел, состоящий из букв. В качестве действия по восстановлению после ошибки будет удаление всех букв, идущих после числа в оставшемся входном потоке.

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

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

Верхний предел времени выполнения алгоритмалексемной декомпозициилинейно зависит от длины входной цепочки символов|x|, т.е.выражается какO(|x|).