Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lects_1.pdf
Скачиваний:
25
Добавлен:
09.06.2015
Размер:
731.64 Кб
Скачать

(s0, $, h0, aaa*+) |-- (s0, $, $, aaa*+).

Результатом работы преобразователя является выходная цепочка aaa*+, представляющая постфиксную запись заданной входной цепочки.

4.9.6. Порядок построения детерминированного магазинного преобразователя

В общем случае, если заданы входной и выходной языки, то порядок построения детер-

минированного магазинного преобразователя можно представить следующим обра-

зом:

1.Построить грамматику, описывающую цепочки входного языка.

2.Проверить принадлежность этой грамматики классу LL(1)- грамматик. Если условия LL(1) - грамматики не выполняются, то попытаться выполнить преобразование или вернуться к п.1 и построить другую грамматику.

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

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

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

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

5.Атрибутные транслирующие грамматики (AT-грамматики)

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

55

АТ-грамматики отличаются от транслирующих грамматик тем, что символам грамматики приписываются атрибуты, отражающие семантическую информацию, а правилам грамматики сопоставляются правила вычисления значений атрибутов. Если входной язык предусматривает использование константы C, то в качестве атрибута константы можно взять ее значение. Условимся записывать значение константы за ее обозначением с разделителем в виде косой черты, например, C/5. Если в Т-грамматике используются операционные символы {сложить}, то в качестве атрибутов этого символа можно взять значения операндов и результата. Обозначая атрибуты символами x, y, z, операционный символ с атрибутами запишем в виде {сложить}/x/y/z.

5.1. Определение AT-грамматик

В AT-грамматиках используются атрибуты двух видов: наследуемые

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

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

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

Транслирующую грамматику называют атрибутной грамматикой или AT-

грамматикой если:

1.Символам грамматики приписаны один или несколько атрибутов и для каждого атрибута определено множество допустимых значений.

2.Атрибуты могут быть наследуемыми и синтезируемыми.

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

4.Для наследуемых атрибутов начального символа должны быть заданы начальные значения.

56

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

5.2. Пример АТ-грамматики

Атрибутные транслирующие грамматики могут быть использованы для построения выводов, в которых построение цепочки совмещается с вычислением значений атрибутов. Чтобы различать атрибуты в правилах вывода, условимся записывать синтезируемые атрибуты с префиксом в виде знака процента (%), а наследуемые - с префиксом в виде наклонной черты (/). Например, если символ <X> имеет один синтезируемый атрибут a и два наследуемых атрибута b, c, а символы <Y> и <Z> имеют по одному насле-

дуемому атрибуту d и e, то правило <X> <Y><Z> может быть записано в виде:

<X>%a/b/c <Y>/d<Z>/e.

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

a := b + d; d := 2 * c; e := b.

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

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

Допустим, что у каждого из нетерминльных символов <E>, <T> и <P> имеется по одному атрибуту, принимающему целочисленные значения. Терминальный символ C имеет один атрибут, определяющий значение константы и принимающий целочисленные значения. Операционный символ грамматики {ответ} имеет наследуемый атрибут с целочисленным эначением. Начальным символом грамматики служит символ <S>.

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

57

Г 5. 0: <S> <E>%a{ответ/b}

(1)

!! b := a

 

<E>%d <E>%e+<T>%f (2)

!! d := e+f

 

<E>%g <T>%h

(3)

!! g := h

 

<T>%i <T>%j*<P>%k

(4)

!! i := j*k

 

<T>%m <P>%n

(5)

!! m := n

 

<P>%p (<E>%q)

(6)

! p := q

 

<P>%r C/s

(7)

!!r := s.

5.3.Вычисление значений атрибутов с левым выводом

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

Выполнение совмещенного вывода в приведенной грамматике рассмотрим на примере цепочки C+C*C, содержащей константы со значениями 1, 2, 3.

58

Результаты применения

Список отложенных правил вывода вычислений

1.

<S>

 

 

2.

<E>%a{ответ/b}

(1)

b := a

3.

<E>%e+<T>%f{ответ/b}

(2)

b := a; a := e+f;

4.

<T>%h+<T>%f{ответ/b}

(3)

b := a; a := e+f; e := h ;

5.

<P>%n+<T>%f{ответ/b}

(5)

b := a; a := e+f; e := h; h := n;

6.

C/1+<T>%f{ответ/b}

(7)

b := a; a := e+f; e := h; h := n; n := 1;

7.

C/1+<T>%j*<P>%k{ответ/b}

(4)

b := a; a := 1+f; f := j*k;

8.

C/1+<P>%n*<P>%k{ответ/b}

(5)

b := a; a := 1+f; f := j*k; j := n;

9.

C/1+C/2*<P>%k{ответ/b}

(7)

b := a; a := 1+f; f := j*k; j := n; n := 2;

10.C/1+C/2*C/3{ответ/b}

(7)

b := a; a := 1+f; f := 2*k; k := 3;

11.C/1+C/2*C/3{ответ/b}

 

b := 7

При построении цепочек в строках 2, 3, 4, 5 правила вычисления атрибутов заносятся в список отложенных вычислений. Появление первой константы в выводимой цепочке приводит к выполнению трех правил в списке. Аналогично, сокращение списка отложенных вычислений происходит после получения цепочек в строках 9 и 10. Предполагается, что символ действия {ответ} в строке 11 передает полученное значение атрибута на выход.

