
- •Московский автомобильно-дорожный государственный технический университет (мади)
- •I.Формальные языки и грамматики
- •I.1. Цепочки символов
- •I.2. Операции над цепочками символов
- •I.3. Понятие языка
- •I.4. Способы задания языка
- •I.5. Синтаксис и семантика языка
- •I.6. Определение грамматики
- •I.7. Пример грамматики
- •I.8. Принцип рекурсии в правилах грамматики
- •I.9. Способы задания грамматик
- •I.9.1. Использование метасимволов
- •I.9.2. Запись правил грамматики в графическом виде
- •I.10. Распознаватель
- •I.10.1. Схема распознавателя
- •I.10.2. Задача разбора
- •I.11. Классификация грамматик
- •I.12. Классификация языков
- •I.13. Примеры классификаций языков и грамматик
- •I.14. Цепочки вывода
- •I.14.1. Понятие о выводе
- •I.14.2. Сентенциальная форма грамматики
- •I.14.3. Левосторонние и правосторонние выводы
- •I.14.4. Дерево вывода и методы его построения
- •I.15. Однозначности и эквивалентности грамматик
- •I.15.1. Однозначные и неоднозначные грамматики
- •I.15.2. Проверка однозначной и эквивалентной грамматик
- •I.15.3. Правила, задающие неоднозначность в грамматиках
- •II. Принципы построения трансляторов
- •II.1. Определения транслятора
- •II.2. Определение компилятора
- •II.3. Определения интерпретатора
- •II.4. Этапы трансляции
- •II.5. Фазы компиляции
- •II.6. Ти ( таблицы идентификаторов)
- •II.6.1. Назначение и особенности построения
- •II.6.2. Простейшие методы
- •II.6.3. Построение ти по методу бинарного дерева
- •II.6.5. Выбор Хэш-функции при построении ти
- •II.6.7. Построение ти по методу цепочек
- •II.7. Лексические анализаторы
- •II.7.1. Назначение ла
- •II.7.2. Определение границ лексем
- •II.7.3. Выполнение действий, связанных с лексемами
- •II.7.4. Применение конечных автоматов (ка) для построения ла
- •II.7.5. Алгоритм построения ка
- •II.7.6. Пример применения ка для построения ла
- •II.8. Принципы построения синтаксических анализаторов (са)
- •II.8.1. Значение са
- •II.8.2. Автоматы с магазинной памятью
- •II.9. Принципы построения семантического анализатора (с-а)
- •II.9.1. Назначение с-а
- •II.9.2. Проверка соблюдения во входной программе семантических соглашений
- •II.9.3. Дополнение внутреннего представления программы
- •II.9.4. Проверка смысловых норм языка программирования
- •II.10. Принципы генерации кода
- •II.11. Оптимизация кода
II.6.7. Построение ти по методу цепочек
Объем неиспользуемой памяти будет тем выше, чем больше информации хранится для каждого идентификатора. Этого недостатка можно избежать, если дополнить ТИ некоторой промежуточной хэш-таблицей. В ее ячейках храниться либо пустое значение, либо значение указателя на некоторую область памяти из основной ТИ. Тогда хэш-функция вычисляет адрес, по которому происходит обращение сначала к хэш-таблице, а потом через нее по найденному адресу — к самой ТИ. Если соответствующая ячейка ТИ пуста, то ячейка хэш-таблицы будет содержать пустое значение. Тогда вовсе не обязательно иметь в самой ТИ ячейку для каждого возможного значения хэш-функции, поэтому таблицу можно сделать динамической так, чтобы ее объем рос по мере заполнения. Такой подход позволяет получить 2 результа: во-первых, нет необходимости заполнять пустыми значениями ТИ — это можно сделать только для хэш-таблицы; во-вторых, каждому идентификатору будет соответствовать строго определенная ячейка в ТИ, т.е. в ней не будет пустых неиспользуемых ячеек. Пустые ячейки будут только в хэш-таблице, и объем неиспользуемой памяти не будет зависеть от объема информации, хранимой для каждого идентификатора. На основе такой схемы можно организовать ТИ с помощью хэш-функции .Метод называется метод цепочек. При этом методе для каждого элемента ТИ добавляется еще одно поле, в котором содержится ссылка на любой элемент таблицы. Первоначально это поле всегда пустое. Также необходимо иметь одну переменную, которая всегда указывает на свободную ячейку в ТИ. Первоначально она показывает на начало таблицы. При записи элементов в ТИ и их чтении используют соответствующий алгоритм.
На рисунке дано заполнение ТИ для примера, который уже был рассмотрен с использованием метода простейшего рехэширования
После размещения в таблице для поиска идентификатора A1 потребуется 1 сравнение, для А2 — 2 сравнения, для А3 — 1 сравнение, для А4 — 1 сравнение и для А5 — 3 сравнения.
Метод цепочек является очень эффективным средством организации ТИ. Среднее время размещения одного элемента и на поиск его в таблице зависит только от среднего числа коллизий, возникающих при вычислении хэш-функции. Метод экономно использует память, но требует организации работы с динамическими массивами данных
II.7. Лексические анализаторы
II.7.1. Назначение ла
Лексема (лексическая единица языка) — это структурная единица языка, которая состоит из элементарных символов языка и не содержит в своем составе других структурных единиц языка.
Лексемами языков программирования являются идентификаторы, константы, ключевые слова языка, знаки операций и др. Состав возможных лексем для каждого конкретного языка является синтаксисом этого языка.
Лексический анализатор (или сканер ) — это часть компилятора, которая читает исходную программу и выделяет в ее тексте лексемы входного языка. Выходная информация передается для дальнейшей обработки компилятора. Есть причины, по которым в состав всех компиляторов включают ЛА.
1)Упрощается работа с текстом исходной программы на этапе синтаксического разбора. Сокращается объем обработанной информации, т.к. ЛА структурирует на поступ. на вход исходного текста программы и отбрасывает всю незначащую информацию.
2)Для выделения в тексте и разбора лексем можно применять простую эффективную и теоретически хорошо проработанную технику анализа, в то время, как на этапе СА конструкция исходного языка использует сложные алгоритмы разбора.
3)ЛА отделяет сложный по конструкции СА от работы с текстом исходной программы, структура которого может изменяться от версии входного языка.
При такой конструкции компилятора для перехода одной версии к другой нужно только перестроить простой ЛА.
ЛА исключает из текста исходной программы комментарии, незначащие пробелы, символы табуляции и перевода строки, а выделяет лексемы следующих типов: идентификаторы, строковый символьные числовые константы, ключевые служебные слова, знаки операций и разделителей. Результат работы ЛА – это перечень всех найденных в тексте исходной программы лексем, с учетом характеристик каждой лексемы. Этот перечень выполняется в виде таблиц, назыв. табл. лексем, в которой каждой лексеме соответствует уникальный условный код, зависящий от ее типа и дополнительной служебной информации. Кроме того, информация о некоторых лексемах, найденных в исходной программе, должна помещаться в ТИ. Таблица лексем (ТЛ) содержит весь текст исходной программы, обработанный ЛА. В нее входят все возможные типы лексем. Кроме того, любая лексема может встречаться в ней любое количество раз. ТИ содержит только определенные типы лексем. Это идентификаторы и константы. В нее не попадают такие лексемы, как ключевые служебные слова входного языка, знаки операций и разделители. Кроме того, каждая лексема может встречаться в ТИ только 1 раз. Лексемы в ТЛ обязательно располагаются в том же порядке, как в исходной программе, а в ТИ они располагаются в любом порядке, так, чтобы обеспечить удобство поиска.