- •Содержание
- •1. Организация таблицы идентификаторов
- •1.1 Исходные данные
- •1.2 Назначение таблиц идентификаторов
- •1.3 Хеш-адресация с рехешированием.
- •1.4 Упорядоченный список
- •1.5 Результаты
- •2. Проектирование лексического анализатора
- •2.1 Исходные данные
- •2.2 Принципы работы лексического анализатора
- •2.3 Схема распознавателя
- •2.4 Результаты
- •3.1 Исходные данные
- •3.2 Построение синтаксического анализатора
- •Список литературы
1.5 Результаты
Полученные результаты (рис. 5) говорят о том, что при поиске в методе хеш-адресации с рехешированием количество операций сравнения и среднее число сравнений меньше, чем при упорядоченном списке. А так как чаще всего компилятору приходится искать идентификатор, то, следовательно, метод хеш-адресации с рехешированием более эффективен.
Рис. 5 Экранная форма организации таблиц идентификаторов
2. Проектирование лексического анализатора
2.1 Исходные данные
Требуется написать программу, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов и значений. Текст на входном языке задается в виде символьного (текстового) файла. Программа должна выдавать сообщения о наличии во входном тексте ошибок, которые могут быть обнаружены на этапе лексического анализа.
Входной язык содержит:
операторы цикла “do” и “while”;
идентификаторы;
круглые открывающиеся и закрывающиеся скобки;
операторы сравнения “<”, “>”, “=”;
знак присваивания “:=” ;
составные операторы “begin” и “end”;
условные операторы “if”, “then”, “else” и “endif”;
ключевые слова начала и конца программы “prog” и “end.”;
разделяющий знак “;”.
логические операторы “not”, “and” и “or”;
арифметические операции сложения, вычитания, умножения и деления;
комментарии любой длины в фигурных скобках;
константы в шестнадцатеричной форме.
2.2 Принципы работы лексического анализатора
Лексический анализатор – это часть компилятора, которая читает литеры программы на исходном языке и строит из них слова (лексемы) исходного языка. На вход лексического анализатора поступает текст исходной программы, а выходная информация передастся для дальнейшей обработки компилятором на этапе синтаксического анализа и разбора.
Лексема (лексическая единица языка) – это структурная единица языка, которая состоит из элементарных символов языка и не содержит в своем составе других структурных единиц языка. Лексемами языков программирования являются идентификаторы, константы, ключевые слова языка, знаки операций и т. п.
В основном лексические анализаторы выполняют исключение из текста исходной программы комментариев и незначащих пробелов, а также выделение лексем следующих типов: идентификаторов, строковых, символьных и числовых констант, знаков операций, разделителей и ключевых (служебных) слов входного языка.
Результатом работы лексического анализатора является перечень всех найденных в тексте исходной программы лексем. Этот перечень представляется в виде таблицы, называемой таблицей лексем.
Язык описания констант и идентификаторов в большинстве случаев является регулярным, то есть может быть описан с помощью регулярных грамматик. Распознавателями для регулярных языков являются конечные автоматы (КА).
Любой КА может быть задан с помощью пяти параметров: М(Q, V,δ,q0,F),
где: Q – множество состояний автомата;
V – конечное множество допустимых входных символов;
d – функция переходов автомата;
q0ÎQ – начальное состояние автомата;
FÍQ – множество конечных состояний автомата.
Алгоритм работы простейшего лексического анализатора:
просматривается входной поток символов программы на исходном языке до обнаружения очередного символа, ограничивающего лексему;
для выбранной части входного потока выполняется функция распознавания лексемы;
при успешном распознавании информация о выделенной лексеме заносится в таблицу лексем, и алгоритм возвращается к первому этану;
при неуспешном распознавании лексемы, она помещается в поле ошибочных лексем, и делается попытка распознать следующую лексему (идет возврат к первому этану алгоритма).
Работа лексического анализатора продолжается до тех пор, пока не будут просмотрены все символы программы на исходном языке из входного потока.