Обобщенные схемы синтаксически управляемого перевода
Расширим определение СУ-схемы, с тем чтобы выполнять
более широкий класс переводов. Во-первых, позволим иметь в каждой вершине дерева разбора несколько переводов. Как и в обычной СУ-схеме, каждый перевод зависит от прямых потомков соответствующей вершины дерева. Во-вторых, позволим элементам перевода быть произвольными цепочками выходных символов и символов, представляющих переводы в потомках. Таким образом, символы перевода могут повторяться или вообще отсутствовать.
Определение. Обобщенной схемой синтаксически управляемого перевода (или трансляции, сокращенно: OСУ-схемой) называется шестерка Tr = (N, T,
![](cmr10-5.gif)
![](cmr10-0.gif)
- - конечное множество символов перевода вида Ai, где AN и i - целое число;
- R - конечное множество правил перевода вида
A
u, A1 = v1, ..., Am = vm,удовлетворяющих следующим условиям:
- Aj для 1jm,
- каждый символ, входящий в v1, ..., vm, либо принадлежит
, либо является Bk, где B входит в u,
- если u имеет более одного вхождения символа B, то каждый символ Bk
во всех v соотнесен (верхним индексом) с конкретным вхождением B.
A
![](cmsy10-21.gif)
Выход ОСУ-схемы определим снизу вверх. С каждой внутренней вершиной n дерева разбора (во входной грамматике), помеченной A, свяжем одну цепочку для каждого Ai. Эта цепочка называется значением (или переводом) символа Ai
в вершине n. Каждое значение вычисляется подстановкой значений символов перевода данного элемента перевода Ai = vi, определенных в прямых потомках вершины n.
Переводом
![](cmmi10-1c.gif)
грамматике для Tr и y - значение выделенного символа перевода Sk в корне этого дерева}.
Пример 5.4.
Рассмотрим формальное дифференцирование выражений, включающих константы 0 и 1, переменную x, функции sin и cos , а также операции * и +. Такие выражения порождает грамматика
E ![]() |
|
T ![]() |
|
F ![]() |
|
Свяжем с каждым из E, T и F два перевода, обозначенных индексом 1 и 2. Индекс 1 указывает на то, что выражение не дифференцировано, 2 - что выражение продифференцировано. Формальная производная - это E2. Законы дифференцирования таковы:
d(f(x) + g(x)) = df(x) + dg(x) |
d(f(x) * g(x)) = f(x) * dg(x) + g(x) * df(x) |
d sin (f(x)) = cos (f(x)) * df(x) |
d cos (f(x)) = - sin (f(x))df(x) |
dx = 1 |
d0 = 0 |
d1 = 0 |
E ![]() | E1 = E1 + T1 |
E2 = E2 + T2 | |
E ![]() | E1 = T1 |
E2 = T2 | |
T ![]() | T1 = T1 * F1 |
T2 = T1 * F2 + T2 * F1 | |
T ![]() | T1 = F1 |
T2 = F2 | |
F ![]() | F1 = (E1) |
F2 = (E2) | |
F ![]() | F1 = sin (E1) |
F2 = cos (E1) * (E2) | |
F ![]() | F1 = cos (E1) |
F2 = - sin (E1) * (E2) | |
F ![]() | F1 = x |
F2 = 1 | |
F ![]() | F1 = 0 |
F2 = 0 | |
F ![]() | F1 = 1 |
F2 = 0 | |
Дерево вывода для sin(cos (x))+x приведено на рис. 5.1.
![]()
|