Проектирование лексического анализатора



Содержание

 

Введение......................................................................................................... 2
1. Организация таблицы идентификаторов................................................. 3
1.1. Исходные данные................................................................................. 3
1.2. Назначение таблиц идентификаторов............................................... 3
1.3. Метод простого рехэширования........................................................ 5
1.4. Метод цепочек..................................................................................... 7
 1.5. Результаты............................................................................................ 9
2. Проектирование лексического анализатора............................................ 11
2.1. Исходные данные................................................................................. 11
2.2. Принципы работы лексического анализатора.................................. 12
2.3. Схема распознавателя......................................................................... 13
2.4. Результаты............................................................................................ 14
3. Проектирование синтаксического анализатора...................................... 16
3.1. Исходные данные................................................................................. 16
3.2. Построение синтаксического анализатора........................................ 16
3.3. Результаты............................................................................................ 20
Заключение..................................................................................................... 22
Список использованной литературы........................................................... 23
Приложение А - Исходный текст программы............................................ 24
Приложение Б - Граф состояний лексического анализатора.................... 34
Приложение В - Матрица операторного предшествования...................... 36



Введение

 

Компилятор – программный модуль, задачей которого является перевод программы, написанной на одном из языков программирования (исходный язык) в программу на языке ассемблера или языке машинных команд.

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

Курсовая работа заключается в реализации отдельных фаз компиляции заданного языка.

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

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

В третьей части работы требуется разработать программу, которая на основании таблицы лексем выполняет синтаксический разбор текста по заданной грамматике с построением цепочки вывода и дерева разбора.

В качестве среды разработки для реализации приложения использован язык программирования Delphi 7 и система программирования Borland Delphi 7.


Организация таблицы идентификаторов

Исходные данные

 

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

1. Простое рехэширование.

2. Метод цепочек.

 Должна быть предусмотрена возможность осуществления многократного поиска идентификатора в этой таблице. Список идентификаторов задан в виде текстового файла. Длина идентификатора ограничена 32 символами.

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

 

Назначение таблиц идентификаторов

 

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

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

Данные методы основаны на хеш-адресации, то есть на использовании значения, возвращаемого хеш-функцией, в качестве адреса ячейки из некоторо-

 

го массива данных. Хеш-функция вычисляется путем выполнения над цепочкой символов некоторых простых арифметических и логических операций. Самой простой хеш-функцией для символа является ASCII-код символа.

В данной курсовой работе принята хэш-функция - сумма ASCII-кодов первых двух символов цепочки.

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

 

 


Метод простого рехэширования

 

Согласно данному методу, если для элемента А адрес п() = h(A),указывает на уже занятую ячейку, то есть в случае возникновения коллизии, необходимо вычислить значение функции n1 = h1(A) и проверить занятость ячейки по адресу n1. Если и она занята, то вы­числяется значение h2(A). И так до тех пор, пока либо не будет найдена свободная ячейка, либо очередное значение hi(A) не совпадет с h(A). В последнем случае считается, что таблица идентификаторов заполнена и места в ней больше нет - выдается сообщение об ошибке размещения идентификатора в таблице.

Согласно методу простого рехэширования, hi(A) = (h(A)+i) mod Nm, где Nm- максимальное значение хэш-функции.

В данной курсовой работе принята хэш-функция - сумма ASCII-кодов первых двух символов цепочки, максимальное значение хэш-функции равно 512.

Поскольку при заполнении таблицы идентификаторов основными операциями являются добавление элемента в таблицу и поиск элемента в ней, на рис. 1 и рис. 2 представлены блок-схемы этих операций для рассматриваемого метода.

 


Рис. 1. Блок-схема добавления элемента в таблицу идентификаторов по методу простого рехэширования

Рис. 2. Блок-схема алгоритма поиска элемента в таблице идентификаторов, организованной по методу простого рехэширования

 

Метод цепочек

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

Поскольку при заполнении таблицы идентификаторов основными операциями являются добавление элемента в таблицу и поиск элемента в ней, на рис. 3 и рис. 4 представлены блок-схемы этих операций для рассматриваемого метода.

 

Рис. 3. Блок-схема добавления элемента в таблицу идентификаторов по методу цепочек

 

 

Рис. 4. Блок-схема алгоритма поиска элемента в таблицу идентифиикаторов, организованной по методу цепочек

 


Результаты

Для сравнения метода простого рехэширования и метода цепочек выбран текстовый файл, содержащий 100 строк.

В результате работы программы получены следующие данные, которые представлены в табл. 1.

Таблица 1

 

  Метод простого рехэширования Метод цепочек
Коллизий 74 59
Сравнений 19 3
Среднее число сравнений 0,19 0,03

 

На основе полученных результатов можно сделать следующие выводы.

Недостатки метода простого рехэширования:

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

- среднее время на размещение элемента и на поиск элемента в таблице зависит от заполненности таблицы идентификаторов и качества используемой хеш-функции;

- требование неполного заполнения таблицы ведет к неэффективному использованию объема доступной памяти.

Достоинством метода простого рехэширования является то, что он позволяет добиться неплохих результатов для эффективного поиска элемента в таблице (лучших, чем метод бинарного дерева).

Достоинства метода цепочек:

- нет необходимости заполнять пустыми значениями таблицу идентификаторов (это можно сделать только для хеш-таблицы), то есть память используется более экономно;

- элементы не могут попадать в ячейки с адресами, которые потом будут совпадать со значениями хеш-функции, то есть дополнительные коллизии не будут возникать;

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

Недостатком метода цепочек является необходимость организации работы с динамическими массивами данных.

Метод цепочек является более эффективным методом организации таблицы идентификаторов. Именно он и будет в дальнейшем использован для хранения информации об идентификаторах в курсовой работе.

 

 


Проектирование лексического анализатора

Исходные данные

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

В соответствии с заданием должны распознаваться:

- ключевые слова : «prog», «end.», «begin», «end», «if», «then», «else», «for», «to», «downto», «do», «and», «or», «not»;

- идентификаторы: любые последовательности латинских символов и цифр; идентификатор должен начинаться с символа;

- константы: двоичное представление числа;

- знаки операций: «=», «<», «>», «–», «+», «*», «/»;

- оператор присваивания: «:=»;

- разделитель: «;»;

- комментарии, заключенные в «{», «}».


Дата добавления: 2018-02-15; просмотров: 1477; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!