Академический Документы
Профессиональный Документы
Культура Документы
R1: =a;
R2: =b;
R3: =c;
R2: =R2*R3;
R3: =d;
R1: =R1+R2
a, b, c, *, d, -, +.
как
<операнд>::= i |<операнд><операнд><операция>
<операция>::= + | - | * | / |…
Стек
ab@cd*++
a b@cd*++
a|b @cd*++
a | -b cd*++
a | -b | c d*++
a | -b | c | d *++
a | -b | c*d ++
a | -b+c*d +
a+(-b+c*d)
Семантичиские
Правила
подпрограммы
E1::=E нет
E::=T1 нет
T1::=T нет
T::=F нет
F::=(E1) нет
Рис. 1.1.
Семантические подпрограммы.
P(l)=’+’; k=k+1;
Рис. 1.2
P(k)=S(j); k=k+1;
Операция Приоритет
+, - 0
*, / 1
↑ 2
Выход Вход
Магазин
Алгоритм:
abc* d
операция приоритет
/ 1
+ 0
Операция Приоритет
( 0
), +, - 1
*, / 2
↑ 3
ПОЛИЗ a @ b c d e / ↑ f /
* +
/ /
( ( ( (
↑ ↑ ↑ ↑ ↑ ↑
* * * * * * * * / /
Стек @@ + + + + + + + + + + + +
Исх.цеп. - a + b * c ↑ ( d / e ) / f ;
Получили: a@bcde/↑*f/+.
Операция Приоритет
( 0
) or 1
and 2
not 3
+ - 5
* / 6
↑ 7
Примеры:
1. a-3>-c*d/e a3-c@d*e/>
Так, присваивание:
<пер>:=<выр>
<пер><выр>:=
Оператор “:=” выполняется не так как операция отношения “=”. После его
выполнения и <пер> и <выр> должны быть исключены из стека, т. к.
оператор “:=”, не имеет результирующего значения в стеке в отличие от
двухместных операций, встречающихся в выражениях. Кроме того, в стеке
должно использоваться не значение <пер>, а ее адрес, т. к. значение <выр>
должно запоминаться по адресу <пер>. Эти особенности должны быть
учтены при формировании и выполнении польской цепочки.
a:=b:=5:=
при этом обе команды не могут быть выполнены правильно. Поэтому для
символа := вводят сравнительный и стековый приоритеты. Стековый имеет
знак, находящейся в стеке, сравнительный – символ входной цепочки.
Сравнительный приоритет надо взять большим, приоритета любого другого
знака, чтобы знак := не выталкивал из стека других знаков. Тогда a:=b:=5;
будет транслироваться в
a b 5 :=:=
a b 5 Пр:=
Приоритет
Операция
стековый сравнительный
( 0
) 1
:= 2 10
or 3
and 4
not 5
+,- 7
-,/,@ 8
^ 9
При этом генерируются две различных команды: a b 5 Пр :=по команде
Пр «5» присваивается «b», имя которой удаляется из стека, по следующей
команде присвоения «5» присваивается «a» и удаляется всё. Наличие этих 2
приоритетов позволяет правильно выполнять трансляцию, если
используются переменные с индексом (в массивах).
Лекция 3.
нет да
ЛВ
m1:
опер2 опер1
m2:
Рис.3.1
Рассмотрим оператор:
then else ;
mi УПЛ
if mi
if mi
mi+1 БП mi:
if mi mi+1
if if -
then if mi mi УПЛ
Последней метки : из
конец очистка стека
каждой записи if... в
оператора включая if mi mi+1
стеке
Пример:
Рис. 3.2
Код ПОЛИЗ:
a b > a 5 := a b < a 10 := a 0 :=
m1 m2 m3 m4 m4
:
УПЛ БП УПЛ БП
m2
m1: m3:
:
< := :=
ifm1m2 ifm1m2
if if ifm1 ifm1 ifm1m2 ifm1m2 ifm1m2 ifm1m2 ifm1m2
Рис. 3.3.
Код ПОЛИЗ:
Пример 4.1
В :=
Ы a b = a 0 := b 1 m2 a 1 :=
Х m1 БП m2
О УПЛ m1 :
Д :
С
Т
= := := :=
Е
if if if m1 ifm1 ifm1 ifm1 if m1 m2 if m1 m2
К
Вх.
if a = b then a := 0 ; b := 1 else a := 1 ;
стр.
Пример 4.2
В a b = a 0 := M БП m2 a 1 :=
m1 БП m2
Ы
УПЛ m1 :
Х
:
С := goto
if if if m1 if m1 if m1 if m1 if m1 if m1 if m1m2 ifm1m2
Е
К
В if a = b then begin a := 0 ; goto M end else a := 1 ;
х
Получим ПОЛИЗ:
Пример 4.3
Рассмотрим оператор
Ы
:
m1 m2
Х
УПЛ БП
m1
:
С := :=
Т
< := begin begin begin begin
Е
К if m1m2 if m1m2 if m1m2 if m1m2 if m1m2
if if if m1 if m1 if m1m2
Получим ПОЛИЗ
Нет ЛВ Да
Опер1
m1:
В соответствии с блок-схемой получим ПОЛИЗ
ЛВ m1 УПЛ <опер1> m1:
then ;
Нагрузка на символы if, then,; такая же, как и в полном операторе
условного перехода.
Рассмотрим пример: if a>b then a:=0;
Его реализация следущая
В a b > a 0 :=
Ы m1 m1
Х УПЛ :
С
Т > :=
Е if if ifm1 ifm1
К
Вх.цеп if a > b then a := 0 ;
ЛВ
Нет Да
goto M
m1:
и дает следующий ПОЛИЗ:
ЛВ m1 УПЛ М БП m1:
Then ;
То есть нагрузка на символы if, then,; сохраняется.
Пример
if a>b then goto M;
Реализация:
В a b > M БП
Ы m1 m1
Х УПЛ :
С
Т > goto
Е if if ifm1 ifm1
К
Вх.цеп if a > b then goto M ;
goto ;
В a b > M БП
Ы m1 m1
Х УПЛ :
С
Т > goto
Е if if ifm1
К
Вх.цеп if a > b goto M ;
Символ goto, видя в стеке if действует, как then, затем записывается в стек.
При выталкивании из стека goto заменяется на БП.
Реализацию последнего оператора можно модернизировать следующим
образом. Переход на метку М выполняется, если логическое выражение
«истина ». Команда УПЛ работает по «лжи», поэтому достаточно
сгенерировать отрицание логического выражения и метка m1 вообще не
понадобиться.
Итак, будем реализовать оператор
if <лог.выр.> goto M;
следующим образом:
Его блок-схема является частным случаем предыдущего оператора
Нет ¬<лог.в.> Да
goto M
То есть ПОЛИЗ будет:
<лог.выр.> ¬ M УПЛ
Реализация следующая
В a b > M УПЛ
Ы ¬
Х
С >
Т ¬ ¬
Е if if goto
К
Вх.цеп if a > b goto M ;
mi:
l:=a
нет да
b
mi+1:
Очевидно, для реализации потребуется две метки mi и mi+1.
Запишем реализацию полученной блок-схемы в ПОЛИЗ
mi: l a := b mi+1 УПЛ A mi БП mi+1:
for do ;
Сравнивая полученный код с исходным текстом оператора, определяем
дополнительные функции служебных слов при построении ПОЛИЗ и их
приоритеты
- for - приоритет 0; генерирует очередную рабочую метку mi , заносит в
стек запись for mi , заносит в ПОЛИЗ mi: . Символ for играет роль
“хранителя” и “переносчика” рабочих меток, как и символ if в операторах
условного перехода.
- while - приоритет 1 , генерирует очередную рабочую метку mi+1 ,
изменяет в стеке запись for mi на for mi mi+1 , в ПОЛИЗ ничего дополнительно
не заносит.
- do - приоритет 1 , заносит в ПОЛИЗ mi+1 УПЛ.
- ; - приоритет 1 , заносит в ПОЛИЗ mi БП mi+1: и удаляет запись for из
стека.
Все служебные слова и ; действует сначала по своим приоритетам,
выталкивая из стека все до записи for mimi+1 исключительно. А затем,
используя метки, указанные при for, генерирует в ПОЛИЗ соответствующие
фрагменты.
Рассмотрим пример трансляции оператора в ПОЛИЗ.
П m1 l a := c d > c c l +
О : m2 :=
Л УПЛ m1
И БП
З m2
С :
Т +
Е := > := :=
К for m1 for m1 for m1 m2 for m1 m2 for m1 m2 for m1 m2 for m1 m2 for m1 m2
Получим ПОЛИЗ
m1 : l a := c d > m2 УПЛ c c l + := m1 БП m2:
обеспечивающую правильное выполнение оператора.
Рассмотрим другие виды операторов цикла типа пересчета. Оператор с
предусловием
While b do A ;
Блок схема следующая:
mi:
нет да
b
mi+1:
while do ;
Сравним полученный текст с исходным и определим приоритеты и
функциональную нагрузку служебных слов и знаков.
- while - приоритет 0; генерирует рабочую метку mi; записывает в стек
while mi; генерирует в ПОЛИЗ mi: . Выполняет роль хранителя и переносчика
меток в стеке.
- do - приоритет 1; очищает стек до while исключительно; генерирует
рабочую метку mi+1 ; заносит в ПОЛИЗ mi+1 УПЛ.
- ; - приоритет 1 ; очищает стек до while ; генерирует в ПОЛИЗ mi БП
mi+1: и удаляет запись while из стека.
Пример трансляции.
П m1 a b > a a k -
О : m2 :=
Л УПЛ m1
И БП
З m2
:
С
Т
Е -
К > := :=
while m1 while m1 while m1 m2 while m1 m2 while m1 m2
Получим ПОЛИЗ:
m1 : a b > m2 УПЛ a a k - := m1 БП m2:
Оператор цикла с постусловием:
repeat A until b ;
Блок-схема оператора следующая:
mi:
нет да
repeat ;
И
З
С
Т
Е +
К := := >
repeat m1 repeat m1 repeat m1 repeat m1 repeat m1
Вх. repeat a := a + 1 until a > b ;
цеп
Получим ПОЛИЗ:
m1 : a a 1 + := a b > m1 УПЛ .
Лекция 6
rj :=1
m
i:
rj+1 :=h
не д
rj = 0 а
т
l:=l+rj+
mi 1
+1:
rj :=0
нет д
(l-c) а A
rj+1≤0
mi+2:
Кроме рабочих меток mj, mj+1, mj+2 нам понадобилось использовать еще
две дополнительные рабочие ячейки rj и rj+1.
В rj хранится признак того, что цикл выполняется первый раз и значения
параметра цикла l не надо модифицировать. После первого выполнения цикла rj
сбрасывается в 0.
Значение шага h используется в алгоритме два раза: при модификации
значения параметра цикла и при проверке условия выхода из цикла, поэтому
для хранения шага надо ввести дополнительную рабочую ячейку - rj+1.
Конечное значение параметра цикла c используется в алгоритме один раз
при формировании условия выхода из цикла.
При построении ПОЛИЗ надо передать на выход c именно в момент
формирования условия выхода из цикла.
Имя параметра цикла l также используется несколько раз, поэтому
вводим дополнительную ячейку для хранения имени параметра цикла и
признак цикла, значение которого используется для заполнения ячейки с
именем параметра цикла.
Итак, в соответствии с блок-схемой получим ПОЛИЗ:
l1 l2 m3
r2 r5 :
+ +
:= :=
m2: m5
r1 :
0 r1
:= 0
l1 :=
l2
Пар l1 l1 l1 l1 l1 l2 l2 l2 l2 l2
Цкл 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0
С
Т +
Е := :=
К := for m4m5m6 for m4m5m6 for m4m5m6 for m4m5m6 for m4m5m6
for m1m2m3 for m1m2m3 for m1m2m3 for m1m2m3 for m1m2m3
for m1m2m3 for m1m2m3 for m1m2m3 for m1m2m3 for m1m2m3
Рис.6.2 (_продолжение)
Рассмотрим вариант оператора цикла типа арифметической прогрессии,
когда конечное значение указывается раньше, чем значение шага
for l := a to c step h do A ;
Блок-схема выполнения такого оператора следующая
l:=a
rj := 1
mi
:
rj+2 :=с
rj+1 :=h
не да
т rj = 0
l:=l+rj+1
mi+
1111
:
rj :=0
нет да
(l- rj+2) A
*rj+1≤0
mi+2:
Ошибки в блок-схеме
Построим ПОЛИЗ и сравним его с исходным текстом, установив
дополнительную нагрузку на служебные слова, получим:
l a := rj 1:= mi: rj+2 с := rj+1 h
to step
:= rj 0 = mi+1 УПЛ l l rj+1 + := rj 0 := l rj+2 - rj+1 * 0 ≤ mi+2 УПЛ A mi БП mi+2:
do ;
При реализации оператора цикла типа арифметической прогрессии
можно исключить использование признака rj, т.е. блок схему для оператора
for l := a step h until c do A ; представить следующим образом:
l := a
mi:
rj+1 :=h
нет да
(l-c) rj+1≤0
mi+1:
l:=l+rj+1
mp mq mr БПВ
и предписывает:
Оператор вида :
mi+2: l a1 := mi+3 mi+1 mi БПВ mi+3: l a2 := mi+4 mi+1 mi БПВ mi+4: l ... mi+n+1: l an
, , ,
:= mi+n+2 mi+1 mi БПВ mi+1: A mi: B mi+n+2:
do :
Пример:
for while ,
while do
Пример:
Получим ПОЛИЗ:
m 31
m1 26
m2 1
m3 13
m4 32
Элемент списка цикла типа арифметической прогрессии
Оператор вида
for step to
– rj+1 sign * 0 ? mi+5 УПЛ mi+3 mi+1 mi БПВ mi+5: l a1 := rj 1 := mi+6 : rj+1 h2
, step
to
do ;
Лекция 8.
Алгоритм построения ПОЛИЗ оператора цикла со списком элементов.
<оператор>,<операнд1>,<операнд2>,<результат>
*,а,b,t
*,a,b,t1
*c,d,t2
+,t1,t2,t3
<оператор> <операнд1>,<операнд2>
(1 * b , c
(2) + a , (1)
где (1) – это ссылка на результат 1-й триады. Выражение 1+b*c запишеться
как :
(1) * b , c
(2) + 1 , (1)
ПОЛИЗ Тетрады
ab+ + , a , b , t1
@a - , a , , t1
a b := := , b , ,a
m1 БП БП , m1
а m1 УПЛ УПЛ , m1 , a
a*(-b+c)
j:=1 - , b , , t1 E.SEM:=t1
j:=2 + , t1 , c , t2 E.SEM:=t2
j:=3 * , a , t2 , t3 T.SEM:=t3
Z ::= E
E ::= [-] T { ( + | - ) T }
T ::= F { ( * | / ) F }
F ::= i | ( E )
proc Z (Z.sem)
call E (E.sem)
Z.sem := E.sem
end Z
proc E (E.sem)
if lex = “-” Вычисление
then семантического
begin эквивалента
call T (T.sem); i := i + 1; первого
генер. –, , T.sem, ti ; операнда
T.sem := ti ; двухместной
end арифметической
else call T (T.sem); операции +/-
while lex = “+” | “-” do
begin
EE := + | - , T.sem;
call T (T.sem); i := i + 1;
генер. EE, T.sem, ti ;
T.sem := ti ;
end
E.sem := T.sem
end E
proc T (T.sem)
call F (F.sem)
while lex = “*” | “/”do
begin
TT := * | / , F.sem
call F (F.sem); i := i + 1;
генер. TT, F.sem, ti ;
F.sem := ti ;
end;
T.sem := F.sem
end T
proc F (F.sem)
if lex = i then F.sem := i.sem;
if lex = ( then call E (E.sem); след. лекс.
if lex = ) then F.sem := E.sem;
end F
Неупорядоченные таблицы
Упорядоченные таблицы
PROC BINPOISK
N - размер таблицы Т */
DO WHILE J I M=0
K=(I+J)/2;
IF S ≠ T(K)
THEN
DO
IF S<T(K)
THEN J=K-1;
ELSE I=K+1;
END;
ELSE M=K;
END;
END BINPOISK;
Имя Указатель
.
.
Объект S
.
h(S) S
.
.
. информация об S
n-1
Имя Значение
Алгоритм
Имя Значение
0 данные
1 A для А
2 EF данные
для W
3 W
данные
4
для E F
5
.
6
.
7 .
8
в таблице нет.
Функции расстановки
hi S h0 S ri mod N 1 i N 1
hi S ih0 S 1mod N
hi S h0 S a * i 2 b * i mod N
0 0 0
1 1 1
2 S1 2 S1 2 S1
3 3 S3 3 S3
4 S2 4 S2 4 S2
5 5 5 S4
6 6 6
7 7 7
Рис.2.3
ю ячейку.
Низкая эффективность метода ясна из примера. После нескольких
конфликтов, разрешенных таким образом, элементы скапливаются вместе,
образуя данные последовательности заполненных элементов. Если
достигнута позиция n-1, переходим на позицию 0. Метод прост, но если
возникнет конфликт, то занятые позиции имеют тенденцию скапливаться.
Если h0(S) вызывает конфликт, то вероятность того, что h1(S) вызовет
конфликт выше средней.
Оценка среднего числа сравнений
1 lf
E 2
1 lf
Т.о. зависимость ожидаемого числа сравнений Е от загрузки таблицы lf
будет следующей
lf E
10% 1,06
50% 1,5
90% 5,5
Случайное рехеширование.
hi ( S ) (h0 ( S ) ri ) mod N , 1 i N 1
lf E
10% 1,05
50% 1,39
90% 2,56
Квадратичное рехеширование.
hi h0 (S ) ai 2 bi c mod N
1 (3 2) mod 8 5
2 (3 6) mod 8 1
3 (3 12) mod 8 7
4 (3 20) mod 8 7
5 (3 30) mod 8 1
6 (3 42) mod 8 5
7 (3 56) mod 8 3
Метод цепочек.
Метод использует хеш-таблицу, элементы которой, называемые указателями,
в начальный момент равны 0, собственно таблицу символов вначале пустую,
и указатель, который указывает на ближайшее свободное место в таблице
символов. Элементы таблицы символов имеют дополнительное поле, которое
может содержать нуль или адрес другого элемента таблицы символов.
Начальное состояние всей системы следующее:
1 S1 S6 0
2 0 S2 0
3 S3 S7 S8 0
4 S4
5 0 S5 0
6
Лекция 13.Статическое распределение памяти.
Память для данных.
Типы данных исходной программы должны быть отображены на типы
данных машины. Для некоторых типов это соответствие будет один к одному
(целое, вещественное,…), для других может понадобиться несколько
машинных слов для описания типа.
Память для массивов.
Элементы вектора размещаются последовательно в порядке возрастания
(или убывания) адресов. Существует несколько способов размещения
двухмерных массивов.
Обычный способ — хранение по строкам в порядке возрастания. Массив
A(1: M ,1: N ) будет расположен в порядке
VARPART (((i * d 2 ) j ) * d 3 l ) * d n m
L1 U1 d1
… … …
L1 U1 d1
n CONSPART
BASE
begin real a, b;
b := 0;
m1: begin real c, d;
b := b + 1;
m2: …
end m1;
n1: begin real f, q;
n2: if b = 1 then goto m1;…
end n1;
end;
Статическое распределение.
Проводится в два этапа.
На I этапе — выделяется секция памяти каждому блоку, на II — назначаются
адреса переменным внутри блока.
Пусть программа имеет следующую блочную структуру:
Б1 begin n1
begin n2
Б2
Б3 begin n3
Ур3
Ур1 end
begin n4
Б4
Ур3
end
Ур1 end;
begin n5
Б5
Б6 begin n6
Ур3
end
Ур2 begin n7
Б7
begin n8
Б8
Ур3
Ур4 end
end
end
end
Изобразим эту структуру следующим деревом:
n1 Уровень 1
n2 n5 Уровень 2
n3 n4 n6 n7 Уровень 3
n8 Уровень 4
N1
n1
n2 n5
n3
n7
Nmax
n6
n8
n4
Пример.
p: Уровень 1
a, d
P1:
x, y, m1:
c, d Уровень 2
u,v
Уровень 3
m2:
f
УС СТЕК УНБ
УС СТЕК УНБ
[p] + np + 1 0 [p]
a
b
i
…
1
стек(1):=0;
i:=1;
УНБ(1):=УС
УС:=УС+np +1
Пример.
УС Стек
p:
[p] --------->
Рис.1
Пер: УС:=УС+1
вход:
стек(УС):=(УНБ(УБк-1),УНБ(k),i);
i:=УБк
УНБ(i):=УС
УС:=УНБ(i)+nk+1
УС стек УНБ
[p1]+np1+1 > p1: > 0 <- -- ---- [p]
| ^ a ^ <- [p1]
| | b | |
| | ............. | |
| | p1 | |
| ^- [p],[p1],1 ^< - -
| x
| y
| u
| v Рис.3
| .............
| -- >
(all,a2l,l )
Выход из процедуры
УС:=УНБ(i)-1
Из стека УНБ извлекаем ссылку
(a1l,a2l,l )
if l=1 then goto M2; else
УНБ(l):=a2l;
i:=l;
j:=l;
m1: if j=2 then goto M2:
Из стека УНБ(j) извлечь (a1l,a2l,l )
j:=l
УНБ(l):=a1l;
goto M1;
M2:
УС Стек УНБ
[m1]+nm1+1 >
|
| 0 <- [p]
| p: a [m1]
Состояние | b
стека .......
| p1 Доступны
после
входа в | [p] [p] 1 p и m1
блок m1 | c
| m1: d
| ......
i | Рис.4
2 |
|
--- >
УС Стек УНБ
[p1]+np1+1 p: ..........
.......... <-- [p]
m1: .......... <-- [p]
.......... |
m2: .......... |
РП |
p1: [p] <-
i [p1] 3
2 | x
| y Рис.6
| u
- > v
.........