
- •Предисловие
- •Глава 1 введение в проблематику конструирования компиляторов
- •1.1. Понятие компилятора и его структура
- •1.2. Применение компиляторов и задачи их разработки
- •Глава 2 способы задания формальных языков
- •2.1. Математический аппарат теории
- •Формальных языков, перевода и компиляции
- •1) AR*a для всех aÎa;
- •2.2 Цепочки и языки
- •2.3 Грамматики
- •2.4. Распознаватели
- •2.5 Регулярные выражения и синтаксические диаграммы
- •2.6. Автоматы с магазинной памятью (мп - автоматы )
- •2.7. Соответствия между способами описания языков
- •Глава 3 основы теории перевода
- •3.1. Определение перевода
- •3.2. Модели простейших трансляторов
- •3.2.1. Конечные преобразователи
- •3.2.2. Преобразователи с магазинной памятью
- •Глава 4 конструирование сканеров
- •4.1. Общая характеристика процесса сканирования
- •4.2. Описание лексем в языке расширенных регулярных выражений
- •4.3. Построение недетерминированного конечного автомата по расширенному регулярному выражению
- •4.4. Преобразование недетерминированного конечного автомата в детерминированный
- •Замечание. Среди состояний могут оказаться недостижимые состояния . Состояние р называется достижимым , если существует такая цепочка w , что (q0, w) *(p , e ). ¨
- •4.5. Преобразование синтаксической диаграммы в конечный автомат
- •4.6. Представление результатов сканирования
- •4.7. Методики конструирования сканеров
- •Глава 5 конструирование однопроходных нисходящих анализаторов
- •5.1. Определение синтаксического разбора
- •5.2. Нисходящий и восходящий разборы
- •5.3. Ll(k) - грамматики
- •5.4. Предсказывающие алгоритмы разбора
- •5.5. Алгоритмы построения управляющих таблиц для левых анализаторов
- •5.6. Приведение грамматик к ll - форме
- •Глава 6 основы генерации кода
- •6.1. Перевод и генерация кода
- •6.2. Представления промежуточной программы
- •6.3. Преобразование промежуточной программы в ассемблерный код
2.7. Соответствия между способами описания языков
Между рассмотренными в этой главе способами описания формальных языков имеют место взаимные соответствия. Для каждого класса грамматик из классификации Хомского существует класс распознавателей, определяющий тот же самый класс языков. Это соответствие можно представить табл.2.3.
Таблица 2.3.
Язык, определяемый грамматиками |
Язык, определяемый распознавателем |
Праволинейный язык |
Язык, определяемый конечным автоматом |
КС язык |
Язык, определяемый автоматом с магазинной памятью (МП- автомат) |
КС язык |
Язык, определяемый линейно- ограниченным автоматом |
Язык общего вида, рекурсивно перечисляемый язык |
Язык, определяемый машиной Тьюринга |
Отметим некоторые соответствия, которые будут использоваться в практических задачах:
1) между регулярными грамматиками и КА;
2) между регулярными выражениями (множествами) и синтаксическими диаграммами;
3) между синтаксическими диаграммами и
регулярными грамматиками.
Использование этих соответствий оказывается полезным в тех случаях, когда необходимо перейти от одного способа описания языка к другому. Методы соответствующих преобразований мы будем рассматривать при решении конкретных задач.
Глава 3 основы теории перевода
3.1. Определение перевода
Определение. Перевод (или трансляция) - это некоторое отношение между цепочками, или, другими словами, это некоторое множество пар цепочек. ¨
Компилятор определяет перевод, образованный парами вида (исходная программа, объектная программа). Если компилятор состоит из трех фаз - лексического анализа, синтаксического анализа и генерации кода, то каждая из них сама является переводом. Как отмечалось в главе 1, лексический анализ можно рассматривать как перевод, при котором цепочки, представляющие исходную программу, отображаются в цепочки лексем. Синтаксический анализатор отображает цепочки лексем в цепочки, представляющие деревья. Затем генератор кода переводит эти цепочки в машинный язык или язык ассемблера.
Определение. Пусть S - входной алфавит и D- выходной алфавит. Переводом с языка L1 на язык L2 назовем отношение T из S в D, для которого L1 - область определения, а L2 - множество значений.¨
Если (x,y)
T, то цепочка
у называется
выходом
для цепочки х.
Заметим, что в общем случае в переводе
Т
для данной входной цепочки может быть
более одной выходной цепочки. Однако
перевод, предназначенный для языка
программирования, должен быть функцией,
т.е. для каждого входа должно быть не
более одного выхода.
В компиляторах часто используется перевод обычной (инфиксной) формы записи арифметических выражений в польскую форму записи, которая не содержит скобок и имеет два вида - префиксную и постфиксную.
Определение. Пусть q - множество знаков бинарных операций, а S - множество операндов a , тогда:
1. Если инфиксное
выражение E=a,
a Î
S
(т.е. Е
состоит из одного операнда), то префиксная
и постфиксная
записи
этого выражения совпадают и равны а,
т.е.
=
=a..
2. Если E1qE2 - инфиксное выражение, в котором q - знак операции, а E1,E2 - операнды (инфиксные), то:
а) q 1 2- префиксная польская запись, где 1, 2 - префиксные записи выражений E1 и E2 соответственно;
б) 1 2q - постфиксная польская запись, где 1 и 2- постфиксные записи выражений E1 и E2 соответственно.
3. Если (Е) - инфиксное выражение, то :
а) префиксная запись - это префиксная запись выражения Е;
б) постфиксная запись - это постфиксная запись выражения Е.
Пример 3.1. Перевод арифметических выражений в префиксную и постфиксную форму записи:
Цепочка х: Цепочка у:
(a+b)*(a+b)
ab+ab+*
— постфиксная форма;
(a+b)*(a+b) *+ab+ab — префиксная форма.
Проблема задания бесконечного перевода конечными средствами аналогична проблеме задания бесконечного языка. Известно несколько подходов к определению перевода.
Первый подход основан на использовании системы правил, порождающих пары цепочек (х,у), аналогично тому, как язык порождается грамматикой. Этот подход называется схемой синтаксически управляемого перевода.
Второй подход основан на модели распознавателя с двумя входными лентами для цепочек xÎS * и yÎD*. Этот распознаватель будет распознавать пары (х,у) принадлежащие переводу Т.
Третий подход базируется на использовании простых моделей трансляторов, таких как конечные преобразователи и преобразователи с магазинной памятью.
В дальнейшем мы будем использовать именно эти модели применительно к сканерам и анализаторам.