497
правок
Изменения
Нет описания правки
{{Определение
|definition =
'''Транслирующий символ''' {{---}} нетерминал, который раскрывается в $\varepsilon$ и в момент раскрытия выполняет какое-то действие, которое с ним связано. Для простоты , будем писать действия пишутся в фигурных скобках в том месте, где это нужно.
}}
$
E \to T + E \mid T \\
T \to F \times T \mid F \\
F \to n \mid (E)
$
Заменим правило $T \rightarrow T*F$ на следующее: $T \rightarrow T*F\{T_0.val=T_1.val*F.val\}$, где $\{T_0.val=T_1.val*F.val\}$ {{---}} транслирующий символ. Аналогично к $F \rightarrow n$ добавляется $\{F.val = n.val\}$.
Часто бывает неоптимально для каждого действия заводить транслирующий символ(добавляется лишний нетерминал в грамматику). Поэтому при простом присваивании(копировании) атрибутов разрешают не выносить транслирующий символ и заменяют его списком действий, привязанным к правилу.
Обычно, транслирующий символ может работать только со своими атрибутами. Тогда перепишем правило $T \rightarrow T*F$ в виде:
$T \rightarrow T*F\ \{MUL \ res = op_1*op_2\}$
И ассоциируем с ним следующий список действий, которые будут выполняться в особом порядке, рассмотренном далее.
$
MUL.op_1 = T_1.val \\
MUL.op_2 = F.val \\
T_0.val = MUL.res
$
Атрибуты делятся на '''наследуемые''' и '''синтезируемые'''.
{{Определение
|definition =
'''Атрибут''', значение которого зависит от значений атрибутов братьев узла или атрибутов родителя, называется '''наследуемым'''. Если же значение атрибута зависит от значений детей узла или от других арибутов этого узла, то атрибут называется '''синтезируемым'''.
}}
В нашем примере видно, что $.val$ зависит только от детей, то есть синтезируемый атрибут. Результат умножителя ($MUL.res$) зависит только от атрибутов атрибутов самого умножителя ($MUL.op_1$ и $MUL.op_2$), а значит тоже является синтезируемым.
{{Определение
|definition =
Грамматика называется '''L-атрибутной''', если значения наследуемых атрибутов зависят только тот родителей и братьев слева (то есть не зависят от значений атрибутов братьев справа).
}}
{{Определение
|definition =
Грамматика называется '''S-атрибутной''', если с атрибутами выполняются только операции присваивания значений других атрибутов, а внутри транслирующих символов происходят обращения только к атрибутам этого транслирующего символа.
}}
При реализаци методом рекурсивного спуска, каждому нетерминалу соответствует некая рекурсивная функция, которая ранее возвращала дерево разбора соответствующего узла. Теперь же функция, соответствующая некоторому нетерминалу $A$, будет принимать в качестве аргументов его наследуемые атрибуты, а возвращать его синтезируемые атрибуты.