Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Доки / T_ALG / 1 / FOMICHEV / Section5 / part522

.html
Скачиваний:
6
Добавлен:
17.04.2013
Размер:
16.34 Кб
Скачать

s77 Пред.Страница След.Страница Раздел Содержание 5.2.2. Пример использования АТ-грамматики.     Рассмотрим еще один пример использования АТ-грамматик. Допустим, что необходимо описать процесс трансляции инфиксных выражений без скобок, построенных из идентификаторов и бинарных операций сложения и вычитания, синтаксис которых задается схемой следующей грамматики. Г 5. 2 :<E> Ю i<R>, <R> Ю +i<R>,

<R> Ю -i<R>,

<R> Ю .     В приведенных правилах символ i представляет идентификатор переменной, значением которого является указатель на элемент таблицы переменных (ТП). Результатом трансляции выражений, порождаемых этой грамматикой, должна быть последовательность операторных символов - атомов, определяющих как последовательность действий, так и операнды каждого действия. Учитывая это обстоятельство, зададим требуемый перевод в виде следующей грамматики.

  Г 5. 3 : <E> Ю i<R>,  <R> Ю +i{СЛОЖ}<R>,

 <R> Ю -i{ВЫЧИТ}<R>,

 <R> Ю .     Символы действия в правилах этой грамматики расположены так, чтобы результат можно было передать на выход, как только будут построены оба операнда рассматриваемой операции. Чтобы обеспечить передачу на выход не только символов операций, но и указателей на переменные, с которыми выполняются операции, припишем символам грамматики атрибуты и построим АТ-грамматику.

    Каждому символу, обозначающему идентификатор, припишем атрибут, представляющий указатель на ТЗ. Каждому символу действия придадим три наследуемые атрибута, которые должны определять операнды и результат выполнения операции. При последовательном вычислении выражений образуются промежуточные результаты, которые необходимо сохранять на время подготовки следующего операнда. Условимся о том, что промежуточные результаты должны сохраняться в таблице значений (ТЗ). Для записи промежуточного результата нужно иметь указатель на очередной свободный элемент ТЗ и изменять его значение после того, как запись произведена. Для изменения этого указателя воспользуемся введенной в предыдущем примере функцией СЛЕДУК. Если рассматриваемая грамматика описывает трансляцию подвыражений, являющихся частью других конструкций языка, то после построения арифметического выражения в ТЗ могут записываться другие величины. Следовательно, после трансляции выражения кроме последовательности атомов необходимо в качестве результата получить указатель на первый свободный элемент ТЗ после выделения места в ней для записи промежуточных результатов. Чтобы получить такой указатель, припишем начальному символу грамматики <E> один синтезируемый атрибут %a и один наследуемый атрибут /b. Начальное значение наследуемого атрибута должно быть указателем на первый свободный элемент ТЗ до записи промежуточных результатов. Значение синтезируемого атрибута должно быть сформировано при завершении трансляции и быть равным указателю на первый свободный элемент ТЗ после записи промежуточных результатов. Нетерминальный символ грамматики <R> используется для передачи первого операнда каждой выполняемой операции. Чтобы осуществить передачу указателя на этот операнд, припишем <R> наследуемый атрибут /с. Учитывая, что первый операнд может быть промежуточным результатом, который был записан в ТЗ, припишем <R> еще один наследуемый атрибут /d для передачи на следующий шаг вывода указателя на очередной свободный элемент ТЗ, а для того, чтобы передать на выход значение указателя на первый свободный элемент ТЗ после завершения трансляции, припишем ему еще один синтезируемый атрибут %e. Полагая, что формирование элементов таблицы ТЗ выполняется символами действия, схему искомой АТ-грамматики можно представить в виде:

  Г 5. 4 : <E>%a/b Ю i/x<R>%e/c/d

                   !! c := x; a := b; a :=e;

<R>%e1/c1/d1 Ю +i/x1{СЛОЖ/f1/g1/h1}<R>%e2/c2/d2

                   !! f1 := c1;  g1 := x1;  h1 := d1; c2 := d1; d2 := СЛЕДУК; e1 := e2;

<R> %e3/c3/d3 Ю -i/x2{ВЫЧИТ/f2/g2/h2}<R>%e4/c4/d4

                  !! f2 := c3; g2 := x2; h2 := d3; c4 := d3; d4 := СЛЕДУК; e3 := e4;

<R>%e5/c5/d5 Ю .

                   !! e5 := d5;     Чтобы получить результат трансляции входной цепочки i-i+i для идентификаторов с указателями 22, 24, 26 и указателем первого свободного элемента ТЗ, равным 28, построим вывод в грамматике Г.     Вывод                                                                     Отложенные вычисления 1.     <E>%a/28

2.     i/22<R>%e/c/d

             !! c := 22; d := 28;                                                 a := e;

3.     i/22-i/24{ВЫЧИТ/f2/g2/h2}<R>%e4/c4/d4

             !! f2 := 22; g2 := 24; h2 := 28; c4 := 28;

             !! d4 :=30;                                               a := e; e := e4;

4.     i/22-i/24{ВЫЧИТ/22/24/28}+i/26

                          {СЛОЖ/f1/g1/h1}<R>%e2/c2/d2

             !! f1 := 28; g1 := 26; h1 := 30; c2 := 30;

             !!  d2 := 32;                                                a := e; e := e4; e4 := е2;

5.     i/22-i/24{ВЫЧИТ/22/24/28}+i/26

                       {СЛОЖ/26/28/30}.

             !!e2 := 32;                                                                a = 32;     Приведенный вывод показывает, что значение синтезируемого атрибута нетерминала <R> определяется только на пятом шаге вывода с помощью присваивания с2 := 32, которое приводит к выполнению цепочки незавершенных вычислений. Результатом этих вычислений является определение атрибута начального символа a := 32, который является одним из результатов трансляции. Пред.Страница След.Страница Раздел Содержание

 

Соседние файлы в папке Section5