- •Содержание
- •1 Таблица идентификаторов
- •1.1 Исходные данные
- •1.2 Назначение таблиц идентификаторов
- •1.3 Метод цепочек
- •1.4 Метод рехеширования с псевдослучайным числом
- •1.5 Результаты
- •2 Проектирование лексического анализатора
- •2.1 Исходные данные
- •2.2 Принципы работы лексического анализатора
- •2.3 Схема распознавателя
- •2.4 Результаты
- •3 Построение дерева вывода
- •3.1 Исходные данные
- •3.2 Синтаксический анализатор
- •3.3 Результаты
1.4 Метод рехеширования с псевдослучайным числом
Для решения проблемы коллизии можно использовать метод рехэширования. Согласно этому методу, если для элемента А адрес п() = h(A), вычисленный с помощью хэш-функции h, указывает на уже занятую ячейку, то необходимо вычислить значение функции n1 = h1{A) и проверить занятость ячейки по адресу n1. Если и она занята, то вычисляется значение h2(A), и так до тех пор, пока либо не будет найдена свободная ячейка, либо очередное значение hi(A) не совпадет с h(A). В последнем случае считается, что таблица идентификаторов заполнена и места в ней больше нет — выдается информация об ошибке размещения идентификатора в таблице.
Поиск элемента А в таблице идентификаторов будет выполняться по следующему алгоритму:
Шаг 1. Вычислить значение хэш-функции п = h(A) для искомого элемента А.
Шаг 2. Если ячейка по адресу п пустая, то элемент не найден, алгоритм завершен, иначе необходимо сравнить имя элемента в ячейке п с именем искомого элемента А. Если они совпадают, то элемент найден и алгоритм завершен, иначе i := 1 и перейти к шагу 3.
Шаг 3. Вычислить пi = hi(A). Если ячейка по адресу ni пустая или п = пi, то элемент не найден и алгоритм завершен, иначе — сравнить имя элемента в ячейке пi с именем искомого элемента А. Если они совпадают, то элемент найден и алгоритм завершен, иначе i := i + 1 и повторить шаг 3.
Для наглядности на рисунке 3 изображена блок-схема поиска.
Для организации таблицы идентификаторов по методу рехэширования необходимо определить все хэш-функции hi для всех i. Чаще всего функции hi определяют как некоторые модификации хэш-функции h. В данной курсовой работе используется рехэширование с псевдослучайными числами по формуле hi(A) = (h(A) + pi) mod Nm., где pi – псевдослучайное число.
Рисунок 3 – Блок-схема алгоритма поиска по методу рехеширования с псевдослучайным числом.
1.5 Результаты
Для тестирования программы выбран исходный текстовый файл содержащий поряка 1000 строк.
В результате работы программы получены следующие данные:
– метод цепочек:
– всего сравнений: 690;
– в среднем сравнений: 3,63;
– метод рехеширования с псевдослучайным числом:
– всего сравнений: 639;
– в среднем сравнений: 3,36.
На основе полученных результатов можно сделать следующие выводы: при относительно небольшом количестве идентификаторов оба метода показывают примерно одинаковые результаты. В нашем случае при использовании 1068 идентификаторов среднее количество требуемых сравнений для метода цепочек оказалось на 0,27 сравнений больше, чем для метода рехеширования с псевдослучайным числом.
В то же время, наиболее эффективным и наиболее часто применяемым на практике является комбинированный метод со сбалансированным бинарным деревом. Именно он и будет в дальнейшем использован для хранения информации об идентификаторах в курсовой работе.
2 Проектирование лексического анализатора
2.1 Исходные данные
Для выполнения данной части курсовой работы требуется написать программу, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов и значений. Текст на входном языке задается в виде символьного (текстового) файла. Программа должна выдавать сообщения о наличие во входном тексте ошибок, которые могут быть обнаружены на этапе лексического анализа.
Программа должна допускать наличие комментариев неограниченной длины во входном файле.