Изменения

Перейти к: навигация, поиск

Атрибутные транслирующие грамматики

109 байт добавлено, 19:59, 4 июня 2015
Нет описания правки
Часто, осуществляя разбор, мы хотим извлечь какие-то данные или чтопроизвести какие-то сделатьдействия, а не просто выяснить, разбирается ли текст в данной грамматике.Вообще говоря, сначала можно получить дерево разборыразбора, а потом уже, обойдя дерево разбораобходя его, по нему производить выполнять какие-то действия.В этом случае происходит дублирование функционала: промежуточное сохранение данных в виде дерева разбора не нужно, а иногда это дерево его просто слишком расточительно хранить в памятицеликом.
В связи с этим хочется какие-то действия производить уже на этапе разбора.
Такой подход называется '''Синтаксически управляемой трансляцией'''.
{{Определение
|definition =
'''Синтаксически управляемая трансляция''' {{---}} это трансляция, при которой в процессе разбора строки сразу выполняются какие-то действия, не используя промежуточное представление без использования промежуточного представления в виде дерева разбора.
}}
{{Определение
|definition =
'''Атрибут''' {{---}} дополнительные данные, ассоциированные с грамматическими символами.Если $X$ представляет собой символ, а $a$ — один из его атрибутов, то значение $а $ в некотором узле дерева разбора, помеченном $X$, записывается как $X.a$. Если узлы дерева разбора реализованы в виде записей или объектов, то атрибуты $X $ могут быть реализованы как поля данных в записях, представляющих узлы $X$. Атрибуты могут быть любого вида: числами, типами, таблицами ссылок или строками. Атрибуты делятся на '''наследуемые''' и '''синтезируемые'''.
}}
{{Определение
|definition =
Дерево разбора, имеющее вычисленные атрибуты в каждом узлекоторого атрибуты уже вычислены, называется '''аннотированным''', а процесс вычисления этих атрибутов - '''аннотированием''' дерева разбора.
}}
{{Определение
|definition =
'''Транслирующий символ''' {{---}} нетерминал, который раскрывается в $\varepsilon$ и в момент раскрытия выполняет какое-то действие, которое с ним связано. Для простоты, будем писать действия Действия пишутся в фигурных скобках в том месте, где это нужнорядом с транслирующим сомволом.
}}
$
Заметим, что для нисходящего разборщика нужно будет сперва [[Устранение_левой_рекурсии| устранить левую рекурсию]]:
$
Стоит отметить, что не существует гарантии наличия даже одного порядка обхода для вычисления всех атрибутов дерева разбора, при котором вычислятся все атрибуты в узлах дерева разбора. Рассмотрим, например, для примера следующие нетерминалы $A$ и $B$:
{| style="background-color:#CCC;margin:0.5px"
{{Определение
|definition =
'''Атрибут''', значение которого зависит от значений атрибутов детей данного узла или от других атрибутов этого узла, то атрибут называется '''синтезируемым'''.
}}
{{Определение
|definition =
Грамматика называется '''S-атрибутной''', если с атрибутами выполняются только операции присваивания значений других атрибутов, а внутри транслирующих символов происходят обращения только к атрибутам этого транслирующего символа. То есть в грамматике используются только синтезируемые атрибуты. Дерево разбора для такой грамматике всегда может быть аннотировано путем выполнения семантических правил снизу вверх, от листьев к корню.
}}
</wikitex>
==Пример S-атрибутной грамматики.==
<wikitex>
Выпишем синтексически синтаксически управляемое определение для грамматики арифметических выражений с операторами $+$ и $*$:
{| style="background-color:#CCC;margin:0.5px"
|}
В нашем примере видно, что $.val$ зависит только от детейв дереве разбора, то есть это синтезируемый атрибут. Результат умножителя ($MUL.res$) зависит только от атрибутов атрибутов самого умножителя ($MUL.op_1$ и $MUL.op_2$), а значит тоже является синтезируемым(аналогично с сумматором $ADD$).
[[Файл:3mul5add4.png|600px|thumb|center|аннотированное дерево разбора для '''3*5+4''']]
После такого разбора, в $S.val$ будет лежать вычисленное значение выражения. Можно, например сразу напечатать его, добавив правило к нему правило $\{print(S.val)\}$.
Хотя всегда можно переписать синтаксически управляемое определение таким образом, чтобы использовать использовались только синтезируемые атрибуты, зачастую более удобно и естественно будет воспользоваться также и наследуемыми атрибутами.
</wikitex>
{{Определение
|definition =
Грамматика называется '''L-атрибутной''', если значения наследуемых атрибутов зависят только тот от родителей и братьев слева (то есть не зависят от значений атрибутов братьев справа).
}}
</wikitex>
Общедоступный генератора разборщиков ANTLR<ref>[http://www.antlr.org/ ANTLR {{---}} Parser generator]</ref> поддерживает синтаксически управляемое определение. Рассмотрим для примера грамматику арифметических выражений.
Вне продукций граматики грамматики бывает нужно вставить в сгенерированный разборщик(пример для Java) package или , import, а также некоторые поля и методы. Это делается с помощью '''@header''' и '''@members''':
grammar Expr;
497
правок

Навигация