Опубликован: 06.08.2007 | Доступ: свободный | Студентов: 1901 / 1054 | Оценка: 4.45 / 4.29 | Длительность: 18:50:00
Специальности: Программист

Лекция 6: Элементы теории перевода

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >

Теорема 5.1. Пусть P - МП-преобразователь. Существует такая простая СУ-схема Tr , что \tau  (Tr) = \tau  (P).

Теорема 5.2. Пусть Tr - простая СУ-схема. Существует такой МП-преобразователь P , что \tau  (P) = \tau  (Tr).

Таким образом, класс переводов, определяемых магазинными преобразователями, совпадает с классом простых СУ-переводов.

Рассмотрим теперь связь между СУ-переводами и детерминированными МП-преобразователями, выполняющими нисходящий или восходящий разбор [2].

Теорема 5.3. Пусть Tr = (N, T, \Pi , R, S) - простая СУ- схема, входной грамматикой которой служит LL(1)- грамматика. Тогда перевод \{x \$, y) \mid (x, y) \in  \tau (Tr)\} можно осуществить детерминированным МП-преобразователем.

Существуют простые СУ-схемы, имеющие в качестве входных грамматик LR(1)-грамматики и не реализуемые ни на каком ДМП-преобразователе.

Пример 5.3. Рассмотрим простую СУ-схему с правилами

S -> Sa, aSa
S -> Sb, bSb bSb
S -> e, e

Входная грамматика является LR(1)-грамматикой, но не существует ДМП-преобразователя, определяющего перевод \{(x \$, y)\mid (x, y) \in \tau (Tr)\}.

Назовем СУ-схему Tr = (N, T, \Pi , R, S) постфиксной, если каждое правило из R имеет вид A -> u, v, где v \in N^* \Pi^*. Иными словами, каждый элемент перевода представляет собой цепочку из нетерминалов, за которыми следует цепочка выходных символов.

Теорема 5.4. Пусть Tr - простая постфиксная СУ-схема, входная грамматика для которой является LR(1). Тогда перевод

\{(x \$, y)\mid (x, y) \in \tau (Tr)\}

можно осуществить детерминированным МП-преобразователем.

Обобщенные схемы синтаксически управляемого перевода

Расширим определение СУ-схемы, с тем чтобы выполнять более широкий класс переводов. Во-первых, позволим иметь в каждой вершине дерева разбора несколько переводов. Как и в обычной СУ-схеме, каждый перевод зависит от прямых потомков соответствующей вершины дерева. Во- вторых, позволим элементам перевода быть произвольными цепочками выходных символов и символов, представляющих переводы в потомках. Таким образом, символы перевода могут повторяться или вообще отсутствовать.

Определение. Обобщенной схемой синтаксически управляемого перевода (или трансляции, сокращенно: OСУ-схемой) называется шестерка Tr = (N,T,\Pi ,\Gamma ,R,S), где все символы имеют тот же смысл, что и для СУ-схемы, за исключением того, что

  1. \Gamma - конечное множество символов перевода вида Ai, где A \in N и i - целое число;
  2. R - конечное множество правил перевода вида A -> u, A1 = v1, ... , Am = vm, удовлетворяющих следующим условиям:
    1. A_j \in \Gamma для 1 <= j <= m,
    2. каждый символ, входящий в v1, . . . , vm, либо принадлежит \Pi, либо является B_k \in \Gamma, где B входит в u,
    3. если u имеет более одного вхождения символа B, то каждый символ Bk во всех v соотнесен (верхним индексом) с конкретным вхождением B.

A -> u называют входным правилом вывода, Ai - переводом нетерминала A, Ai = vi - элементом перевода, связанным с этим правилом перевода. Если в ОСУ-схеме нет двух правил перевода с одинаковым входным правилом вывода, то ее называют семантически однозначной.

Выход ОСУ-схемы определим снизу вверх. С каждой внутренней вершиной n дерева разбора (во входной грамматике), помеченной A, свяжем одну цепочку для каждого Ai. Эта цепочка называется значением (или переводом) символа Ai в вершине n. Каждое значение вычисляется подстановкой значений символов перевода данного элемента перевода Ai = vi, определенных в прямых потомках вершины n.

Переводом \tau (Tr), определяемым ОСУ-схемой Tr, назовем множество {(x, y) | x имеет дерево разбора во входной грамматике для Tr и y - значение выделенного символа перевода Sk в корне этого дерева }.

Пример 5.4. Рассмотрим формальное дифференцирование выражений, включающих константы 0 и 1, переменную x, функции sin и cos, а также операции * и +. Такие выражения порождает грамматика

E -> E + T | T

T -> T * F | F

F -> (E) | sin (E) | cos (E)|x|0|1

Свяжем с каждым из 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 -> E + T	E1 = E1 + T1
		E2 = E2 + T2
E -> T		E1 = T1
		E2 = T2
T -> T * F	T1 = T1 * F1
		T2 = T1 * F2 + T2 * F1
T -> F		T1 = F1
		T2 = F2
F -> (E)		F1 = (E1)
		F2 = (E2)
F -> sin (E)	F1 = sin (E1)
		F2 = cos (E1) * (E2)
F -> cos (E)	F1 = cos (E1)
		F2 = - sin (E1) * (E2)

Рис. 5.1.
F -> x 	F1 = x
		F2 = 1
	F -> 0 	F1 = 0
		F2 = 0
	F -> 1 	F1 = 1
		F2 = 0

Дерево вывода для sin (cos (x)) + x приведено на рис. 5.1.

< Лекция 5 || Лекция 6: 1234 || Лекция 7 >