Статистические управляемые схемы перевода и атрибутные грамматики.
Формально процесс синтаксического анализа и синтеза объектной программы реализует преобразование синтаксического дерева текста программы на входном языке в текст эквивалентной формы объектной программы. Это преобразование и сложность его программной реализации существенно зависят от выбора объектного языка. Выбор последнего в синтаксически управляемых методах перевода тесно связан не только с синтаксической структурой входного языка, но и ориентирован на неё.
Хорошей теоретической моделью преобразований синтаксического дерева являются простые синтаксически управляемые схемы перевода. Они не учитывают контекстные соотношения в исходной программе, однако позволяют строить синтаксически правильные формы объектных программ. Объектная программа включает в себя понятие программ на объектом языке, семантически эквивалентной исходной программе. Степень адекватности первой программы по отношению ко второй будет зависеть от семантики исходной программы, которая в априори должна быть заложена в семантические процедуры анализа и определять суть семантического анализа и контроля. Обычно при семантическом анализе и контроле ограничиваются проверкой контекстных условий.
В трансляторах интерпретирующего типа проверка некоторых контекстных условий, например, соответствий видов значений, участвующих в операциях часто выполняется при интерпретации объектной программы.
Атрибутные грамматики (А – грамматики) в сочетании с методом синтаксически управляемого перевода позволяют учитывать контекстные условия при отображении синтаксического дерева в объектную программу. Понятие атрибутной трансляционной грамматики (АТ – грамматики), включающие два указанных понятия, будем использовать для построения отображения синтаксического дерева исходной программы в объектную программу.
Понятие атрибутивной трансляционной грамматики (АТ – грамматики), включающие два указанных понятия, будем использовать для построения отображения синтаксического дерева исходной программы в объектную программу.
Определение: КС-грамматика G(VT,VN,P,S) называется атрибутной, если выполняются следующие условия:
1) Каждому символу хVT
VN сопоставлено два непересекающихся множества: множество синтезированных атрибутов А0 (х) и множество унаследованных атрибутов А1(х),А1(S)=
к А
(х)=
х
VT; пусть А(х)=А0(х)
А1(х)
2) Каждый атрибут αимеет множество значений(возможно, бесконечное)
3) С каждым правилом X0→ X1X2…XnР,n≥0, связывается множество семантических правил, которые определяются функциями вида:
:
x
x…x
->
при
≤i≤n и некоторых α
А
(xi), если i=0 или α
А1(xi), i>0, где t=t(i,α)≥0 и αj=αj(i,α)
А(Xkj), 0≤kj=kj(i,α)≤n,i≤j≤t.
Другими словами функция задаёт правило вычисления значения атрибута α символа хi по значениям некоторых атрибутов символов X0,X1,…,Xn. Атрибутная грамматика связывает атрибуты с вершинами синтаксического дерева вывода. Семантические правила вычисления значений атрибутов, соответствующие правилу КС- грамматики, применяются для всех вхождений этого правила в дерево вывода. Синтезированные атрибуты некоторой вершины хранят информацию, которая синтезируется из поддерева этой вершины и передаётся вверх к корню дерева. Унаследованные атрибуты служат для хранения информации, которая передаётся сверху вниз от корня дерева к его листьям. Фактически унаследованные атрибуты определяют контекст, в котором погружена вершина вместе со своим поддеревом.
Контекстно-зависимые условия входного языка должны выражаться через ряд условий, входящих в семантические правила атрибутной грамматики. Эти условия должны выражать соотношения между значениями атрибутов, которые выполняются в дереве вывода правильной программы.
Описание семантики языка с помощью атрибутных грамматик позволяет определить «смысл» исходной программы, как значение одного или нескольких специальных атрибутов корня синтаксического дерева этой программы, т.к. главной задачей в процессе трансляции является получение объектной, то можно считать, что один из специальных атрибутов корня синтаксического дерева получает значение – последовательности операций абстрактной машины, т.е. объектную программу. Удобным формализмом для построения контекстно-свободной структуры объектной программы по синтаксическому дереву исходной программы является аппаратом простых синтаксически управляемых схем (СУ-схем) перевода.
Определение: Пусть G(VT,VN,P,S) – КС грамматика. ∆-множество операционных символов. Каждому правилу A0→x1A1x2A2…xnAnXn+1Р, где Ai
VN, xi+1
VT*,0≤i≤n, будет соответствовать правило A0→y1A1y2A2…ynAnyn+1, yi+1
∆*. Простой СУ – схемой называется пятёрка T=(VT,∆,VN,R,S), где R – множество пар правил (A0→x1A1x2A2…Anxnxn+1,A0→y1A1y2…ynAnyn+1). Обозначим пару таких правил через (A0→α,A0→α').
Множество пар терминальных цепочек (х,у)синхронно выводимых из пары цепочек (S,S) с помощью СУ –правил (A0→α,A0→α') называется простым синтаксически управляемым переводом.
Простая СУ-схема, является частным случаем атрибутикой грамматики. Если считать, что вторая компонента в каждом СУ-правиле определяет синтаксическое правило для вычисления значения специального синтезируемого атрибута, связанного с нетерминалом, стоящим в левой части этой компоненты.
Каждой синтаксически правильной исходной программе х простой СУ- перевод ставит в соответствие цепочку у из операционных символом, которая определяет некоторую контекстно-свободную форму объектной программы. Например, с помощью просто СУ-схемы легко получить польскую обратную запись различных конструкций входного языка.
Определение: КС-грамматика, у которой множество терминальных символов разбито на множество входных символов VT и множество операционных символов ∆ называется трансляционной. Предложения языка порождённые трансляционной грамматикой называется активными цепочками.
Реальный транслятор строит не только синтаксическую структуру объектной программы. Вхождениям операционных символов будут соответствовать вызовы семантических процедур.
Определение: Атрибутной трансляционной грамматикой называется трансляционная грамматика с атрибутами и семантическими правилами вычисления значений атрибутов.
Определение:АТ- грамматика называется L-атрибутной, если выполняются следующие условия:
1) Пусть x0→x1x2…xnP – правило АТ- грамматики,
– семантическая функция для вычисления унаследованного атрибута α
Аi(xi) 1≤i≤n. Тогда каждый аргумент
- либо атрибут β
А1(x0), либо произвольный атрибут
А(xj) 1≤j≤n.
2) Пусть - функция для вычисления синтезированного атрибута α
А0(x0). Тогда каждый аргумент
либо атрибут
А1(x0), либо произвольный атрибут
А(xj), 1≤j≤n.
3) Если Xi – операционный символ и αА0(xi), в
функции
все аргументы представляют собой унаследованный атрибуты этого символа.
Для правила A→BC,например, значения атрибутов можно вычислить в таком порядке:
a. Унаследованные атрибуты символа А;
b. Унаследованные атрибуты В;
c. Синтезированные атрибуты символа В;
d. Унаследованные атрибуты символа С;
e. Синтезированные атрибуты символы С;
f. Синтезированные атрибуты символа А.
Этот порядок соответствует обходу дерева сверху вниз и слева направо. Спускаясь вниз от вершины, вычисляем унаследованные атрибуты, поднимаясь вверх к вершине, вычисляем синтезированные атрибуты.
Операционные символы АТ – грамматики можно интерпретировать как вызовы семантических процедур, которые реализуют соответствующие семантические правила для вычисления (с учётом контекстных условий) специального атрибута <объектная программа>. Очевидно, контекстные условия должны определяться унаследованными атрибутами операционных символов. При передаче значений атрибутов операционные символы употребляются, когда требуется обозначить сложную операцию, связанную с проверкой контекстно-зависимых соотношений для атрибутов и с вычислением их значений.
В случае простой передачи достаточного с нетерминалом в левой части правила грамматики и соответствующим символом в правой части связать одно тоже имя атрибута. Каждое правило L-атрибутной грамматики можно интерпретировать, как описание рекурсивной процедуры, причём нетерминал в левой части правила принимают за имя процедуры, а его атрибуты – за параметры этой процедуры.
Вхождение нетерминалов в правую часть правила вместе с их атрибутами интерпретирующая как вызовы соответствующих процедур с параметрами. Последние замечания имеют значения в связи с возможностью реализации однопроходного транслятора для входного языка.