- •1.1. Основные понятия
- •1.1.1. Трансляторы, интерпретаторы и компиляторы
- •1.1.2. Стадии работы компилятора
- •1.1.3. Построение компилятора
- •1.2. Определение формальной грамматики и языка
- •1.2.1. Первичные понятия
- •1.3.3. Грамматики типа 2
- •1.3.4. Грамматики типа 3
- •1.3.5. Вывод в КС-грамматиках и правила построения дерева вывода
- •1.3.6. Синтаксический разбор
- •1.3.7. Левый и правый выводы
- •1.3.8. Неоднозначные и эквивалентные грамматики
- •1.4. Способы задания схем грамматик
- •1.4.1. Форма Наура-Бэкуса
- •1.4.2. Итерационная форма
- •1.4.3. Синтаксические диаграммы
- •2. Контекстно-свободные грамматики и автоматы
- •2.1. Приведенные грамматики
- •2.2. Удаление непроизводящих символов
- •2.3. Определение недостижимых символов
- •2.4. Определение бесполезных символов
- •2.5. Исключение леворекурсивных правил
- •2.6. Исключение цепных правил
- •2.7. Преобразование неукорачивающих грамматик
- •2.8. Магазинные автоматы
- •2.9. Работа магазинного автомата
- •2.10. Язык, допускаемый магазинным автоматом
- •2.11. Построение магазинного автомата
- •2.12. Пример построения автомата
- •3. Нисходящие распознаватели
- •3.1. Распознаватели и LL(K) - грамматики
- •3.2. Разделенные грамматики
- •3.3. Построение детерминированного нисходящего распознавателя
- •3.4. Множество выбора
- •3.4.1. Функции ПЕРВ, СЛЕД и множество ВЫБОР
- •3.4.2. Построение функции ПЕРВ(µ)
- •3.4.3. Построение функции СЛЕД(<B>)
- •3.4.4. Построение множества ВЫБОР
- •3.5. Слаборазделенные грамматики
- •3.6. LL(1) - грамматики
- •3.7. Построение магазинного автомата
- •3.8. Преобразование грамматик к виду LL(1)
- •3.8.1. Исключение леворекурсивных правил
- •3.8.2. Выделение общих частей
- •3.9. Восходящие распознаватели
- •4. Методы трансляции
- •4.1. Основные понятия
- •4.2. Синтаксически управляемые схемы
- •4.3. Перевод, определяемый СУ - схемой
- •4.4. Простая СУ – схема
- •4.5. Построение простой СУ - схемы
- •4.6. Транслирующие грамматики
- •4.7. Входная и выходная грамматики заданной транслирующей граммагики
- •4.8. Построение транслирующей грамматики по СУ - схеме
- •4.8.1. Бесскобочные выражения
- •4.8.1.1. Префиксная польская запись (ПрПЗ)
- •4.8.1.2. Вычисление префиксных польских записей
- •4.8.1.3. Постфиксная польская запись
- •4.8.1.4. Вычисление постфиксных записей
- •4.9. Магазинные преобразователи
- •4.9.1. Определение магазинного преобразователя
- •4.9.2. Описание работы магазинного преобразователя
- •4.9.5. Пример построения преобразователя
- •4.9.6. Порядок построения детерминированного магазинного преобразователя
- •5.1. Определение AT-грамматик
- •5.2. Пример АТ-грамматики
- •5.3. Вычисление значений атрибутов с левым выводом
- •5.4. L - атрибутные транслирующие грамматики
- •5.4.1. Форма простого присваивания АТ-грамматик
- •5.4.2. Преобразование LАТ-грамматики в LАТ-грамматику в форме простого присваивания
- •5.4.3. Расширенный вывод для АТ-грамматики
(3)<R> → ,<I><R> ,
(4)<R> → ).
можно представить следующим образом:
(a,a) 1 (<I>,a) 1 (<I>,<I>) 4
(<I>,<I><R> 3(<I><R> 2 <I>.
4. Методы трансляции
4.1. Основные понятия
Определение. Если заданы входной алфавит P и выходной алфавит W, то переводом с языка Lвх, состоящего из цепочек множества P*, на язык Lвых, состоящий из цепочек множества W*, называется множество C пар цепочек ( α,β ) таких, что α Lвх и
β Lвых
C={( α, β ) | α Lвх и β Lвых}.
4.2. Синтаксически управляемые схемы
Определение. Схемой синтаксически управляемого перевода (СУ-схемой) называется совокупность пяти объектов:
T = { VA, Vтвх, Vтвых, Q, <I>},
где VA - множество нетерминальных символов,
Vтвх - множество терминальных символов, используемых для построения входных цепочек,
Vтвых - множество терминальных символов, используемых для построения выходных цепочек,
<I>-начальный символ, <I> VA,
Q - множество правил вида <A> − α, β,
где <A> принадлежит VA, α ( VA U Vтвх)*, β (VA U Vтвых)* и
нетерминалы, входящие в цепочку β образуют перестановку нетерминалов цепочки α.
39
Определение. Если T = { VA,Vтвх,Vтвых,Q,I} СУ-схема, то грамматика
Г = { VA,Vтвх,R, I},
где R = {<A> − α | <A> − α, β Q}, называется входной грамматикой СУ-схемы Т, а грамматика
Г'={ VA,Vтвых,R',I},
где R' = {<A> − β | <A> − α, β Q} называется выходной грамматикой СУ-схемы Т.
С помощью СУ - схемы можно строить пары соответствующих цепочек. Такое построение называется выводом СУ - схемы, а получаемые пары цепочек - выводимыми парами.
Определение. Парой, выводимой с помощью заданной СУ-схемы, называют любую пару, которая может быть построена с применением следующих правил:
1)(<I>,<I>) - выводимая пара,
2)если (α <A>β ,α '<A>β ') выводимая пара и в Q существует правило <A>−γ ,γ ', то
(αγβ, α'γ'β') является выводимой парой.
Этот факт выражается следующим образом
(α <A>β ,α '<A>β ') (α γ β ,α 'γ 'β ').
Для последовательности выводимых пар используется обозначение:
(α<A>β, α'<A>β') * (ωμπ, ω'μ'π').
4.3. Перевод, определяемый СУ - схемой
С помощью понятия выводимой пары можно определить перевод, задаваемый СУ - схемой.
Определение. Переводом С(T), определяемым СУ-схемой Т назовем множество пар, состоящих из входной и выходной цепочек, выводимых из пары, включающей два начальных символа.
С(T) = {( α, β ) | (<I>, <I>) * ( α,β ) и α Vтвх*, β Vтвых*}
4.4. Простая СУ – схема
Определение СУ - схемы не накладывает ограничений на правила, кроме требования перестановочности нетерминалов во входной и выходной частях правила. Для построения
40
детерминированных устройств, осуществляющих перевод цепочек, используются СУ - схемы с дополнительными ограничениями на вид правил.
Определение. СУ-схема Т = { VA, Vтвх, Vтвых, Q, I } называется простой, если для каждого правила <A> → α, β из Q соответствующих друг другу вхождения нетерминалов встречаются в α и β в одном и том же порядке.
Определение. Перевод называется простым СУ-переводом, если он определяется простой СУ-схемой.
Примером простой СУ - схемы может служить СУ - схема Т4.3, которая задает перевод инфиксных выражений в постфиксные польские выражения.
T4.3: VA = {E, T, F}, Vтвх = { a, +, *, (, )}, Vтвых = { a, +, *}.
Q = { E – E + T, ET+; E - T, T;
T – T * F, TF*; T - F, F;
F - (E), E; F - a, a }.
Вывод в приведенной СУ - схеме может иметь вид:
(E, E) (E + T, ET+) (T + T, TT+) (F + T, FT+) (a + T, aT+)
(a + T * F, aTF*+) (a + F * F, aFF*+) (a+a*F,aaF*+) (a + a * a, aaa*+)
4.5. Построение простой СУ - схемы
В общем случае построение СУ - схемы для заданного перевода представляется более сложной задачей, чем построение двух грамматик, поскольку необходимо учитывать связь или соответствие между этими грамматиками. Однако, для простых СУ - схем задача построения упрощается, благодаря тому, что расположение соответствующих нетерминалов во входной и выходной цепочках правил одинаково. Построение простой СУ - схемы целесообразно начинать с построения грамматики, определяющей входной язык. Такая грамматика должна быть входной грамматикой искомой СУ - схемы. Построение выходной грамматики можно совместить с построением правил СУ - схемы. Учитывая, что нетерминалы входной цепочки должны встречаться в выходной цепочке в том же порядке, все нетерминалы из входной цепочки переносятся в выходную и в неё записы-
41
ваются выходные терминальные символы. Правила, состоящие только из нетерминалов, одинаковы во входной и выходной грамматиках.
В качестве примера рассмотрим построение перевода арифметических выражений, задаваемых следующей грамматикой, в постфиксные польские выражения.
Г4. 0 : VT = { x, +, (, ) } VA = { <A>, <B>, <C> }
R = { <A> → x, |
|
<A> → (<B>), |
|
<B> → <A><C>, |
|
<C> → +<A><C>, |
<C> → $ } |
Учитывая, что выходные выражения не должны содержать скобок, находим
Vтвых = { x', +'}. Первое правило грамматики содержит один входной терминал, поэтому правило СУ - схемы можем записать в виде:
<A> → x, x'.
Третье правило грамматики не содержит терминалов, поэтому получаем:
<B> → <A><C>,<A><C> .
Пятое правило является аннулирующим, поэтому оно должно сохраниться в выходной грамматике
<C> → $, $ .
Второе правило грамматики содержит скобки, которые, согласно правилам построения, должны отсутствовать в постфиксной польской записи, поэтому имеем:
<A> → (<B>), <B>.
При построении правила СУ - схемы по четвертому правилу грамматики следует учесть, что знак сложения в постфиксной записи должен следовать за вторым опреандом, который вводится в выражение нетерминалом А, следовательно получаем правило СУ - схемы в виде:
<A> → +<A><C>, <A>+'<C>.
Объединяя построенные правила, находим множество правил искомой СУ - схемы:
Т4.4: Q = {<A> → x, x',
<A> → (<B>), <B>,
<B> → <A><C>, <A><C>,
42