Скачиваний:
6
Добавлен:
01.05.2014
Размер:
301.06 Кб
Скачать

4.5 Тестирование ДМП-процессора

Исходная программа:

program test;

const c = #-1,3.14#;

var i,k:integer;

v:vector[10];

begin

i := 1;

while i<=10 do

if i>5 then v[i] := c else v[i] := 0;

writeln(length(v),c)

end.

Последовательность токенов после лексического анализа (только имена токенов, без адресной составляющей):

program id ;

const id = # + nat , num # ;

var id , id : integer ;

id : vector [ nat ] ;

begin

id := nat ;

while id rel nat do

if id rel nat then id [ id ] := id else id [ id ] := nat ;

writeln ( length ( id ) , id )

end .

Состояние магазина

Вх. цепочка

Действие

Вых. цепочка

Стек вызовов: S(0)

ДМП-процессор S(0)

program id ;

const id = # + nat , num # ;

var id , id : integer ;

id : vector [ nat ] ;

begin

id := nat ;

while id rel nat do

if id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln ( length ( id ) , id )

end .

Перенос x 3

┴ program id ;

const id = # + nat , num # ;

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Вызов Def(0)

Стек вызовов: S(0), Def(0)

ДМП-процессор Def(0)

const id = # + nat , num # ;

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Перенос x 4

┴ const id = #

+ nat , num # ;

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Вызов Cid(0)

Стек вызовов: S(0), Def(0), Cid(0)

ДМП-процессор Cid(0)

Cid ┴

+ nat , num # ;

{…}

Замена по правилу 3: (Cid,+) = + Num

+ Num ┴

+ nat , num # ;

{…}

Выброс

3

Num ┴

nat , num # ;

{…}

Замена по правилу 5: (Num,nat) = nat

3

nat ┴

nat , num # ;

{…}

Выброс

3, 5

, num # ;

{…}

Допуск

Возврат в Def(0)

{L(Cid(0))} = 3, 5

Стек вызовов: S(0), Def(0)

ДМП-процессор Def(0)

┴ const id = # cid

, num # ;

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Перенос

{L(Cid(0))}

┴ const id = # cid ,

num # ;

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Вызов Cid(1)

{L(Cid(0))}

Стек вызовов: S(0), Def(0), Cid(1)

ДМП-процессор Cid(1)

Cid ┴

num # ;

{…}

Замена по правилу 2: (Cid,num) = Num

Num ┴

num # ;

{…}

Замена по правилу 4: (Num,num) = num

2

num ┴

num # ;

{…}

Выброс

2, 4

# ;

{…}

Допуск

Возврат в Def(0)

{L(Cid(1))} = 2, 4

Стек вызовов: S(0), Def(0)

ДМП-процессор Def(0)

┴ const id = # cid , cid

# ; var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Перенос

{L(Cid(0))}, {L(Cid(1))}

┴ const id = # cid , cid #

; var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Свертка по правилу 23:

(Cns  # cid , cid #)

{L(Cid(0))}, {L(Cid(1))}

┴ const id = Cns

; var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Перенос

{L(Cid(0))}, {L(Cid(1))},

23

┴ const id = Cns ;

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Свертка по правилу 20:

(LCn  i = Cns ;)

{L(Cid(0))}, {L(Cid(1))},

23

┴ const LCn

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Свертка по правилу 10:

(DfC  con LCn)

{L(Cid(0))}, {L(Cid(1))},

23, 20

┴ DfC

var id , id : integer ;

id : vector [ nat ] ;

begin {…}

Перенос x 4

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10

┴ DfC var id , id

: integer ;

id : vector [ nat ] ;

begin {…}

Свертка по правилу 29:

(LV1  id)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10

┴ DfC var id , LV1

: integer ;

id : vector [ nat ] ;

begin {…}

Свертка по правилу 30:

(LV1  id , LV1)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29

┴ DfC var LV1

: integer ;

id : vector [ nat ] ;

begin {…}

Свертка по правилу 28:

(LVr  LV1)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30

┴ DfC var LVr

: integer ;

id : vector [ nat ] ;

begin {…}

Перенос

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28

┴ DfC var LVr :

integer ;

id : vector [ nat ] ;

begin {…}

Вызов Typ(0)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28

Стек вызовов: S(0), Def(0), Typ(0)

ДМП-процессор Typ(0)

integer ; {…}

Перенос

┴ int

; {…}

Свертка по правилу 3:

(Typ  int)

┴ Typ

; {…}

Допуск

Возврат в Def(0)

{R(Typ(0))} = 3

Стек вызовов: S(0), Def(0)

ДМП-процессор Def(0)

┴ DfC var LVr : Typ

; id : vector [ nat ] ;

begin {…}

Перенос x 2

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}

