
- •Компиляция. Основные понятия. Контекст компилятора
- •Этапы, фазы и проходы
- •Фаза анализа. Основные понятия.
- •Фаза синтеза. Основные понятия.
- •Методы определения языка
- •Понятие регулярных выражений
- •Понятие грамматики
- •8.Иерархия грамматик по Хомскому
- •9 . Порождения синтаксические деревья
- •Неоднозначность
- •11.Понятие лексического анализа
- •12.Лексический анализ с помощью регулярных выражений
- •Лексический анализ с помощью конечных автоматов
- •14. Лексический анализ с помощью Lex
- •15. Нисходящий анализ. Критерии принятия решений.
- •16. Понятие ll(1)-грамматики
- •17. Рекурсивный спуск. Расширенная форма записи правил для исключения рекурсивных вызовов.
- •18. Рекурсивный спуск. Комбинирование рекурсии и итерации.
- •19. Преобразование грамматик. Удаление левой рекурсии
- •20. Преобразование грамматик. Факторизация
- •21. Введение действий в грамматику
- •22. Восходящий синтаксический анализ. Основные понятия. Критерий принятия решений
- •Восходящий синтаксический анализ. Таблица синтаксического анализа.
- •25. Характеристический конечный автомат.
- •Восходящий синтаксический анализ. Slr(1), lalr(1), общий алгоритм формирования таблицы lr(1)-анализа.
- •Восходящий синтаксический анализ. Генератор восходящих анализаторов yacc. Основные понятия.
- •Семантический анализ. Не-контекстно-свободные характеристики языков.
- •Семантический анализ. Таблица символов.
- •Семантический анализ. Таблица типов.
- •31.Семантический анализ. Таблицы функций. Таблицы меток
- •32. Распределение памяти. Классификация памяти
- •33. Распределение памяти. Стек времени выполнения. Определение области видимости.
- •34. Распределение памяти. Стековый фрейм.
- •35. Распределение памяти. Дисплей.
- •35. Адреса времени компиляции. Простые адреса. Адресация элементов статического массива.
- •37. Распределение памяти. Адреса времени компиляции. Адреса динамического массива
- •38. Куча. Основные понятия. Методы автоматического освобождения памяти.
Семантический анализ. Таблица типов.
В компиляторе должен существовать способ уникального представления каждого типа конкретной программы. Если исходный язык содержит только конечное число типов, для представления разрешенных типов можно использовать различные целые числа. Некоторые ранние языки, такие как FORTRAN, подобное позволяли, однако, более поздние языки в общем случае уже нельзя рассматривать так просто. При рассмотрении подходящего представления типов в программе необходимо принять во внимание следующие факторы.
Высокая структурированность и рекурсивная природа многих типов.
Общие операции, которые компилятор должен будет производить над, типами.
Общими операциями над типами в С являются следующие.
Нахождение типа поля элементов struct или union.
Нахождение типа элемента массива.
Нахождение типа результата функции.
Основные типы, такие как int, float и char, могут представляться в С посредством целых чисел, а составные типы, например, array и union, могут представляться как структуры.
Например, тип typedef
typedef struct {
int day;
int mth;
int year;
} dob;
можно представить с помощью следующей структуры
А тип typedef
typedef long int[9][19] matrix;
можно представить с помощью следующей структуры
Этот способ представления позволяет сравнительно легко выполнять обычные операции над типами. Остается всего лишь определить массив (таблицу типов), который отображает имена типов в указатели на структуры типов. Поскольку используемые в программе имена типов, как и другие имена, имеют области видимости, в таблице также должна существовать возможность отображения областей видимости подобно тому, как это сделано в таблице символов. В простых случаях достаточной является стековая структура таблицы.
31.Семантический анализ. Таблицы функций. Таблицы меток
Число других таблиц, необходимых в процессе компиляции, определенным образом зависит от компилируемого языка. Обычно используются следующие таблицы.
Таблица функций.
Таблица меток.
Некоторым образом функция подобна типу, с ней соотнесены подтипы, т.е. типы параметров и результатов функции. В процессе генерации кода ей также выделяется адрес, а вся информация об этом хранится в таблице времени компиляции, обзор которой производится согласно соответствующим правилам языка.
Управляющие структуры в языках высокого уровня должны быть представлены в целевом коде посредством переходов (условных или иных) и меток. Таким образом, целевые версии исходных программ будут содержать как метки, определенные пользователем, так и метки, определенные компилятором. Структура многих языков позволяет использовать таблицу стекового типа для связывания определяющего вхождения метки и применимого вхождения метки. Из этого следует, что, по-видимому, в процессе компиляции (и во время выполнения) придется использовать несколько стеков. Управление стеками, в смысле выделения каждому из них достаточной памяти, становится сложным, если число стеков больше двух, так что значительные преимущества дает возможность объединения множества стеков в единую стековую структуру. К счастью, правила обзора многих языков такие возможности предоставляют.