Рассмотрим процесс обработки описаний переменных в некотором языке программирования. Допустим, что описание переменных имеет вид:

int X, Y, Z

Условимся, что после обработки описания на входном языке лексический анализатор строит таблицу символьного представления идентификаторов (ТС) и таблицу переменных (ТП). Каждый элемент таблицы переменных состоит из двух полей. В первое поле заносится указатель на строку ТС, в которой хранится идентификатор переменной, а во втором поле должен храниться указатель на строку таблицы значений (ТЗ), в которой должно находиться значение переменной. Связи между этими таблицами имеют вид:

59

Цифрами обозначены указатели на элементы соответствующих таблиц, а пунктирными линиями показаны указатели, значения которых должны быть записаны в ТП после синтаксического анализа. В результате обработки входной строки лексический анализатор заменяет идентификаторы лексемами, каждая из которых состоит из указателя класса переменных (V) и наследуемого атрибута, представляющего собой указатель на соответствующую строку ТП, и входная строка приобретает вид:

int V/10,V/12,V/14.

Пусть в ходе синтаксического анализа цепочки должно поисходить выделение каждой переменной элемента памяти в виде строки ТЗ и занесение указателя этой строки в ТП. Исходным данным для выполнения этих действий является указатель на первый свободный элемент ТЗ. После завершения обработки описаний этот указатель должен изменить значение. Новое значение должно определять первый свободный элемент ТЗ после выделения памяти для переменных.

Синтаксис цепочек рассматриваемого вида может быть задан следующей грамматикой с начальным символом <D>.

60

<D> int V <R> <R> , V <R> <R> $

Начальному символу <D> придадим два атрибута: наследуемый атрибут /b, начальное значение которого зададим в виде указателя на первый свободный элемент ТЗ, и синтезируемый атрибут %a, значением которого должен быть указатель на новый свободный элемент ТЗ после выделения памяти для переменных.

Нетерминальному символу <R>, обозначающему продолжение списка также припишем два атрибута. Один атрибут /g должен быть наследуемым. Он должен передавать значение указателя на ТЗ следующему правилу при выводе. Другой атрибут %f- синтезированный. Он должен использоваться для передачи на выход указателя на первый свободный элемент после выделения памяти переменным. Для каждой переменной в описании нужно записать указатель на свободный элемент ТЗ в соответствующее поле ТП. Допустим, что эти действия выполняет символ действия ФОРМирование Указателя (ФОРМУ), который имеет два наследуемых атрибута, первый из которых определяет положение переменной в ТП, а второй является указателем на первый свободный элемент ТЗ.

Пусть новое значение указателя ТЗ определяется специальной функцией без аргументов

СЛЕДующий УКазатель (СЛЕДУК),

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

Г 5. 1 :

<D>%a/b int V/c{ФОРМУ}/d/e<R>%f/g

(1)

!! d := C; e := b; a := f; g := СЛЕДУК;

 

<R>%h/k, V/l{ФОРМУ}/m/n<R>%j/p

(2)

!! m := l; n := k; h := j; p := СЛЕДУК;

 

<R>%q/r $

(3)

!! q := r;

 

Построим с помощью правил этой грамматики совмещенный вывод цепочки

int V/10,V/12,V/14, записывая под цепочкой – получаемые значения атрибутов, а справа

61

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

Результаты вывода

Отложенные вычисления

1. <D>%a/44

(1)

2. int V/10{ФОРМУ}/10/44<R>%f/45

 

d := 10; e := 44; g := 45

a := f

3. int V/10,{ФОРМУ}/10/44/,V/12{ФОРМУ}

(2)

/12/45<R>%j/46

 

m := 12, n = 45, p = 46;

a := f; f := j;

4. int V/10,{ФОРМУ}/10/44,V/12,{ФОРМУ}

(2)

/12/45,V/14{ФОРМУ}/14/46<R>%j'/47,

 

m' = 14, n' = 46; p' = 47

a := f; f := j; j := j'

5. int V/10,{ФОРМУ}/10/44,V/12,{ФОРМУ}

(3)

/12/45,V/14{ФОРМУ}/14/46

a := f; f := j; j := j'; j' := 47; a = 47

В каждой строке приведенного примера показаны результаты очередного шага вывода, которые могут содержать символы действия с найденными значениями атрибутов. Учитывая, что атрибуты правой части каждого правила являются независимыми величинами, при повторном применении второго правила грамматики для обозначения атрибутов были использованы переменные с апострофами. Приведенные примеры показывают, что результатом вывода с помощью правил атрибутной грамматики является цепочка, состоящая из символов действия и входных символов, каждому из которых приписаны значения атрибутов. Если из заданной AT-грамматики Г удалить все атрибуты, то получим транслирующую грамматику Г', а из каждой цепочки, выведенной в грамматике Г после удаления всех атрибутов, может быть получена цепочка, выводимая в грамматике Г'. Основываясь на этом соответствии, множество пар, состоящих из цепочки входных символов, снабженных атрибутами, и цепочки выходных символов, имеющих атрибуты,

называется атрибутным переводом, определяемым заданной атрибутной грамматикой.

62

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]