- •Основы конструирования компиляторов
- •Введение. Трансляция арифметических выражений. Метод Рутисхаузера
- •1Основные понятия и определения
- •1.1Классификация компилирующих программ
- •1.2Синтаксис и семантика. Структура компилятора
- •2Формальные грамматики и их использование при лексическом и синтаксическом анализе
- •2.1Формальная грамматика и формальный язык
- •2.2Понятие грамматического разбора
- •2.3Расширенная классификация грамматик Хомского
- •2.4Распознавание регулярных грамматик
- •2.4.1Конечный автомат и его программная реализация
- •2.4.2Построение лексических анализаторов
- •2.4.3Построение синтаксических анализаторов
- •2.5Распознавание кс-грамматик
- •2.5.1Автомат с магазинной памятью
- •2.5.2Синтаксические анализаторы ll(k)-грамматик. Метод рекурсивного спуска
- •2.5.3Синтаксические анализаторы lr(k)-грамматик. Грамматики предшествования
- •2.6Польская запись. Алгоритм Бауэра-Замельзона
- •3Распределение памяти
- •4Генерация и оптимизация кодов
- •1 Основные понятия и определения 3
- •2 Формальные грамматики и их использование при лексическом и синтаксическом анализе 5
- •3 Распределение памяти 27
- •4 Генерация и оптимизация кодов 28
Московский государственный технический университет
имени Н.Э. Баумана
Факультет Информатика и системы управления
Кафедра Компьютерные системы и сети
«УТВЕРЖДАЮ»
Заведующий кафедрой ИУ-6
_________ Сюзев В.В.
Г.С. Иванова, Т.Н. Ничушкина
Основы конструирования компиляторов
Учебное пособие по курсу Системное программное обеспечение
Москва 2007
Введение. Трансляция арифметических выражений. Метод Рутисхаузера
Первыми транслирующими программами были программы, обеспечивающие перевод формульной записи выражений в машинный язык. В основе такого перевода представление выражения в виде последовательности троек, где каждая тройка включает два адреса операндов, адрес результата и операцию:
EC = EL ER, где EC – результат, EL, ER – левый и правый операнды, – операция.
Основной проблемой при этом является необходимость учета приоритетов операций. Например, для выражения:
d = a+b*c должны быть построены тройки: T1 = b*c, d = a+T1
Исторически первым для решения этой задачи был метод Рутисхаузера.
Метод Рутисхаузера. Метод требует, чтобы выражение было записано в полной скобочной записи, когда порядок выполнения операций указывается скобками. Так, выражение d = a+b*c должно быть записано в виде d = a+(b*c), в противном случае сначала будет выполняться операция сложения. Метод заключается в следующем.
1. Каждому символу строки Si ставится в соответствие индекс Ni по алгоритму:
N[0]:=0
J:=1
Цикл-пока S[J]’_’
Если S[J] = ‘(‘ или S[J] = <операнд>
то N[J]:=N[J-1] +1
иначе N[J]:=N[J-1] -1
Все-если
J:=J+1
Все-цикл
N[J]:=0
Определяется наибольшее значение индекса в структуре вида k(k-1)k или при наличии скобок (k-1)k(k-1)k(k-1) и строится соответствующая тройка.
3. Обработанные символы вместе со скобками удаляются, и на их место ставится значение N=k-1.
4. Операции 2, 3 повторяются до завершения выражения.
Пример. (((a+b)*c)+d)/k
S: ( ( ( a + b ) * c ) + d ) / k
N: 0 1 2 3 4 3 4 3 2 3 2 1 2 1 0 1 0 => T1 = a+b
b) S: ( ( T1 * c ) + d ) / k
N: 0 1 2 3 2 3 2 1 2 1 0 1 0 => T2 = T1*c
c) S: ( T2 + d ) / k
N: 0 1 2 1 2 1 0 1 0 => T3 = T2+d
d) S: T3 / k
N: 0 1 0 1 0 => T4 = T3/k
Недостаток метода – требование полной скобочной структуры. Как правило, для этого используется специальная программа, которая вставляет скобки.
Решение прочих проблем компиляции было не таким простым. Первые компиляторы являлись крайне сложными программами, написание которых требовало неординарных способностей, и содержали большое количество ошибок. Так первый компилятор Fortran потребовал 18 человеко-лет работы. С тех пор разработаны систематические технологии решения многих задач компиляции, предложен соответствующий инструментарий, в результате чего небольшой компилятор может стать темой курсового проекта.
1Основные понятия и определения
1.1Классификация компилирующих программ
Транслятор – программа, которая переводит программу, написанную на одном языке, в эквивалентную ей программу, написанную на другом языке.
Компилятор – транслятор с языка высокого уровня на машинный язык или язык ассемблера.
Ассемблер – транслятор с языка Ассемблера на машинный язык.
Интерпретатор – программа, которая принимает исходную программу и выполняет ее, не создавая программы на другом языке.
Макропроцессор (препроцессор – для компиляторов) – программа, которая принимает исходную программу, как текст и выполняет в нем замены определенных символов на подстроки. Макропроцессор обрабатывает программу до трансляции.
