Ing.Sistemas Computacionales
Ing. Carlos Vallejo
Tarea #2
MICHAEL GUSTAVO ANDINO BORJAS
10841181
Abril 28 2013
1. Escriba expresiones de tipo para los siguientes tipos:
a. Una matriz de apuntadores a reales, donde los índices van de ‐10 a 10
array(-10..10,pointer(real))
b. Función que recibe como parámetros un entero y una función que
recibe dos enteros y regresa un real, y que regresa unafunción igual a la
que recibe
(int x((int x int)->real)->((int x int)->real))
c. El tipo de la variable x en el siguiente fragmento de código:
struct nodo {
int c,b;
struct nodo *sig;
};
struct nodo *x[10];
nodo: record((c x int) x (b x int)) x pointer(nodo)
x: array(1..10 , pointer(nodo))
2. Si el nombre de tipo nodo se define como record((info x integer) x (siguiente x
enlace)) yenlace se define como pointer(nodo), ¿Cuáles de las siguientes
expresiones son estructuralmente equivalentes?
a. enlace
b. pointer(nodo)
c. pointer(enlace)
d. pointer(record((info x integer) x (siguiente x pointer(nodo)))
e. pointer(pointer(record((info x integer) x (siguiente x enlace)))
nodo: record((info x integer) x (siguiente x enlace))
enlace: pointer(nodo)
Los equivalentes seriana, b y d:
a. enlace -> pointer(nodo) -> pointer(record(info x integer) x (siguiente x pointer(nodo)))
b. pointer(nodo) -> pointer(record(info x integer) x (siguiente x pointer(nodo)))
d. pointer(record((info x integer) x (siguiente x pointer(nodo)))
3. Modifique el comprobador de tipos descrito en clase para que imprima un
mensaje descriptivo cuando detecte un error y para que continúe lacomprobación como si hubiera aparecido el tipo previsto.
E -> E1 + T
{If(E1.tipo=T.tipo && E1[integer,real])
E.tipo=E1.tipo
Else
E.tipo=Error_tipo(“Necesita
Números”)
E.tipo=E1.tipo
End If;}
E -> T
{E.tipo=T.tipo}
T -> T1 * F
{If(T1.tipo=F.tipo && T1[integer,real])
T.tipo=T1.tipo
Else
T.tipo=Error_tipo(“Necesita
Números”)
T.tipo=T1.tipo
End If;}
{T.tipo=F.tipo}{F.tipo=buscar_tipo(id.valex)}
{F.tipo=char}
{F.tipo=integer}
F.tipo=real}
{F.tipo=E.tipo}
{t=buscar_tipo(id.valex)
If(E.tipo=integer && t=array(i,s)) then
F.tipo=s
Else
F.tipo=Error_tipo(“El tipo de arreglo
no es válido”)
F.tipo=s
End If;}
{t=buscar_tipo(id.valex)
If(t==pointer(s))then
F.tipo=s
Else
F.tipo=Error_tipo(“No es un puntero”)
F.tipo=s
End If;}
T -> F
F -> id
F ->const char
F -> num
F -> num.num
F -> (E)
F -> id[E]
F -> id^
4. Exprésense, utilizando variables de tipos, los tipos de las
siguientes funciones.
a. Una función que recibe como argumentos un apuntador a un objeto de
cualquier tipo y una función que devuelve un objeto del tipo apuntado en
el primer argumento, y que devuelve un apuntador a cualquier tipo.
Pointer(α) x (γ-> α) ->pointer(β)
b. Una función que tome como argumento una matriz indizada de 1 a 10, con
elementos de
cualquier tipo, y devuelva una matriz cuyos elementos sean los objetos
apuntados por los elementos de la matriz dada.
array(1..10, α) -> array(1..10, pointer(α))
5. Encuéntrese el unificador más general, en caso de existir, para cada par
de expresiones de la siguiente lista:
a.
(pointer(α)x β) π )
con
µα
S
µ
pointer(α) x β
π
α
pointer(α) x β α
pointer(α) x β α
b.
δ1 ( pointer(δ2) δ2)
con
α1 x int (α2 array(α3))
S
δ1
α2
δ2
α1 x int
pointer(array(α3)
array(α3)
δ1 -> (pointer(δ2)-> δ2) α1 x int -> (pointer(array(α3)) -> array(α3))
α1 x int -> (α2 -> array(α3)) α1 x int -> (pointer(array(α3)) -> array(α3))
6. Quéimprime el siguiente programa utilizando llamada por valor, por
referencia, enlace de copia y restauración y llamada por nombre?
program principal(input, output);
var a, b: integer;
procedure p(x, y, z);
begin
y := y + 1;
z := z + x + b;
end;
begin
a := 5;
b := 3;
p(a+b, b, a);
print(a);
print(b);
end;
VALOR
A
B
3
5
IMPRIME 5 y 3.
REFERENCIA
A
B
X
5
3...
Regístrate para leer el documento completo.