Курсовик по ТЯПру / PART3
.DOC4.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 |