Limbajul SL (Stack Language) lucrează
cu o stivă (iniţial vidă) şi un singur registru (care iniţial conţine
valoarea 0). Un program în limbajul SL este format dintr-o succesiune
de instrucţiuni, câte o instrucţiune pe o linie. În program instrucţiunile
sunt numerotate de la 0. Executarea unui program începe cu prima instrucţiune
a programului.
Instrucţiunile limbajului SL sunt:
Instrucţiune
Efect
Exemplu
PUSH x
Introduce valoarea întreagăxîn stivă
De exemplu, dacă stiva este:
1
2
3
după ce executăm PUSH 4 stiva va arăta
astfel:
4
1
2
3
STORE
Valoarea de la vârful stivei este
extrasă şi este plasată în registru
De exemplu, dacă stiva este: 1
2
3
şi executam STORE va arăta astfel: 2
3
iar în registru se află valoarea 1.
LOAD
Conţinutul registrului este copiat
şi introdus în stivă
De exemplu, dacă registrul conţine
valoarea 4, iar stiva este 1
2
3
după executarea operaţiei LOAD registrul
va conţine în continuare valoarea 4,
iar stiva va arăta astfel: 4
1
2
3
PLUS
Extrage din stivă două valori (cele
de la vârf), le adună şi introduce în stivă rezultatul.
De exemplu, dacă stiva este: 4
10
20
şi executăm PLUS stiva va arăta astfel:
14
20
TIMES
Extrage din stivă două valori (cele
de la vârf), le înmulţeşte şi introduce în stivă rezultatul
De exemplu, dacă stiva este:
4
10
20
şi executăm TIMES stiva va arăta astfel:
40
20
IFZERO n
Dacă valoarea de la varful stivei
este egală cu 0, atunci se sare la cea de a n-a instrucţiune din
program (într-un program instrucţiunile sunt numerotate de la 0).
În caz contrar, se continuă executarea programului cu instrucţiunea
următoare.
DONE
afişează valoarea de la vârful stivei
şi încheie execuţia programului (indiferent dacă mai există sau
nu instrucţiuni în continuare
Cerinţă
Scrieţi un program care să citească un program
în limbajul SL şi să îl execute.
Date de intrare
Fişierul de intrare sl.in
conţine pe prima linie un număr natural n
reprezentând numărul de instrucţiuni din programul în limbajul SL care
urmează. Următoarele n
linii conţin cele n
instrucţiuni ale programului, câte o instrucţiune pe o linie.
Date de ieşire
Fişierul de ieşire sl.out
va conţine o singură linie pe care va fi scrisă valoarea afişată de programul
SL din fişierul de intrare.
Restricţii
2<=n<=1000
In cazul instrucţiunilor PUSH
şi IFZERO există un singur spaţiu între
numele instrucţiunii şi argument.
Argumentul instrucţiunii PUSH
este un număr întreg din intervalul [-10000,10000]
Argumentul instrucţiunii IFZERO
este un număr natural din intervalul [0,1000]
Programul din fişierul de intrare este corect
(nu va conţine cicluri infinite, nu va extrage o valoare dintr-o stivă
vidă)
Exemple
sl.in
sl.out
Explicaţie
14
PUSH 5
PUSH 3
PLUS
STORE
LOAD
IFZERO 11
PUSH 4
LOAD
PLUS
DONE
PUSH 10
LOAD
TIMES
DONE
12
Să executăm
acest program pas cu pas, urmărind stiva şi registrul
Instrucţiune
Efect
Stiva
Registru
PUSH 5
Se insereaza in stiva valoarea 5
5
0
PUSH 3
Se insereaza in stiva valoarea 3
3
5
0
PLUS
Se extrag din stiva primele doua valori,
se aduna, rezultatul de plaseaza in stiva
8
0
STORE
Este extras elementul de la varful stivei
si este plasat in registru.
8
LOAD
Este copiat continutul registrului si inserat
in stiva
8
8
IFZERO 11
Valoarea de la varful stivei nu este egala
cu 0, deci se continua executia programului cu instructiunea
urmatoare
8
8
PUSH 4
Se insereaza in stiva valoarea 4
4
8
8
LOAD
Este copiat continutul registrului si inserat
in stiva
8
4
8
8
PLUS
Se extrag din stiva primele doua valori,
se aduna, rezultatul de plaseaza in stiva
12
8
8
DONE
Se afiseaza valoarea 12 si se termina executia
programului