Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЭ-2013-анн-130515.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
1.69 Mб
Скачать

7.4. Алгоритмы удаления пустых и недостижимых символов в кс-грамматике. Нормальные формы кс-грамматик (Хомского и Грейбах). Устранение левой рекурсии в грамматике

Определение. Пусть грамматика G = (A, V, P, s). Нетерминальный символ u бесполезный, если не существует вывода s=>* αuγ. Символ u пустой, если из него нельзя вывести терминальную цепочку.

Для построения множества непустых символов последовательно строятся множества U0={s}, … Uk, …, причём, Uk получается из Uk-1 добавлением нетерминалов v таких, что u => αvγ, где u Uk-1 .

Для построения множества полезных символов последовательно строятся множества V0, … Vk, … причём, Vk получается из Vk-1 добавлением нетерминалов v таких, что v => α, где α Vk-1 . V0 включает нетерминалы, из которых за один шаг выводятся терминальные цепочки

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

u u1 | u2 |… | um| 1| 2 |…| n

на

u 1| 2 |…| n | 1 u’ | 2 u’ |…| n u

и

u 1 | 2 |… | m| 1 u’ | 2 u |… | m u’.

[АУ], п.2.4.2 - п.2.4.4 .

[M] гл.1. [K] 4.1, 4.2

7.5. Компиляторы и интерпретаторы. Архитектура компилятора. Фазы и этапы компиляции. Препроцессоры

Транслятор – программа, которая переводит текст на языке программирования в форму, пригодную для исполнения (другой язык). Если это другой язык программирования, транслятор иногда называют конвертором

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

Интерпретатор – программа, которая для каждого оператора исходной программы на алгоритмическом языке выполняет соответствующие машинные команды. Интерпретатор является и транслятором и исполнителем исходной программы.

Кросскомпилятор – компилятор, который генерирует код для машины, отличной от той, на которой он работает.

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

Динамический компилятор (Just-in=TimeJIT compiler) – компилятор, который транслирует промежуточное представление программы в объектный код во время исполнения программы.

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

Лексический анализатор (сканер) разбивает программу на простые элементы, называемые лексемами. Информация о лексемах хранится в таблицах символов. Синтаксический анализатор проверяет формальную правильность программы, определяемой КС-грамматикой, а также проверяет соблюдение дополнительных правил (обязательность объявлений, соблюдение типов и т.п.), что составляет суть контекстного анализа.

Выполнение частей может выполняться за один или несколько проходов – просмотров исходного или промежуточного кода.

Препроцессор – программа предварительной обработки исходной программы, записанной на алгоритмическом языке с инструкциями препроцессора. В ходе обработки она идентифицирует инструкции препроцессора, выполняет их и убирает из текста программы. На выходе получается программа на том же языке без инструкций препроцессора. Примеры команд препроцессора на языке C: #include, #define, #if.

[С] с.18-22, с.306-360.