Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО Часть 1.docx
Скачиваний:
25
Добавлен:
25.04.2019
Размер:
133.36 Кб
Скачать
  1. Основные фазы компиляции программы. Фазы компиляции

Входная цепочка символов α

Лексический анализ

Сведения об алфавите, ключевых и зарезервированных словах

Правила перевода

Таблица имен идентификаторов

Закодированная цепочка символов

Синтаксический анализ

База знаний (правила вывода) в виде таблицы подстановок и матрицы связей

Таблицы других лексем

Фаза

анализа

Семантический анализ

Генератор внутреннего представления

Внутреннее представление программы

Оптимизация внутреннего представления

Генератор объектного кода

Выходная цепочка символов

Таблицы свойств

Анализ и локализация обнаруженных ошибок

Фаза

синтеза

  1. Лексический анализ:

  • выделение лексем

  • формирование таблиц лексем

  • замена лексем кодами одинаковой длины

  • удаление комментариев, пробелов, переносов строк

  1. Синтаксический анализ: строится дерево разбора

  2. Семантический анализ: формируется внутреннее представление – мнемокод (ассемблер)

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

  1. Лексический анализ: основные операции, виды лексем, способы реализации таблиц лексем

Первой фазой компиляции является лексический анализ (сканирование).

Задачи:

  • выделение лексем

  • удаление пробелов и комментариев

  • обнаружение лексических ошибок

Лексема – это структурная единица языка, состоящая из элементарных символов языка и не содержащая в своем составе другие структурные единицы языка.

Лексемы:

  • идентификаторы

  • строковые, символьные, числовые константы

  • служебные слова исходного языка

  • знаки операций и разделители

Все лексемы делятся на два класса: заранее определенные лексемы (зарезервированные слова, операторы, разделители) и производные лексемы, введенные пользователем (идентификаторы, константы).

К

лексема

определяемая пользователем

число

арифметический знак

ограничитель

логическая операция

разделитель

имя переменной

целое число

вещественное число

экспоненциальная форма

ключевое слово

тип данных

название подпрограммы

лассификация лексем зависит от исходного языка программирования. Для языка Паскаль она может иметь следующий вид:

без знака

стандартная форма

со знаком

без знака

со знаком

Шаги формирования таблицы лексем:

  1. Если лексема – синтаксическая постоянная, она заменяется заранее известным кодом

  2. Если лексема – синтаксическая переменная, то проверяется таблица лексем на ее наличие. Если лексема уже есть, то она заменяется кодом. Если лексемы еще нет, то переход к шагу 3)

  3. Занесение лексемы в таблицу, присвоение лексеме кода, замена лексемы в теле программы на код.

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

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

Символ операции

Код

Класс символа

Старшинство

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

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

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

В порядке поступления

Очередная лексема добавляется в конец таблицы, т.е. таблица не упорядочена. Добавление в таблицу реализуется весьма просто, но поиск требует, в общем случае, последовательного (линейного) просмотра всей таблицы, т.е. время поиска в общем случае при числе элементов таблицы N пропорционально tп ~ N/2.

Время записи tз не зависит от числа элементов таблицы.

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

Сортировка таблицы

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

tп ~ 1 + log2(N).

Таблица в виде двоичного дерева

tп ~ log2(N).

Известны также реализации таблиц в виде бинарного дерева, на основе хэш-адресации и др.