Diseñar un Lenguaje Simple Un lenguaje simple y su máquina • • • • Tipos de datos: enteros Almacenamiento: Variables No hay abstracción de datos No hay abstracción de control (procedimientos) • Flujo de control: Simplemente secuencias de instrucciones. El lenguaje de alto nivel • • • • • P Is Is I I Begin Is End I I ; Is var := E write ( E ) • • • • • • • • • • • • • E E+T E E-T E T T SignedF * T T SignedF / T T SignedF mod T T SignedF SignedF - F SignedF F F num F var F (E) F read() La máquina intermedia para interpretación Entrada 1 Memoria 5 2 i Pila salida El lenguaje de la máquina Explicación Instrucción Push <valor> Empila el valor en la pila PushV <dir> Empila el valor guardado en <dir> en la pila ASGMEM <dir> Asigna el valor que está en el tope de la pila a la dirección dir de la memoria y desempila PLUS y:= pop() , x := pop, push(x+y) SUB y:= pop() , x := pop, push(x-y) TIMES y:= pop() , x := pop, push(x*y) DIV y:= pop() , x := pop, push(x/y) MOD y:= pop() , x := pop, push(x%y) CHSIGN x=pop(), push(-x); GET Lee del stream de entada un entero y lo deja en el tope de la pila PUT X := pop() , imprime x en el stream de salida Un ejemplo X := 1 Read(); Agregar estructuras de control • • • • • • • • • • • • • • P Begin Is End Is I Is I ; Is I var := C I write ( C ) I If Cond then Is else Is fi I If Cond then Is fi I While CondE do Is od CondE CondE or CondT CondE CondT CondT CondT and CondF CondT CondF CondF E CondF E opRel E • • • • • • • • • • • • • • • • • OpRel < | >| >= | <= | = | != E E+T E E-T E T T SignedF * T T SignedF / T T SignedF mod T T SignedF SignedF not F SignedF - F SignedF F F num F var F true F false F (E) F read() La máquina intermedia para interpretación Asgmem Push 10 1 GET 1 PUSHV PLUS PUT Entrada 1 Memoria 5 2 10 1 2 10 1 10 11 Pila 11 salida La máquina intermedia para interpretación Entrada 1 Memoria 5 2 i pc Pila codigo salida Instrucciones: opción 1 Explicación Instrucción Push <valor> Empila el valor en la pila PushV <dir> Empila el valor guardado en <dir> en la pila ASGMEM <dir> Asigna el valor que está en el tope de la pila a la dirección dir de la memoria y desempila PLUS y:= pop() , x := pop, push(x+y) SUB y:= pop() , x := pop, push(x-y) TIMES y:= pop() , x := pop, push(x*y) DIV y:= pop() , x := pop, push(x/y) MOD y:= pop() , x := pop, push(x%y) CHSIGN x=pop(), push(-x); LT <pos> y:= pop() , x := pop(), si x < y salta a <pos> LTE <pos> y:= pop() , x := pop(), si x <= y salta a <pos> GT <pos> y:= pop() , x := pop(), si x > y salta a <pos> GTE <pos> y:= pop() , x := pop(), si x >= y salta a <pos> EQ <pos> y:= pop() , x := pop(), si x = y salta a <pos> NEQ <pos> y:= pop() , x := pop(), si x != y salta a <pos> JMP <pos> Salta a <pos> GET Lee del stream de entada un entero y lo deja en el tope de la pila PUT X := pop() , imprime x en el stream de salida End Termina la ejecución Instrucciones: opción 2 Explicación Instrucción Push <valor> Empila el valor en la pila PushV <dir> Empila el valor guardado en <dir> en la pila ASGMEM <dir> Asigna el valor que está en el tope de la pila a la dirección dir de la memoria y desempila PLUS y:= pop() , x := pop, push(x+y) SUB y:= pop() , x := pop, push(x-y) TIMES y:= pop() , x := pop, push(x*y) DIV y:= pop() , x := pop, push(x/y) MOD y:= pop() , x := pop, push(x%y) CHSIGN x=pop(), push(-x); LT y:= pop() , x := pop(), push( x < y) LTE y:= pop() , x := pop(), push( x GT y:= pop() , x := pop(),push( x > y) GTE y:= pop() , x := pop(),push( x EQ y:= pop() , x := pop(), push( x = y) NEQ y:= pop() , x := pop(),push( x != y) JMP <pos> Salta a <pos> JMPT <pos> y=pop(), si y es true salta a pos JMPF <pos> y=pop(), si y es false salta a pos GET Lee del stream de entada un entero y lo deja en el tope de la pila PUT X := pop() , imprime x en el stream de salida End Termina la ejecución y) y) Ejemplo BEGIN n:= read(); i := 0; f := 1; WHILE (i < f) DO i:= i+1; f := f*i OD WRITE(f); END 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. get asgmem 1 push 0 asgmem 2 push 1 asgmem 3 pushv 2 pushv 1 LT jmpF 20 pushV 2 push 1 plus asgmem 2 pushv 3 pushv 2 times asgmem 3 JMP 7 pushv 3 put end