- •Введение
- •Формальные грамматики. Выводы Основные понятия
- •Способы задания языков
- •Операции над языками
- •Формальные грамматики. Выводы
- •Преобразования кс-грамматик Основные понятия
- •Устранение лишних символов
- •Исключение лишних правил
- •Исключение -правил
- •Устранение цепных правил
- •Выделение нетерминала
- •Левая факторизация
- •Устранение левой рекурсии
- •Устранение правой рекурсии
- •Нормальная форма Хомского
- •Нормальная форма Грейбах
- •Операторная кс-грамматика
- •Регулярные языки и конечные распознаватели Правосторонние грамматики
- •Левосторонние грамматики
- •Связь правосторонних и левосторонних грамматик
- •Преобразование кс-грамматики произвольного вида в правостороннюю
- •Конечные распознаватели. Основные понятия
- •Преобразование недетерминированных конечных распознавателей с -переходами в детерминированные
- •Эквивалентность состояний конечных детерминированных распознавателей
- •Эквивалентность конечных детерминированных распознавателей
- •Минимизация конечных детерминированных распознавателей
- •Регулярные множества и регулярные выражения
- •Регулярные выражения и конечные распознаватели
- •Получение регулярного выражения из конечного распознавателя
- •Построение конечного распознавателя по регулярному выражению
- •Конечные распознаватели и регулярные грамматики
- •Получение грамматики из конечного распознавателя
- •Построение конечных распознавателей по регулярным грамматикам
- •Ещё один способ взаимного преобразования право- и левосторонних грамматик
- •Программная реализация конечных детерминированных распознавателей
- •Лексический анализ
- •Принципы построения лексических анализаторов
- •Определение границ лексем
- •Выполнение действий, связанных с лексемами
- •Выделение ключевых слов
- •Программная реализация лексических анализаторов
- •Глава 3. Синтаксический анализ
- •3.1. Автомат с магазинной памятью
- •3.2. Таблично-управляемый предсказывающий разбор
- •3.2.1. Алгоритм разбора сверху-вниз
- •3.2.2. Множества first и follow
- •3.2.3. Конструирование таблиц предсказывающего анализатора
- •3.2.4. Ll(1)-грамматики
- •3.2.7. Рекурсивный спуск
- •3.3. Разбор снизу-вверх типа сдвиг-свертка
- •3.3.1. Основа
- •3.3.2. Lr(k)-анализаторы
- •3.3.4. Конфликты разбора типа сдвиг-свертка
Выполнение действий, связанных с лексемами
Лексический анализатор, в отличие от конечного распознавателя, не только распознаёт лексемы, но и выполняет ряд действий. Некоторые действия выполняются в процессе распознавания лексемы (при переходе из состояния в состояние), - другие после обнаружения лексемы (при достижении допускающего состояния). В процессе распознавания может формироваться сама лексема, значение константы, на переходах в допускающие состояния определяется тип лексемы. При обнаружении идентификатора лексический анализатор может проверять наличие найденной лексемы в таблице идентификаторов и, при необходимости, добавлять её в таблицу. Лексический анализатор при переходе в состояние ошибки может выдавать соответствующее сообщение и прекращать обработку исходного текста. После обнаружения лексемы лексический анализатор может помещать очередную лексему в таблицу лексем.
Выделение ключевых слов
Ключевые слова ( например 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 произошёл из какого нибудь другого состояния, то это означает, что выделен идентификатор.
