
- •Этапы жизненного цикла программного продукта
- •Состав и схема функционирования классической системы программирования
- •Типы трансляторов, особенности интерпретаторов и компиляторов
- •Общая схема работы компилятора
- •Определение порождающей грамматики
- •Определение языка, порождаемого грамматикой
- •Определение типов грамматики и языков по Хомскому
- •Соотношения между типами грамматик
- •Соотношения между типами языков
- •Определение неоднозначности грамматики и языка
- •Определение недостижимых и бесполезных символов, определение приведенной грамматики
- •Определение детерминированного конечного автомата (ка)
- •Диаграмма состояний (дс) для заданной леволинейной регулярной грамматики. Построение дс
- •Определение недетерминированного конечного автомата
- •Алгоритм построения детерминированного конечного автомата по нка
- •Задачи лексического анализа
- •Организация классов таблиц лексического анализатора
- •Метод рекурсивного спуска: назначение, семантика процедур рекурсивного спуска
- •Достаточные условия применимости метода рекурсивного спуска
- •Расширение класса грамматик, к которым применим метод рекурсивного спуска (проблемы преобразования, эквивалентность предлагаемых преобразований)
- •Задачи семантического анализа
- •Свойства языка внутреннего представления программы, примеры таких языков
- •Машинно-независимая оптимизация. Основные оптимизирующие преобразования
- •Машинно-зависимая оптимизация. Основные оптимизирующие преобразования
- •Интегрированная среда разработки (иср)
- •Основные функции редактора текста в рамках иср
- •Основные функции отладчика в рамках иср
- •Назначение и функционирование редактора связей. Загрузчик
- •Библиотеки. Основные типы библиотек
- •Критерии проектирования стандартных библиотек
- •Stl: контейнеры, итераторы, алгоритмы, аллокаторы. Шаблоны vector и list
Диаграмма состояний (дс) для заданной леволинейной регулярной грамматики. Построение дс
Диаграмма состояний НКА – это неупорядоченный помеченный ориентированный граф: узлы – помечены символами состояний из К, дуги соединяющие A и узел помеченный В, помечены t: F(A, t) = B.
Определение недетерминированного конечного автомата
Недетерминированный конечный автомат – это пятерка (K, VT, F, H, S), где K – конечное множество состояний, VT – кон мн-во допустимых вх. символов, F – функция переходов, H – нач. состояние из K, S – мн-во заключительных состояний, подмн-во K.
Алгоритм построения детерминированного конечного автомата по нка
М = (K, VT, F, H, S) – НКА; M’ = (K’, VT, F’, H’, S’) – ДКА, допускающий тот же язык, что и М.
Множество состояний К’ состоит из всех подмножеств множества К. Каждое состояние из К’ будем обозначать [A1A2…An], где Ai из К
Отображение F’ определим как F’([A1…An], t) = [B1…Bm], где для каждого 1 <= j <= m F(Ai, t) = Bj для каких-либо 1 <= i <= n
Пусть H = {H1, H2, … Hk}, тогдa H' = [H1, H2, …, Hk]
Пусть S = {S1, S2, …, Sp}, тогда S’ – все состояния из K’, имеющие вид […Si…], Si из S для какого-либо 1 <= i <= p.
Задачи лексического анализа
Выделить в исходном тексте цепочку символов, представляющую лексему
Удалить пробельные символы и комментарии
Зафиксировать в специальных таблицах для хранения разных типов лексем факт появления соответствующих лексем в анализируемом тексте
Преобразовать цепочку символов, представляющих лексему, в пару (тип лексемы, указатель на информацию о ней)
Организация классов таблиц лексического анализатора
На этапе лексического анализа создаются следующие таблицы:
Таблица служебных слов языка
Таблица ограничителей
Идентификаторов анализируемой программы
Чисел-констант
Организация таблиц:
Массив записей (упорядоченных или нет)
Массив указателей на записи (если структуры разных типов)
Список
Бинарное дерево
Хеш-таблицы (чаще всего используются на практике)
Метод рекурсивного спуска: назначение, семантика процедур рекурсивного спуска
Один из алгоритмов анализа входной цепочки, расходующий линейное время. Последовательность разбора эквивалентна построению дерева разбора методом «сверху вниз». Для каждого нетерминала грамматики создается своя процедура, носящая его имя, ее задача – начиная с указанного места исходной цепочки найти подцепочку, которая выводится из этого нетерминала. Если такую подцепочку считать не удается, то процедура завершает свою работу вызовом процедуры обработки ошибки, которая выдает сообщение о том, что цепочка не принадлежит языку, и останавливает разбор. Если цепочку удалось найти, то работа процедуры считается нормально завершенной и осуществляет возврат в точку вызова. Тело каждой такой процедуры пишется непосредственно по правилам вывода соответствующего нетерминала: для правой части каждого правила осуществляется поиск подцепочки, выводимой из этой правой части. При этом терминалы распознаются самой процедурой, а нетерминалы соответствуют вызовам процедур, носящих их имена.