Скачать презентацию Лекция 9 Семантический анализ Промежуточные языки Скачать презентацию Лекция 9 Семантический анализ Промежуточные языки

9789b48b569a339ca565b18bff67b669.ppt

  • Количество слайдов: 14

Лекция 9 • Семантический анализ • Промежуточные языки Исходная программа Лексический анализатор Токен запрос Лекция 9 • Семантический анализ • Промежуточные языки Исходная программа Лексический анализатор Токен запрос следующего Синтаксический анализатор Дерево разбора Семантический разбор Интерпретация Компиляция Оптимизация ПЯ Генерация ПЯ

Семантический анализ Фаза контроля типов • Идентификация – Таблица внешних представлений – Таблица идентификаторов Семантический анализ Фаза контроля типов • Идентификация – Таблица внешних представлений – Таблица идентификаторов – Обработка определяющего вхождения идентификатора • • Конструирование типов Представление типов Контроль типов Преобразование типов

Идентификация • Одна из задач, решение которой необходимо для проверки правильности использования типов. Эта Идентификация • Одна из задач, решение которой необходимо для проверки правильности использования типов. Эта задача может быть полностью или частично решена на фазе синтаксического анализа. • Определяющее вхождение идентификатора – это его вхождение в описание, например, int i • Все остальные вхождения идентификатора являются использующими, например, i = 5 или i + 13

Структура таблиц • Таблица внешних представлений значение hash-функции для лексемы лексический класс лексическая марка Структура таблиц • Таблица внешних представлений значение hash-функции для лексемы лексический класс лексическая марка ссылка на определение идентификатора • Таблица идентификаторов ссылка на внешнее представление ссылка на тип ссылка на предыдущее определение идентификатора

Конструирование типов • Примитивные типы: int, char, boolean, invalid • Основные конструкторы типов: array, Конструирование типов • Примитивные типы: int, char, boolean, invalid • Основные конструкторы типов: array, *, struct, pointer, proc

Представление типов • • Деревья DAG Линейная запись деревьев или dag’ов. Битовые шкалы Представление типов • • Деревья DAG Линейная запись деревьев или dag’ов. Битовые шкалы

Пример: proc (char, char) ^ integer Линейная запись деревьев proc, 2, char, pointer, integer Пример: proc (char, char) ^ integer Линейная запись деревьев proc, 2, char, pointer, integer pointer 01 array 10 freturns 11 boolean char integer real 0000 0001 0010 0011 char freturns (char) pointer (freturns (char)) array (pointer (freturns (char))) 000000 0001 0000111 0001 100111 0001

Контроль типов • Статический контроль типов означает, что проверка правильности использования типов осуществляется во Контроль типов • Статический контроль типов означает, что проверка правильности использования типов осуществляется во время трансляции исходной программы. • Динамический контроль типов означает, что проверка правильности использования типов осуществляется во время выполнения объектной программы.

Промежуточные языки • Традиционная организация компилятора: Front-end — intermediate language — Backend • Промежуточный Промежуточные языки • Традиционная организация компилятора: Front-end — intermediate language — Backend • Промежуточный язык иногда также называют внутренним представлением программы • Основная задача ПЯ – обеспечить интерфейс между анализом и генерацией • ПЯ должен быть удобным для проведения на нем преобразований, оптимизаций и т. п.

Унификация ПЯ • Снижение затрат на разработку компилятора для множества языков или под множество Унификация ПЯ • Снижение затрат на разработку компилятора для множества языков или под множество платформ • Java bytecode реализует частный случай с одним входным языком и множеством целевых платформ • CIL(MSIL) представляет собой случай с множеством языков и множеством платформ • При едином ПЯ дорогостоящие в реализации машинно-независимые оптимизации могут быть использованы многократно (например, GNU C)

Промежуточные языки • • Атрибутное дерево разбора Префиксная и постфиксная запись Триады и тетрады Промежуточные языки • • Атрибутное дерево разбора Префиксная и постфиксная запись Триады и тетрады RTL

Атрибутное дерево разбора Атрибутное дерево разбора

Префиксная и постфиксная запись • Прямая (префиксная) польская запись: (a+b)*(c-d) -> *+ab-cd • Обратная Префиксная и постфиксная запись • Прямая (префиксная) польская запись: (a+b)*(c-d) -> *+ab-cd • Обратная (постфиксная) польская запись: (a+b)*(c-d) -> ab+cd-* • Польская запись может быть распространена и на другие конструкции : a : = a + b; –> : =a+ab if then else –> BZ BR

Триады и тетрады • Триады и тетрады представляют собой низкоуровневые формализмы записи промежуточного представления Триады и тетрады • Триады и тетрады представляют собой низкоуровневые формализмы записи промежуточного представления программы, приближающие программу к объектному коду • Пример: Тетрады: b+c=1 1 -d=2 2 : = a = 3 a : = b + c – d Триады: b+c 1+d 2 : = a