Vous êtes sur la page 1sur 8

Tema 1 ( 75 puntos)

Escriba el cdigo de tres direcciones correspondiente a las siguientes


instrucciones:

TABLA DE SIMBOLOS

NOMBRE
TIPO
ROL
TAMAO
POSICION

A
procedure
procedure
48

B
entero
var/global
1
0

entero
var/global
1
1

D
entero
var/global
1
2

MAT
entero
var/arreglo/parametro
40
3-43

I
entero
var/parametro
1
44

J
entero
var/local

1
45

K
entero
var/local
1
46

L
entero
var/local/while
1
47
Nota:
no esta declarada

//filas consecutivas
//fila - columna
//https://drive.google.com/file/d/0B3FpP3NEnzZPZDZRUm4zdnI3Qlk/view?
usp=sharing

pila[1000]
p=0

procedure A () {
L1:

t1 = p + 44
t2 = pila[t1]
t3 = p + 46
t4 = pila[t3]
if( t2 < t4 ) goto L2
goto L3
L2:
t5 = B + 3
if ( t5 <= 40 ) goto L4
goto L5
L5 :
if ( D < C ) goto L6
goto L7

L4:
L6:
t6 = p + 44
t7 = pila[t6] // I
t8 = t7 + 1
t9 = p + 45
pila[t9] = t8 // J

L8:
t10 = p + 45
t11 = pila[t10]
t12 = p + 47
t13 = pila[t12]
if ( t11 < t13 ) goto L9
goto L10
L9:

//obtener mat
t14 = p + 3
t15 = p + 45
t16 = pila[t15]
t17 = t16 - 1
t18 = t17 * 8
t19 = p + 44
t20 = pila[t19]
t21 = t18 + t20
t22 = t14 + t21

//asignacion
t23 = p + 3

//MAT[i,c] * B
t24 = p + 3
t25 = p + 44
t26 = pila[t25] // i
t27 = t26 - 1
t28 = t27 * 8
t29 = t28 + C
t30 = t24 + t29
t31 = pila[t30]
t32 = t31 * B

t33 = t32 - 1
t34 = t33 * 8

//k - 1
t35 = p + 46

t36 = pila[t35] //k


t37 = t36 - 1

t38 = t34 + t37 //mapeado


t39 = t23 + t38 // temporal Mat [J , I ] := Mat [Mat [ I, C ] * B , K-I];
t40 = pila[t39]

pila[t22] = t40

// B = Mat [ I , D ] + 1 ;
t41 = p + 3
t42 = p + 44
t43 = pila[t42] // i
t44 = t45 - 1
t46 = t47 * 8
t48 = t46 + D
t49 = t41 + t48
t50 = pila[t49]
t51 = t50 + 1
B = t51
goto L8
L10:
t52 = C + 1
D = t52
goto L1
L3:
L7:
t53 = p + 3

t54 = p + 48 // cambio de ambito virtual


t55 = t54 + 3
pila[t55] = t53

t56 = p + 48
t57 = t56 + 44
//obtener k
t58 = p + 46
t59 = pila[t58]
pila[t57] = t59

p = p + 48
call A()
p = p - 48
}

Tema 2 ( 25 puntos )

Escriba una definicin dirigida por la sintaxis para la produccin Call como se
define a continuacin:

S call ID ( L_parametros ) ;
L_parametros L_parametros , ID
| ID

De tal manera que genere el cdigo de tres direcciones de la instruccin call


del
tema 1, asumiendo que la llamada siempre se realizar dentro de un
procedimiento o
funcin.

S call ID ( L_parametros ) ;
{

}
L_parametros L_parametros , ID
{
L_parametros.contador = L_parametros1.contador + 1
L_parametros.ambito = L_parametros1.ambito
t1 = generaTemp()
Write ( t1 , = p + , L_parametros1.ambito)
t2 = generaTemp()
posParametro = getPosParametro(L_parametros.contador)
Write ( t2 , = , t1 , +, posParametro )
t3 = obtenerID (ID.val)
Write ( pila[, t2, ] = , t3 )
}
| ID
{
L_parametros.contador = 0
L_parametros.ambito = obtenerAmbito()
t1 = generaTemp()
Write ( t1 , = p + , ambito)
t2 = generaTemp()
posParametro = getPosParametro(L_parametros.contador)
Write ( t2 , = , t1 , +, posParametro )
t3 = obtenerID (ID.val)
Write ( pila[, t2, ] = , t3 )
}

Vous aimerez peut-être aussi