Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОтветыГЭК ТЯПиМТ2011.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
462.85 Кб
Скачать
  1. Су схемы перевода. Синтаксически-управляемые трансляции и генерация промежуточной программы.

Обобщением рассматриваемого способа задания перевода с помощью двух грамматик является понятие СУ - схемы, которое может быть определено следующим образом.

Определение. Схемой синтаксически управляемого перевода (СУ-схемой) называется совокупность пяти объектов:

T = {Va,Vтвх,Vтвых,Q,<I>},

где Va - множество нетерминальных символов,

Vтвх- множество терминальных символов, используемых для построения

входных цепочек,

Vтвых- множество терминальных символов, используемых для построения

выходных цепочек,

<I>-начальный символ, <I>  Va,

Q - множество правил вида <A> -> a ,b,

где <A> принадлежит Va, a (Va U Vтвх)*, b  (Va U Vтвых)* и

нетерминалы, входящие в цепочку b образуют перестановку

нетерминалов цепочки a .

Из приведенного определения следует, что каждое правило СУ- схемы должно включать цепочку, построенную из символов входного алфавита и нетерминальных символов, и цепочку, построенную из символов выходного алфавита и нетерминальных символов, и что в эти цепочки должны входить одни и те же нетерминалы. То обстоятельство, что основой СУ - схемы являются две грамматики, устанавливается следующим определением:

Определение. Если T = {Va,Vтвх,Vтвых,Q,I} СУ-схема, то грамматика

Г = {Va,Vтвх,R, I},

где R = {<A>-> a |<A> -> a ,b принадлежит Q},

называется входной грамматикой СУ-схемы Т, а грамматика

Г'={Va,Vтвых,R',I},

где R' = {<A> -> b | <A>-> a ,b принадлежит Q}

называется выходной грамматикой СУ-схемы Т.

С помощью СУ - схемы можно строить пары соответствующих цепочек. Такое построение называется выводом СУ -схемы, а получаемые пары цепочек - выводимыми парами.

Определение. Парой, выводимой с помощью заданной СУ-схемы, называют любую пару, которая может быть построена с применением следующих правил:

1) (<I>,<I>) - выводимая пара,

2) если (a <A>b ,a '<A>b ') - выводимая пара и выделенные нетерминалы соответствуют друг другу и в Q существует правило <A>-> g ,g ', то