┴ DfC var LVr : Typ ; id

: vector [ nat ] ;

begin {…}

Свертка по правилу 29:

(LV1  id)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}

┴ DfC var LVr : Typ ; LV1

: vector [ nat ] ;

begin {…}

Свертка по правилу 28:

(LVr  LV1)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))},

29

┴ DfC var LVr : Typ ; LVr

: vector [ nat ] ;

begin {…}

Перенос

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))},

29, 28

┴ DfC var LVr : Typ ; LVr :

vector [ nat ] ;

begin {…}

Вызов Typ(1)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))},

29, 28

Стек вызовов: S(0), Def(0), Typ(1)

ДМП-процессор Typ(1)

vector [ nat ] ; begin {…}

Перенос x 4

┴ vec [ nat ]

; begin {…}

Свертка по правилу 8:

(Typ  vec [ nat ] )

┴ Typ

; begin {…}

Допуск

Возврат в Def(0)

{R(Typ(1))} = 8

Стек вызовов: S(0), Def(0)

ДМП-процессор Def(0)

┴ DfC var LVr : Typ ; LVr : Typ

; begin {…}

Перенос

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))},

29, 28,

{R(Typ(1))}

┴ DfC var LVr : Typ ; LVr : Typ ;

begin {…}

Свертка по правилу 26:

(Vrs  LVr : Typ ; )

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28,

{R(Typ(1))}

┴ DfC var LVr : Typ ; Vrs

begin {…}

Свертка по правилу 27:

(Vrs 

LVr : Typ ; Vrs )

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28,

{R(Typ(1))}, 26

┴ DfC var Vrs

begin {…}

Свертка по правилу 16:

(DfV  var Vrs )

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28,

{R(Typ(1))}, 26, 27

┴ DfC DfV

begin {…}

Свертка по правилу 15:

(Bl3  DfV )

{L(Cid(0))} {L(Cid(1))}

23, 20, 10, 29, 30, 28

{R(Typ(0))} 29, 28

{R(Typ(1))} 26, 27, 16

┴ DfC Bl3

begin {…}

Свертка по правилу 11:

(Bl2  Bl3)

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28,

{R(Typ(1))}, 26, 27, 16, 15

┴ DfC Bl2

begin {…}

Свертка по правилу 8:

(Bl1  DfC Bl2 )

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28,

{R(Typ(1))}, 26, 27, 16, 15, 11

┴ Bl1

begin {…}

Свертка по правилу 3:

(Df  Bl1 )

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28,

{R(Typ(1))}, 26, 27, 16, 15, 11, 8

┴ Df

begin {…}

Свертка по правилу 1:

(Def  Df )

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28, {R(Typ(1))},

26, 27, 16, 15, 11, 8, 3

┴ Def

begin {…}

Допуск

Возврат в S(0)

{R(Def(0))} =

{L(Cid(0))}, {L(Cid(1))},

23, 20, 10, 29, 30, 28,

{R(Typ(0))}, 29, 28, {R(Typ(1))}, 26, 27, 16, 15, 11, 8, 3,1

Стек вызовов: S(0)

ДМП-процессор S(0)

┴ program id ; def

begin

id := nat ;

while id rel nat do

if id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln ( length ( id ) , id )

end .

Перенос

{R(Def(0))}

┴ program id ; def begin

id := nat ; while {…}

Вызов OpL(0)

{R(Def(0))}

Стек вызовов: S(0), OpL(0)

ДМП-процессор OpL(0)

OpL ┴

id := nat ; while {…}

Замена по правилу 2: (OpL,id) = Op

Op ┴

id := nat ; while {…}

Замена по правилу 5: (Op,id) = Op=

2

Op= ┴

id := nat ; while {…}

Замена по правилу 16: (Op=,id) = id O=1

2, 5

id O=1 ┴

id := nat ; while {…}

Выброс

2, 5, 16

O=1 ┴

:= nat ; while {…}

Замена по правилу 18: (Op=,id) = := O=2

2, 5, 16

:= O=2 ┴

:= nat ; while {…}

Выброс

2, 5, 16, 18

O=2 ┴

nat ; while {…}

Вызов PEx(0)

2, 5, 16, 18

Стек вызовов: S(0), OpL(0), PEx(0)

ДМП-процессор PEx(0)

PEx ┴

nat ; while {…}

Замена по правилу 1:

(PEx  Trm PE1)

Trm PE1┴

nat ; while {…}

Замена по правилу 6:

(Trm  Mul Tr1)

1

Mul Tr1 PE1┴

nat ; while {…}

Вызов Cid(2)

1, 6

Стек вызовов: S(0), OpL(0), PEx(0), Cid(2)

ДМП-процессор Cid(2)

