Формальные языки, грамматики и автоматы / part5417
.htmlpart5417 Пред.СтраницаСлед.Страница Раздел Содержание
5.4.7. Построение восходящих атрибутных преобразователей Детерминированные атрибутные преобразователи могут работать не только на основе нисходящего, но и на основе восходящего метода. Особенность процедуры построения восходящих атрибутных преобразователей заключается в том, что перевод, реализуемый такими преобразователями должен быть задан в форме S-атрибутной грамматики, которая определяется следующим образом.
Определение. L-атрибутная грамматика в форме простого присваивания, у которой все атрибуты нетерминальных символов являются синтезируемыми атрибутами,
называется S-атрибутной грамматикой. Необходимость использования только синтезируемых атрибутов вытекает из способа работы восходящего преобразователя, соответствующего построению дерева вывода в направлению от листьев к корню дерева, при котором передача наследуемых атрибутов оказывается невозможной.
Свойства L-атрибутной грамматики гарантируют, что в правилах вычисления синтезируемых атрибутов нетерминала <X> не используются другие синтезируемые атрибуты этого символа, и что в правилах вычисления наследуемых атрибутов, находящихся в правых частях правил грамматики, используются только атрибуты символов, расположенных в правилах грамматики слева от символа с рассматриваемым
атрибутом.
В качестве примера приведем S-атрибутную грамматику, построеннуую по грамматике Г 3. 14, которая имеет вид: Г5.7: <E>%a ® <E>%b+T%c{СЛЕДУК}%d{СЛОЖИТЬ/x /y %z}
!! x = b; y = c; (a, z) = d;
<E>%g ® <T>%h
!! g = h;
<T>%k ® (<E>%l)
!! k = l;
<T>%n ® i/m
!! n = m;
Эта грамматика для выражения строит последовательность атомов, атрибутами которых являются указатели на элементы памяти, хранящие значения операндов и результата.Значения указателей операндов передаются от терминалов i через атрибуты нетерминальных символов на выход. Указатели на элементы памяти, выделяемые для
промежуточных результатов, формируются символом действия с функцией СЛЕДУК. Если задана постфиксная транслирующая грамматика в виде S-атрибутной грамматики, и если входная грамматика заданной транслирующей грамматики относится к подклассу грамматик, порождающих детерминированные языки, например, к подклассу LR(0) или
SLR(1), то для нее можно построить детерминированный восходящий атрибутный преобразователь. Такой преобразователь строится путем расширения восходящего распознавателя цепочки входной грамматики.
Расширение заключается в том, что каждому грамматическому вхождению в стеке выделяются дополнительные элементы памяти для хранения атрибутов. К операциям свертки добавляются действия, связанные с вычислением значений атрибутов, их записью в стек и удалением из стека, а к операциям переноса добавляются действия записи атрибутов в стек.
Например, для грамматики Г5.7 операции Свертка(4) и Свертка(2) должны заключаться в замене символа, находящегося в вершине стека. При выполнении операции Свертка(3) необходимо прочитать 4 элемента из стека и сохранить значение третьего элемента, соответствующего атрибуту l, затем записать в стек символ <T> с атрибутом n, присвоить этому атрибуту значение l. Выполнение операции Свертка(1) можно описать следующим образом:
1) выполнить действие {СЛЕДУК}%d и присвоить значение атрибута d атрибуту z,
2) прочитать из стека символ n, его атрибут, а затем присвоить значение этого атрибута атрибуту y,
3) удалить из стека один символ,
4) прочитать из стека символ и его атрибут, а затем присвоить этот атрибут атрибуту x,
5) записать в стек символ <E> с одним атрибутом и присвоить этому атрибуту значение атрибута с,
6) передать на выход атом {СЛОЖИТЬ/x /y %z}, атрибуты которого определены.
Атрибутный преобразователь, построенный для грамматики Г5.7, должен работать в соответствии с таблицами переходов и действий распознавателя (Табл. 3.4 и Табл. 3.5). Последователь ность шагов, выполняемых атрибутным преобразователем при трансля ции входной цепочки i5 + i7+- можно изобразить в следующем виде.
1. В исходном состоянии в стеке находится маркер дна, а на входе - заданная цепочка.
Стек Вход Выход h0 i/5 + i/7 |-- - 2. По таблицам 3.4 и 3.5 находим, что необходимо выполнить операцию переноса. В результате имеем:
Стек Вход Выход h0 5 i + i/7 |-- - 3. По таблицам определяем, что следует выполнить операцию Свертка(4). Получаем:
.
Стек Вход Выход h0 5 T2 + i/7 |-- - 4. Следующей должна выполняться операция Свертка(2).
Стек Вход Выход h0 5 Ex + i/7 |-- - 5. После выполнения операции переноса имеем:
Стек Вход Выход h0 5 Ex + i/7 |-- - 6. Выполняя операцию переноса в стек символа i с атрибутом
получаем:
.
Стек Вход Выход h0 5 Ex + 7 i |-- - 7. Согласно таблицам очередной операцией должна быть Свертка(4), после выполнения которой имеем:
Стек Вход Выход h0 5 Ex + 7 T1 |-- - 8. По таблицам находим, что следующей должна выполняться операция Свертка(1), поэтому, полагая, что функция СЛЕДУК возвращает значение 22, имеем:
.
Стек Вход Выход h0 22 Ex |-- {СЛОЖ/5/7/22} 9. Входной символ, находящийся в вершине стека в соответствии с таблицами работы определяет выполнение операции Допустить, которая говорит об успешном завершении работы преобразователя.
Пред.СтраницаСлед.Страница Раздел Содержание