(ag b , a 'g 'b ') является выводимой парой.

Это записывается так:

(a <A>b ,a '<A>b ') ==> (ag b ,a 'g 'b ').

Последовательность выводимых пар обозначим как прежде:

(a <A>b ,a '<A>b ') ==>* (wm p ,w 'm 'p ').

4.1.2. Перевод, определяемый СУ-схемой.

С помощью понятия выводимая пара можно определить перевод, задаваемый СУ - схемой.

Определение.

Переводом С(T), определяемым СУ-схемой Т назовем множество пар, состоящих из входной и выходной цепочек, выводимых из пары, включающей два начальных символа.

С(T) = {(a ,b ) | (<I>,<I>) ==>* (a ,b ) и a Vтвх*, b Vтвых*}

В качестве примера рассмотрим СУ-схему, заданную следующим образом:

T4.1: Va = {<I>,<A>}, Vтвх = {0,1},Vтвых = {a,b}

Q = { <I> -> 0<A><I>, <I><A>a;

<A> -> 0<I><A>, <A><I>a;

<I> -> 1, b;

<A> -> 1, b

}.

Эта схема определяет перевод, входные слова которого состоят из нулей и единиц, а выходные из букв а,b. Нулям входной цепочки должны соответствовать буквы a, а единицам - буквы b выходной цепочки, причем расположение символов в выходной цепочке должно быть

зеркальным по отношению к соответствующим символам входной цепочки. Вывод в рассматриваемой СУ - схеме может, например, иметь вид:

(<I>,<I>) ==> (0<A><I>,<I><A>a) ==> (0<A>0<A><I>,<I><A>a<A>a) ==>

==>(0<A>00<I><A><I>,<I><A><I>aa<A>a)==>*==>*(0100111,bbbaaba)

4.1.3. Простая СУ - схема.

Приведенное определение СУ - схемы не накладывает никаких ограничений на правила, кроме необходимости совпадения нетерминалов во входной и выходной частях правила. Для построения детерминированных устройств, осуществляющих перевод цепочек, используются СУ - схемы с дополнительными ограничениями на вид правил, которые определяются так.

Определение.

СУ-схема Т = {Va,Vтвх,Vтвых,Q,I} называется простой, если для каждого правила <A>->a ,b из Q соответствующих друг

другу вхождения нетерминалов встречаются в a и b в одном и том же порядке.

Определение.

Перевод называется простым СУ-переводом, если он определяется

простой СУ-схемой.

В качестве примера простой СУ - схемы, приведем СУ - схему Т4.2, которая задает перевод в виде множества постфиксных и соответствующих им инфиксных выражений.

T4.2: Va = {E,T,F}, Vтвх = {+,*,a}, Vтвых = {+,*,a,(,)}

Q = { E -> ET+ , E+T; E->T , T;

T->TF* , T*F; T->F , F;

F->E , (E); F->a , a; }.

Вывод в этой СУ - схеме, выполняемый путем применения правил к самым левым нетерминалам промежуточных цепочек, имеет вид:

(E,E) ==> (T,T) ==> (TF*,T*F) ==> (FF*,F*F) ==>(aF*,a*F) ==> (aE*,a*(E)) ==>

(aET+*,a*(E+T))==> ==> (aTT+*,a*(T+T)) ==> (aFT+*,a*(F+T)) ==>

==> (aaT+*,a*(a+T)) ==> (aaF+*,a*(a+F)) ==> ==> (aaa+*,a*(a+a))

Другим примером простой СУ - схемы может служить СУ - схема Т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.1.4. Построение простой СУ - схемы.

В общем случае построение СУ - схемы для заданного перевода представляется более сложной задачей, чем построение двух грамматик, поскольку при этом необходимо учитывать связь или соответствие между этими грамматиками. Однако, для простых СУ - схем задача построения

оказывается проще, благодаря тому, что расположение нетерминалов во входной и выходной цепочках правил должно быть одинаковым. Построение простой СУ - схемы целесообразно начинать с построения грамматики, определяющей входной язык. Такая грамматика должна быть входной грамматикой искомой СУ - схемы. Построение выходной грамматики можно совместить с построением правил СУ - схемы. Учитывая, что нетерминалы входной цепочки должны повторяться в выходной цепочке в том же порядке, перенесем все нетерминалы из входной цепочки в выходную и расставим в ней выходные терминальные символы. При этом правила,

состоящие только из нетерминалов, оказываются одинаковыми во входной и выходной грамматиках.

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

Г4. 1: Vт = {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>,

<C> -> +<A><C>, <A>+'<C>,

<C> -> $, $}.

Чтобы в первом приближении убедиться в правильности построения СУ - схемы, выполним вывод входной цепочки ((x+x)+x) и соответствующей ей выходной цепочки, используя

построенные правила.

(<A>,<A>) ==> ((<B>),<B>) ==> ((<A><C>),<A><C>) ==> (((<B>)<C>,<B><C>) ==>

(((<A><C>)<C>),<A><C><C>) ==>(((x<C>)<C>),x<C><C>) ==> (((x+<A><C>),x'x'+'<C><C>) ==>

(((x+x+<C>)<C>), x'x'+'<C><C>) ==> (((x+x)<C>),x'x'+'<C>) ==> (((x+x)+<A><C>),x'x'+'<A>+'<C>)

==> (((x+x)+x<C>),x'x'+'x'+'<C>) ==> (((x+x)+x),x'x'+'x'+').

Полученный результат показывает, что постфиксная запись для рассматриваемой входной цепочки построена правильно.

Транслирующие грамматики

Основой построения СУ -схем перевода является использование двух грамматик, с помощью которых осуществляется синхронный вывод входной и выходной цепочек. Построение транслирующих грамматик предполагает применение другого подхода, который предусматривает использование одной грамматики и разрешает включение как входных, так и выходных

символов в каждое правило такой грамматики.

Определение. Транслирующей грамматикой (Т -грамматикой) называется КС-грамматика, множество терминальных символов

которой разбито на множество входных символов и множество

выходных символов, которые называются также символами действия.

Примером Т - грамматики может служить следующая грамматика:

Г4.1: Vтвх = {a,b,c}, Vтвых = {x,y,z}, Va = { I,A}

R = {<I> -> a<I>x<A>,

<I> -> z,

<A> -> <A><C>,

<A> -> by

}.

Чтобы не возникало путаницы в случае использования одинаковых символов во входном и выходном алфавитах, условимся выделять выходные символы фигурными скобками.

С использованием таких обозначений правила грамматики ГТ4.1 имеют вид:

R = {<I>->a<I>{x}<A>,

<I>->{z},

<A>-><A>c,

<A>->b{y}

}.

Вывод в транслирующих грамматиках выполняется по тем же правилам, что и в обычных КС - грамматиках. Например, в рассматриваемой грамматике из начального символа может

быть выведена следующая цепочка:

<I> ==> a<I>{x}<A> ==> a{z}{x}<A> ==> a{z}{x]b{y}

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

цепочки символов, заключенные в фигурные скобки, можно интерпретировать как имена процедур, выполнение которых производит требуемый эффект на выходе. При описании

перевода обычно предусматривают, что каждый символ действия представляет собой процедуру, осуществляющую передачу символа, заключенного в фигурные скобки, на выход. Когда нужно подчеркнуть, что используется такая интерпретация символов действия, то Т - грамматику называют грамматикой цепочного перевода.

4.2.1. Входная и выходная грамматики заданной транслирующей граммагики.

Из каждой Т - грамматики можно получить две обычных грамматики, одна из которых позволяет строить входные цепочки, а другая - выходные. Правила построения таких грамматик можно сформулировать следующим образом.

Определение. Если из правил транслирующей грамматики ГТ удалить выходные символы, то получим входную грамматику ГТвх для заданной грамматики. Если из правил заданной транслирующей грамматики удалить входные символы, то получим выходную грамматику ГТвых заданной транслирующей грамматики ГТ. Язык, порождаемый грамматикой ГТвх, называется входным языком заданной транслирующей грамматики, а язык, порождаемый ГТвых , называется выходным языком заданной транслирующей грамматики ГТ.

Цепочки символов, получаемые путем вывода в Т - грамматике, содержат как символы входного алфавита, так и символы выходного алфавита - символы действия. Каждую такую цепочку можно представить как пару, состоящую из входной и выходной цепочки.

Определение. Если из цепочки символов a , полученной путем вывода в заданной Т -грамматике , исключим все выходные символы, то получим цепочку a1, которую назовем входной цепочкой. Если же из цепочки a исключим все символы входного алфавита, то в результате получим цепочку a2, которую назовем выходной цепочкой, порождаемой Т - грамматикой . Цепочки a1 и a2 образуют пару, выводимую в заданной Т - грамматике.

4.2.2. Построение транслирующей грамматики по СУ - схеме.

Определение. Множество пар цепочек, выводимых с помощью правил заданной Т - грамматики, образуют перевод, определяемый этой грамматикой.

Последнее определение позволяет нам сделать вывод, что один и тот же перевод может быть задан как с помощью СУ - схемы, так и с помощью Т - грамматики. Эти два способа задания являются равноправными и, более того, они допускают преобразование друг в друга.

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

Утверждение. Для каждой простой СУ-схемы Т можно построить транслирующую грамматику ГТ такую, что переводы, порождаемые СУ - схемой и Т - грамматикой, совпадают.

C(T) = C(ГТ)

Чтобы показать справедливость этого утверждения, опишем способ построения Т - грамматики по заданной СУ - схеме.

Допустим, что задана СУ - схема

Т = {Vтвх, Vтвых,Va,Q,I}

и требуется построить Т - грамматику

Г~ = {V'твх,V'твых,V'a,R,I}.

Для того чтобы получить тот же самый перевод, необходимо, чтобы

Vтвх = Vтвх', Vтвых = Vтвх', Va = Va'.

Рассмотрим преобразование правила из множества Q СУ - схемы A->a ,b , где цепочки

a = xоAох1А1...xnAn и b = yоAоу1A1...уnAn,

и поставим в соответствие этому правилу правило грамматики в виде:

А -> xоуоAох1у1A1...xnynAn.

Это можно сделать всегда, поскольку СУ - схема - простая и в каждом ее правиле используются одни и те же нетерминалы в одном и том же порядке. Рассмотренное построение обеспечивает включение во входную цепочку выходных символов цепочки, порождаемой СУ-схемой. Следовательно, каждый шаг вывода в Т - грамматике будет добавлять к выводимой цепочке те же символы, что и СУ - схема добавляет к выходной цепочке.

Применение описанных положений рассмотрим на примере построения Т - грамматики по СУ - схеме Т4.4.

Используя фигурные скобки для представления выходных символов и выполняя пре-образование, получаем грамматику

Г4.1:

R = {<A> -> x{x},

<A> -> (<B>),

<B> -> <A><C>,

<C> -> +<A>{+}<C>,

<C> -> $

}.

Перевод цепочки ((x+x)+x) с применением правил построенной грамматики может быть получен с помощью следующего вывода:

<A> ==> <A><C> ==> (<B>)<C> ==> (<A><C>)<C> ==>

((<B>)<C>)<C> ==> ((<A><C>)<C>)<C> ==> ((x{x}<C>)<C> ==> ((x{x}+<A>{+}<C>)<C>)<C> ==>

((x{x}+x{x}{+}<C>)<C>)<C> ==>((x{x}+x{x}{+})<C>)<C> ==>

((x{x}+x{x}{+})+<A>{+}<C>)<C> ==>

((x{x}+x{x}{+})+x{x}{+}<C>)<C> ==>

((x{x}+x{x}{+})+x{x}{+})<C> ==> ((x{x}+x{x}{+})+x{x}{+}).

Исключая из полученной цепочки вначале выходные, а затем входные символы, получаем выводимую пару

((x+x)+x,{x}{x}{+}{x}{+}),

которая совпадает с результатом вывода в заданной СУ - схеме.