Cid ┴

nat ; while {…}

Замена по правилу 2: (Cid,nat) = Num

Num ┴

nat ; while {…}

Замена по правилу 5: (Num,nat) = nat

2, 5

nat ┴

nat ; while {…}

Выброс

2, 5

; while {…}

Допуск

Возврат в PEx(0)

{L(Cid(2))} = 2, 5

Стек вызовов: S(0), OpL(0), PEx(0)

ДМП-процессор PEx(0)

Mul Tr1 PE1┴

cid {из Cid(2)}

; while {…}

Замена по правилу 14:

(Mul  cid)

1, 6, {L(Cid(2))}

cid Tr1 PE1┴

cid {из Cid(2)}

; while {…}

Выброс

1, 6, {L(Cid(2))}, 14,

Tr1 PE1┴

; while {…}

Замена по правилу 8:

(Tr1  )

1, 6, {L(Cid(2))}, 14,

; while {…}

Допуск

Возврат в OpL(0)

{L(PEx(0))} =

1, 6, {L(Cid(2))}, 14, 8

Стек вызовов: S(0), OpL(0)

ДМП-процессор OpL(0)

O=2 ┴

pex {из PEx(0)}

; while {…}

Замена по правилу 19:

(O=2  pex)

2, 5, 16, 18, {L(PEx(0))}

pex ┴

pex {из PEx(0)}

; while {…}

Выброс

2, 5, 16, 18, {L(PEx(0))}, 19

; while {…}

Допуск

Возврат в S(0)

{L(OpL(0))} =

2, 5, 16, 18, {L(PEx(0))}, 19

Стек вызовов: S(0)

ДМП-процессор S(0)

┴ program id ; def begin opl

; while {…}

Перенос

{R(Def(0))}, {L(OpL(0))}

┴ program id ; def begin opl ;

while id rel nat do

if id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln ( length ( id ) , id )

end .

Вызов OpL(1)

{R(Def(0))},{L(OpL(0))}

Стек вызовов: S(0), OpL(1)

ДМП-процессор OpL(1)

OpL ┴

while id rel nat do

if {…}

Замена по правилу 2:

(OpL  Op)

Op ┴

while id rel nat do

if {…}

Замена по правилу 8:

(Op  OWh)

2

OWh ┴

while id rel nat do

if {…}

Замена по правилу 11:

(OWh 

whl ex do OpL)

2, 8

whl ex do OpL ┴

while id rel nat do if {…}

Выброс

2, 8, 11

ex do OpL ┴

id rel nat do if {…}

Вызов Ex(0)

2, 8, 11

Стек вызовов: S(0), OpL(1), Ex(0)

ДМП-процессор Ex(0)

Ex ┴

id rel nat do if {…}

Вызов PEx(1)

Стек вызовов: S(0), OpL(1), Ex(0), Pex(1)

ДМП-процессор PEx(1)

PEx ┴

id rel nat do if {…}

Работа ДМП-процессора PEx(1)

rel nat do if {…}

Допуск

Возврат в Ex(0)

{L(PEx(1))} = …

Стек вызовов: S(0), OpL(1), Ex(0)

ДМП-процессор Ex(0)

Ex ┴

pex {из PEx(1)}

rel nat do if {…}

Замена по правилу 1:

(Ex  pex Ex) )

{L(PEx(1))}

pex Ex) ┴

pex {из PEx(1)}

rel nat do if {…}

Выброс

{L(PEx(1))}, 1

Ex) ┴

rel nat do if {…}

Замена по правилу 2:

( Ex)  rel pex )

{L(PEx(1))}, 1

rel pex ┴

rel nat do if {…}

Выброс

{L(PEx(1))}, 1, 2

pex ┴

nat do if {…}

Вызов PEx(2)

{L(PEx(1))}, 1, 2

Стек вызовов: S(0), OpL(1), Ex(0), PEx(2)

ДМП-процессор PEx(2)

PEx ┴

nat do if {…}

Работа ДМП-процессора PEx(2)

do if {…}

Допуск

Возврат в Ex(0)

{L(PEx(2))} = …

Стек вызовов: S(0), OpL(1), Ex(0)

ДМП-процессор Ex(0)

pex ┴

pex {из PEx(2)}

do if {…}

Выброс

{L(PEx(1))}, 1, 2, {L(PEx(2))}

do if {…}

Возврат в OpL(1)

{L(Ex(0))} =

{L(PEx(1))}, 1, 2, {L(PEx(2))}

Стек вызовов: S(0), OpL(1)

ДМП-процессор OpL(1)

ex do OpL ┴

ex {из Ex(0)}

do if id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln

Выброс x 2

2, 8, 11, {L(Ex(1))}

