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 |
12
8 |
8 |
PUSH 10 |
|
|
|
LOAD |
|
|
|
TIMES |
|
|
|
DONE |
|
|
|
|
|