Пред.СтраницаСлед.СтраницаРаздел Содержание
5.1.3. Пример АТ-грамматики
Атрибутные транслирующие грамматики могут быть использованы для
построения выводов, в которых построение цепочки совмещается с вычислением
значений атрибутов. Чтобы различать атрибуты в правилах вывода, условимся
записывать синтезируемые атрибуты с префиксом в виде знака процента (%), а наследуемые - с префиксом в виде
наклонной черты (/). Например, если
символ <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.
В дальнейшем правила вычисления атрибутов условимся записывать непосредственно за правилами вывода или на отдельной строчке, отделяя их от правил вывода двумя восклицательными знаками (!!).
В качестве первого примера рассмотрим АТ-грамматику, описывающую трансляцию выражений, состоящих из констант C, в значение заданного выражения.
Допустим, что у каждого нетерминала <E>, <T>, <P> имеется по одному атрибуту, принимающему целочисленные значения. Терминальный символ C также имеет один атрибут, определяющий значение константы и принимающий целочисленные значения. Операционный символ грамматики {ответ} имеет наследуемый атрибут с целочисленной областью значений. Начальным символом грамматики служит символ <S>.
В тех
случаях, когда атрибуты символов действия должны передаваться на выход вместе с
этими символами действия, как это имеет место в рассматриваемом примере,
условимся записывать атрибуты символов действия внутри фигурных скобок.
Г 5. 0 : <S> ®<E>%a{ответ/b}
!! b := a
<E>%d ®<E>%e+<T>%f
!! d := e+f
<E>%g ®<T>%h
!! g := h
<T>%i ®<T>%j*<P>%k
!! i := j*k
<T>%m ®<P>%n
!! m := n
<P>%p ®(<E>%q)
! p := q
<P>%r ®C/s
!! r := s.