
- •Министерство образования и науки рф
- •Основы построения трансляторов Курс лекций по дисциплине «Системное программное обеспечение» Красноярск 2010 г.
- •1. Место трансляторов в системном программном обеспечении. Основные фазы процесса трансляции
- •Генерация промежуточного представления
- •Генерация кода
- •Контрольные вопросы
- •2. Базовые понятия теории формальных языков и грамматик
- •2.1. Алфавиты, цепочки и языки. Основные понятия и определения
- •2.2. Представление языков
- •2.3. Грамматики
- •2.3.1. Формальное определение грамматики
- •2.3.2. Классификация грамматик и языков по Хомскому
- •2.3.3. Разбор цепочек
- •2.3.4. Преобразования грамматик
- •2.4. Задачи
- •3. Лексический анализ
- •Описание модельного языка
- •3.1. Сущность и задачи лексического анализа
- •3.2. Способы организации таблиц идентификаторов
- •Организация таблицы идентификаторов в виде неупорядоченного массива записей. Метод линейного поиска.
- •Организация таблицы идентификаторов в виде упорядоченного массива записей. Метод бинарного поиска.
- •Использование бинарного дерева поиска для построения таблицы идентификаторов.
- •Построение таблиц идентификаторов с использованием методов хеширования.
- •3.3. Методы и средства лексического анализа
- •3.4. Недетерминированный разбор
- •3.5 Разработка лексического анализатора для модельного языка Описание модельного паскалеподобного языка (м-языка):
- •Контрольные вопросы
- •4. Синтаксический и семантический анализ
- •4.1. Задачи и методы синтаксического анализа
- •4.2 Сущность метода рекурсивного спуска
- •Void error(); / функция обработки ошибок /
- •4.3. Условия применимости метода рекурсивного спуска
- •4.4. Синтаксический анализатор для м-языка
- •4.5. Семантический анализ
- •4.6. Семантический анализатор для м-языка
- •4.6.1. Обработка описаний
- •Int declare; / описан ? 1-"да", 0-"нет" /
- •Void ipush (int I); / значение I - в стек /
- •Int ipop (void); / из стека - целое /
- •4.6.2. Контроль контекстных условий в выражении
- •Void spush (char s); / значение s - в стек /
- •If (tid [I].Declare) / описан? /
- •4.6.3. Контроль контекстных условий в операторах
- •4.7. Задачи
- •5. Генерация внутреннего представления программ
- •5.1. Язык внутреннего представления программы
- •5.2 Синтаксически управляемый перевод
- •5.3 Генератор внутреннего представления программы на м-языке
- •5.4 Интерпретатор полиЗа для модельного языка
- •5.5 Задачи
- •Литература
Контрольные вопросы
Какое место занимают трансляторы в структуре системного программного обеспечения? Что такое трансляция, компиляция, транслятор, компилятор, интерпретатор?
Что понимается под синтаксисом, семантикой, лексикой языка программирования? Поясните суть этих понятий на примере языка С.
Из каких процессов состоит компиляция? Расскажите об общей структуре компилятора.
В чем состоит сущность, назначение и взаимосвязь этапов лексического и синтаксического анализа?
Почему в большинстве современных компиляторов лексический анализ выделяется в отдельную фазу?
Постройте самостоятельно общую схему работы интерпретатора. В чем ее отличие от общей схемы работы компилятора, приведенной на рис.1.1?
Постройте самостоятельно общую схему работы компилятора с языка Ассемблера. Какие особенности присущи данному компилятору? Какие фазы компиляции в нем могут объединяться или отсутствовать?
Назовите основные факторы, влияющие на количество проходов компилятора в процессе трансляции исходного текста программы. В чем заключается это влияние?
Почему в глобальной сети Интернет используются в основном языки программирования, предусматривающие интерпретацию исходной программы?
Чем обусловлено построение компиляторов с языка Ассемблера по двухпроходной схеме?
В чем заключается суть метода синтаксически-ориентированной трансляции?
2. Базовые понятия теории формальных языков и грамматик
В этой главе изложены некоторые аспекты теории формальных языков, существенные с точки зрения трансляции. Здесь введены базовые понятия и даны определения, связанные с одним из основных механизмов определения языков - грамматиками, приведена наиболее распространенная классификация грамматик (по Хомскому). Особое внимание уделяется контекстно-свободным грамматикам и, в частности, их важному подклассу - регулярным грамматикам. Грамматики этих классов широко используются при трансляции языков программирования.
2.1. Алфавиты, цепочки и языки. Основные понятия и определения
Алфавит (или словарь) - это конечное множество символов.
Предполагается, что термин "символ" имеет достаточно ясный интуитивный смысл и не нуждается в дальнейшем уточнении.
Цепочкой символов в алфавите V называется любая конечная последовательность символов этого алфавита. Синонимы цепочки – предложение, строка или слово.
Цепочка, которая не содержит ни одного символа, называется пустой цепочкой. Для ее обозначения будем использовать символ .
Более формально цепочка символов в алфавите V определяется следующим образом:
- цепочка в алфавите V;
если - цепочка в алфавите V и a - символ этого алфавита,
то a - цепочка в алфавите V;
- цепочка в алфавите V тогда и только тогда, когда она является таковой в силу (1) и (2).
Если и - цепочки, то цепочка называется конкатенацией (или сцеплением) цепочек и .
Например, если = ab и = cd, то = abcd.
Для любой цепочки всегда = = .
Обращением (или реверсом) цепочки называется цепочка, символы которой записаны в обратном порядке.
Обращение цепочки будем обозначать R.
Например, если = abcdef, то R = fedcba.
Для пустой цепочки: R.
Длина цепочки - это число составляющих ее символов.
Например, если = abcdefg, то длина равна 7.
Длину цепочки будем обозначать | |. Длина равна 0.
n-ой степенью цепочки будем обозначать n) называется конкатенация n цепочек
0 = ; n = n-1 = n-1.
Язык в алфавите V - это подмножество цепочек конечной длины в этом алфавите.
Пример 2.1
Пусть дан алфавит V = {a, b}. Вот некоторые языки в алфавите V:
1) L1 = – пустой язык;
2) L2 = {} – язык, содержащий только пустую цепочку
(заметим, что L1 и L2 – различные языки);
3) L3 = {, a, b, aa, ab, ba, bb} – язык, содержащий цепочки из a и b, длина которых не превосходит 2;
4) L4 = {an2 | n > 0} – язык цепочек из a, длины которых представляют собой квадраты натуральных чисел. Данный язык содержит бесконечное число цепочек.
Обозначим через V* множество, содержащее все цепочки в алфавите V, включая пустую цепочку .
Обозначим через V+ множество, содержащее все цепочки в алфавите V, исключая пустую цепочку .
Следовательно, V* = V+ {.
Ясно, что каждый язык в алфавите V является подмножеством множества V*.
Пример 2.2
Пусть V={0,1}, тогда
V* = {, 0, 1, 00, 11, 01, 10, 000, 001, 011, ...},
V+ = {0, 1, 00, 11, 01, 10, 000, 001, 011, ...}.