OpL ┴

if id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln {…}

Вызов OIf(0)

2, 8, 11, {L(Ex(0))}

Стек вызовов: S(0), OpL(1), OIf(0)

ДМП-процессор OIf(0)

OIf ┴

if id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln {…}

Замена по правилу 1:

( OIf 

if ex thn opl Els )

if ex thn opl Els ┴

if id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln {…}

Выброс

1

ex thn opl Els ┴

id rel nat then id [ id ] := id

else id [ id ] := nat ;

writeln {…}

Вызов Ex(1)

1

Стек вызовов: S(0), OpL(1), OIf(0), Ex(1)

ДМП-процессор Ex(1)

Ex ┴

id rel nat then {…}

Работа ДМП-процессора Ex(1)

then {…}

Допуск

Возврат в OIf(0)

{L(Ex(1))} = …

Стек вызовов: S(0), OpL(1), OIf(0)

ДМП-процессор OIf(0)

ex thn opl Els ┴

ex {из Ex(1)}

then id [ id ] := id

else id [ id ] := nat ;

writeln {…}

Выброс x 2

1, {L(Ex(1))}

opl Els ┴

id [ id ] := id

else id [ id ] := nat ;

writeln {…}

Вызов OpL(2)

1, {L(Ex(1))}

Стек вызовов: S(0), OpL(1), OIf(0), OpL(2)

ДМП-процессор OpL(2)

OpL ┴

id [ id ] := id

else {…}

Работа ДМП-процессора OpL(2)

else {…}

Допуск

Возврат в OIf(0)

{L(OpL(2))} = …

Стек вызовов: S(0), OpL(1), OIf(0)

ДМП-процессор OIf(0)

opl Els ┴

opl {из OpL(2)}

else id [ id ] := nat ;

writeln {…}

Выброс

1, {L(Ex(1))}, {L(OpL(2))}

Els ┴

else id [ id ] := nat ;

writeln {…}

Замена по правилу 2:

( Els  els opl )

1, {L(Ex(1))}, {L(OpL(2))}

els opl ┴

else id [ id ] := nat ;

writeln {…}

Выброс

1, {L(Ex(1))}, {L(OpL(2))},

2

opl ┴

id [ id ] := nat ;

writeln {…}

Вызов OpL(3)

1, {L(Ex(1))}, {L(OpL(2))},

2

Стек вызовов: S(0), OpL(1), OIf(0), OpL(3)

ДМП-процессор OpL(3)

OpL ┴

id [ id ] := nat ;

writeln {…}

Работа ДМП-процессора OpL(2)

; writeln {…}

Допуск

Возврат в OIf(0)

{L(OpL(3))} = …

Стек вызовов: S(0), OpL(1), OIf(0)

ДМП-процессор OIf(0)

opl ┴

opl {из OpL(3)}

; writeln {…}

Выброс

1, {L(Ex(1))}, {L(OpL(2))},

2, {L(OpL(3))}

; writeln {…}

Допуск

Возврат в OpL(1)

{L(OIf(0))} =

1, {L(Ex(1))}, {L(OpL(2))},

2, {L(OpL(3))}

Стек вызовов: S(0), OpL(1)

ДМП-процессор OpL(1)

OpL ┴

oIf {из OIf(0)}

; writeln {…}

Замена по правилу 2:

( OpL  oIf )

2, 8, 11, {L(Ex(0))}, {L(OIf(0))}

oIf ┴

oIf {из OIf(0)}

; writeln {…}

Выброс

2, 8, 11, {L(Ex(0))}, {L(OIf(0))},2

; writeln ( length ( id ) , id )

end .

Допуск

Возврат в S(0)

{L(OpL(1))} =

2, 8, 11, {L(Ex(0))}, {L(OIf(0))},2

Стек вызовов: S(0)

ДМП-процессор S(0)

┴ program id ; def begin opl ; opl

; writeln ( length ( id ) , id )

end .

Перенос

{R(Def(0))}, {L(OpL(0))},

{L(OpL(1))}

┴ program id ; def begin opl ; opl ;

writeln ( length ( id ) , id )

end .

Вызов OpL(4)

{R(Def(0))}, {L(OpL(0))},

{L(OpL(1))}

Стек вызовов: S(0), OpL(4)

ДМП-процессор OpL(4)

OpL ┴

writeln ( length ( id ) , id )

end .

Замена по правилу 2:

( OpL  Op )

Op ┴

writeln ( length ( id ) , id )

end .

Замена по правилу 2:

( Op  OWr )

2

OWr ┴

writeln ( length ( id ) , id )

end .

Замена по правилу 27:

( OWr 

wr ( LWr ) )

2, 7

Соседние файлы в папке Курсовик по ТЯПру