Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
11_транс_1.doc
Скачиваний:
35
Добавлен:
30.11.2018
Размер:
167.94 Кб
Скачать

Алгоритм Рутенхаузера.

Алгоритм Рутенхаузера предназначен для трансляции арифметических выражений в форму, эквивалентную машинному языку.

Выражение должно быть записано в полной скобочной структуре. Например, формула a+b*c запишется в виде a+(b*c).

Обрабатывая выражение с полной скобочной структурой, алгоритм Рутенхаузера присваивает каждому символу Si из строки с формулой число Ni, согласно алгоритму, приведённому ниже. Здесь S(j) – j-й символ, а N(j) – j-е число и используется переменная содержащая самое большое присвоенное N(j) значение.

Алгоритм: Присвоить.

Присвоить 1: N(0)¬0; J¬0

Присвоить 2: J¬J+1; Если конец строки, то N(J)¬0 и выход;

Присвоить 3: Если S(J) это «(» или «операнд», то N(J)¬N(J-1)+1; перейти к Присвоить 2;

Присвоить 4: Иначе N(J)¬N(J-1)-1; перейти к Присвоить 2;

Первый символ S(0) является пробелом, являющимся фактически началом строки. Заметим, что конечное значение J на единицу больше длины строки. Например, пусть задана цепочка a+(b*c) тогда присвоение чисел будет происходить согласно следующей таблице:

J

0

1

2

3

4

5

6

7

8

S(J)

A

+

(

b

*

c

)

N(J)

0

1

0

1

2

1

2

1

0


Далее транслятор ищет наибольшее значение N(J). Это значение, назовем его K, появляется в структуре вида N(J): … (K-1) K (K-1) K (K-1) … Рассматриваемая структура соответствует последовательности символов следующего вида: Z операнд1 Θ операнд2 R.

Символ Z – либо левая скобка, либо левый конец выражения.

Точно также R – это правая скобка или правый конец выражения.

Символ Θ представляет ОПЕРАЦИЮ.

При обнаружении такой структуры значение двуместного выражения вычисляется и запоминается во временной ячейке Ti. Тройка Ti <= операнд1 Θ операнд2 фиксируется. Обработанные три символа вместе с Z и R (если последние являются скобками) удаляются, а на их место помещается Ti со значением N=(K-1). Если Z и R – концы строки, процесс завершен. В противном случае алгоритм повторяет поиск наибольшего числа N. Приведенный выше пример после однократной обработки имеет такой вид:

S(J)

A

+

Ti

N(J)

0

1

0

1

0


Конечно, требование полной скобочной структуры является жестким ограничением. Были трансляторы, которые в предтрансляции вставляли как скобки, так и специальные символы (есть пример, когда запись арифметического выражения в 15 символов после вставки скобок стала содержать 87 символов).

Более сложный пример применения метода Рутенхаузера, обрабатывающий арифметическое выражение (((a + b)*c) + d)¸(e + (a¸f)).

Генерация тройки

Выражение

T1=a+b

( ( ( a + b ) * c ) + d ) ¸ ( e + ( a ¸ f ) )

0 1 2 3 4 3 4 3 2 3 2 1 2 1 0 1 2 1 2 3 2 3 2 1 0

T1=T1*c

( ( T1 * c ) + d ) ¸ ( e + ( a ¸ f ) )

0 1 2 3 2 3 2 1 2 1 0 1 2 1 2 3 2 3 2 1 0

T2=a – f

( T1 + d ) ¸ ( e + ( a – f ) )

0 1 2 1 2 1 0 1 2 1 2 3 2 3 2 1 0

T1=T1 + d

( T1 + d ) ¸ ( e + T2 )

0 1 2 1 2 1 0 1 2 1 2 1 0

T2=e+T2

T1 ¸ ( e + T2 )

0 1 0 1 2 1 2 1 0

T1=T1T2

T1 ¸ T2

0 1 0 1 0

T1

0 1 0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]