Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Implementacin de Lenguajes
Procesador Semntico Abstracto SIMPLESEM
Procesador.
D
Actual Libre D[0] D[1]
La posicin de memoria siguiente a donde finaliza el RA actual, ie, la primera celda libre de memoria.
Salto
Incondicional: JUMP dir Condicional: JUMPT dir, cond
RA 1
Registros de
RA 2
Activacin
Entrada/Salida
Entrada: SET target, read Salida: SET write, source
direccin base del registro de activacin de la unidad llamadora Sirve para poder retornar a la unidad que activo a la actual.
Variables Locales
direccin base del registro de activacin de la unidad que contiene sintcticamente a la unidad que hace referencia este registro de activacin. Sirve para resolver referencias no locales
{ z:=R() } { Q }
30 40 30
Variables Locales
30 40 40
30 40 40
Variables Locales
Variables Locales
PR ED EE
Variables Locales
50
40 40 40
40 40 50
Variables Locales
Variables Locales
PR ED EE
{ Q }
PR ED EE
Variables Locales
Variables Locales
50
50
Ejemplo 1
0 Actual 2 5 10 20
Program P var x, y, z: integer; function R (a, var b): integer begin RA de P b := a; return o; end begin //de P x := 10; y := 20; write (R(x,y)) end //de P
1 Libre 2 x 3 y 4 z 5 6 7 8 9 10 11
SET 1, D[1] + 1
Resultado de R
1 Libre 2 x 3 y 4 z 5 6 7 8 9 10 11
1 Libre 2 x 3 y 4 z 5 6 PR 7 ED
RA de R
8 EE 9 10 11
si d = 0 fp(d) = si d > 0
D[0] D[fp(d-1)+2]
si d = 0 si d > 0
Program P var x, y, z: integer; function R (a, var b): integer begin b := a; 1 return o; end begin {de P} x := 10; y := 20; 0 write (R(x,y)) end {de P}
1 Libre 2 x 3 y 4 z 5 6 PR 7 ED
2 2
RA de R
8 EE 9 10 11
1 Libre 2 x 3 y 4 z 5 6 PR 7 ED
1 Libre 2 x 3 y 4 z 5 6 PR 7 ED
2 2 10
2 2 10 3
RA de R
8 EE 9 a 10 b 11
RA de R
8 EE 9 a 10 b 11
1 Libre 2 x 3 y z PR ED EE a b
Actualizar actual
SET 0, D[1] Actualizar Libre SET 1, D[0] + TRA
Tamao del RA de R
1 Libre 2 x 3 y 4 z Resultado de R 5 6 PR 7 ED RA de R 8 EE 9 a 10 b 11
4 Program P var x, y, z: el integer; OJO! Si parmetroResultado de R 5 function R (a, var b): int 6 real es a su vez un begin 7 parmetro b := a; pasado por RA de R return o; hay1 8 referencia que end 9 usar: begin {de P} 10 x := 10; y :=fp(d) 20; D[ + offset y ] 11 write (R(x,y)) 0 end {de P}
2 2 10 3
Actualizar IP
JUMP Direccin
2 2 10 3
Actualizar Libre
SET 1, D[0] Actualizar Actual SET 0, D[ D[0] + 1]
1 Libre 2 x 3 y 4 z Resultado de R 5 6 7 8 9 10 11
Cdigo de R
Cdigo de P
Actualizar IP
JUMP D[ D[1] ]
Cdigo de R
Cdigo de R
Cdigo de P
Cdigo de P
Cdigo de P
Program P de R var x, y, z: integer; function R (a, var b): integer begin b := a; return 0; end begin {de P} x := 10; y := 20; write (R(x,y)) end {de P}
0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT
Cdigo de R
Cdigo de P
Ejemplo 2
Program dos var X: int procedure P(in out A: int) var L : int begin L := X A := A * L end begin X := 50; P(X) end
Program P de R var x, y, z: integer; function R (a, var b): integer begin b := a; return 0; end begin {de P} x := 10; y := 20; write (R(x,y)) end {de P}
0 SET D[fp(0)+ 4], D[fp(0) + 3] 1 SET D[0] 1, 0 2 SET 1, D[0] 3 SET 0, D[D[0] + 1] 4 JUMP D[D[1]] 5 SET 0, 2 6 SET 1, D[0] + 3 7 SET fp(0), 10 8 SET fp(0) + 1, 20 9 SET 1, D[1] + 1 10 SET D[1], IP + 7 11 SET D[1] + 1, D[0] 12 SET D[1] + 2, fp(0) 13 SET D[1] + 3, D[fp(0) + 0] 14 SET D[1] + 4, fp(0) + 1 15 SET 0, D[1] 16 SET 1, D[0] + 5 17 JUMP 0 18 SET 1, D[1] 1 19 SET write, D[1] 20 HALT
Cdigo de R
Cdigo de P
Ejemplo 2
Program dos var X: int procedure P(in out A: int) var L : int begin L := X A := A * L 1 end begin X := 50; P(X) 0 end
Ejemplo 2
Program dos X Int Offset: 0 var X: int P Procedimiento procedure P(in out A: int) var L : int A Int Offset: begin L Int Offset: L := X A := A * L 1 end begin X := 50; P(X) 0 end
0 1
0 1
Ejecuta la asignacin
0 1
Codigo de Dos 1 2 3 4 5 SET 0,2 SET 1,D[0] + 1 SET fp(0) + 0, 50 SET D[1], fp(0) + offset X SET 1, D[1] + 1
Codigo de Dos SET 0,2 SET 1,D[0] + 1 SET fp(0)+0, 50 SET D[1], fp(0) + 0 SET 1, D[1] + 1 SET D[1], IP + ___ SET D[1] + 1, D[0] SET D[1] + 2, fp(0)
X Concretizamos el Int Offset: 0 puntero de retorno P Procedimiento A Int Offset: 3 L Int Offset: 4
Actualiza Actual y Libre. Salta al Cdigo de P Notar que en Libre se guarda espacio para la variable local L
0 1
Codigo de Dos 1 2 3 4 5 6 7 8 9 SET 0,2 SET 1,D[0] + 1 SET fp(0)+0, 50 SET D[1], fp(0) + 0 SET 1, D[1] + 1 SET D[1], IP + ___ SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[fp(0) + offset X]
Codigo de Dos SET D[1], 13 SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[D[0]] SET 0, D[1] SET 1, D[0] + 5 JUMP 15
10 11 12
0 1
Codigo de Dos 6 7 8 9 10 11 12 13 SET D[1], 13 SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[D[0]] SET 0, D[1] SET 1, D[0] + 5 JUMP 15 SET D[1], D[1]1
Codigo de Dos SET D[1] + 1, D[0] SET D[1] + 2, fp(0) SET D[1] + 3, D[D[0]] SET 0, D[1] SET 1, D[0] + 5 JUMP 15 SET D[1], D[1]1 HALT
Ejemplo 2 Cdigo de P
procedure P(in out A: int) var L: int begin L:= X A := A * L end
0 1
Offset L = 4
Offset X = 0
Offset L = 4
Offset L = 4
Ejemplo 2 Cdigo de P
procedure P(in out A: int) var L: int begin L:= X A := A * L end
Ejemplo 2 Cdigo de P
0 1
procedure P(in out A: int) var L: int begin L:= X A := A * L end
0 1
Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET D[0]+3, D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+off A] 18 19 20 21 22 23
Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET D[0]+3, D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+3] 18 SET 1, D[0] 19 SET 0, D[D[0]+1] 20 JUMP D[D[1]] 21 22 23
Actualizamos Actual, Libre y luego saltamos a la direccin indicada por el puntero de retorno
Ejemplo 2
Program dos var X: int procedure P(in out A: int) var L: int begin L := X A := A * L end begin X := 50; P(X) end
Codigo de Dos 1 SET 0,2 2 SET 1,D[0] + 1 3 SET D[0], 50 4 SET D[1], D[0] + offset X 5 SET 1, D[1] + 1 6 SET D[1], 13 7 SET D[1] + 1, D[0] 8 SET D[1] + 2, fp(0) 9 SET D[1] + 3, D[D[0]] 10 SET 0, D[1] 11 SET 1, D[0] + 5 12 JUMP 15 13 SET D[1], D[1]1 14 HALT Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET fp(0)+3,D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+3] 18 SET 1, D[0] 19 SET 0, D[D[0]+1] 20 JUMP D[D[1]]
Ejemplo 2
Inicializa Actual y Program dos Libre var X: int procedure P(in out A: int) X:=50 var L: int begin L := X A := A * L Llamada end begin a P(X) X := 50; P(X) end L := X A:= A * L Retorno de P
Codigo de Dos 1 SET 0,2 2 SET 1,D[0] + 1 3 SET D[0], 50 4 SET D[1], fp(0) + 0 5 SET 1, D[1] + 1 6 SET D[1], 13 7 SET D[1] + 1, D[0] 8 SET D[1] + 2, fp(0) 9 SET D[1] + 3, D[D[0]] 10 SET 0, D[1] 11 SET 1, D[0] + 5 12 JUMP 15 13 SET D[1], D[1]1 14 HALT Codigo de P 15 SET fp(0)+4, D[fp(1)+0] 16 SET fp(0)+3,D[fp(0)+3] * D[fp(0)+4] 17 SET D[D[0]1], D[fp(0)+3] 18 SET 1, D[0] 19 SET 0, D[D[0]+1] 20 JUMP D[D[1]]
FIN