Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tablas de Simbolos PDF
Tablas de Simbolos PDF
1. Introduccin
2. Espacio de nombres
3. Organizacin
4. Lenguajes de bloques
5. Perspectiva
6. tabla.c y tabla.h
7. Ejercicios
end;
Eliminar (ocultar) todos los smbolos del bloque (mbito) que se cierra.
function f (i : integer)
: integer; procedure P (i : integer;
var b : boolean);
Incluir f (funcin)
Abrir un bloque nuevo Incluir P (procedimiento)
Incluir f (variable de escritura) Abrir un bloque nuevo
Incluir i (parmetro) Incluir i y b (parmetros)
12048 Compiladores II - J. Neira Universidad de Zaragoza 6
Requerimientos
Rapidez: la consulta es la Facilidad de manteni-
operacin ms frecuente. miento: la eliminacin de
identificadores debe ser
O(n)? sencilla
O(log2(n))? No es aleatoria
O(1)?
Eficiencia en el manejo Permitir identificadores
del espacio: se almacena duplicados: la mayora
una gran cantidad de infor- de los lenguajes los per-
macin. miten. Debe estar claro
cules son accesibles en
determinado momento
Flexibilidad: la posibilidad
de definir tipos hace que la
declaracin de variables
pueda ser arbitrariamente
compleja.
12048 Compiladores II - J. Neira Universidad de Zaragoza 7
Requerimientos
program e; e():
var a, b, c : char; a, b, c
procedure f; f, g, j
var a, b, c : char;
...
procedure g;
var a, b : char; g():
procedure h; f(): j():
var c, d : char; a, b
a, b, c b, d
... h, i
procedure i;
var b, c : char;
...
...
procedure j; h(): i():
var b, d : char; c, d b, c
...
...
Programa en compilacin:
e() f() g() h() i() j() e()
h() i()
f() g() g() g() j()
e() e() e() e() e() e() e()
Tabla de smbolos:
...base ...
indice
Espacio de Nombres
bb aa ss ee i i nn dd i i cc ee cc oomm i i ee nnzz oo xx
libre
struct {
int nombre;
... nombre atributos
} entrada_tabla;
....
char espacio_nombres[MAX];
Vector
segmento: de
Vectores de tamao s
nombre div s Punteros
0 bb aa ss ee i i nn dd i i cc ee
indice en segmento: cc oomm i i ee nnzz oo xx
nombre mod s
T
M-1
Insertar aqu
12048 Compiladores II - J. Neira Universidad de Zaragoza 13
3. Organizacin
Alternativa 2: Lista ordenada por nombre
nombre atributos nombre atributos
0 p
u
n
dnde insertar?
M-1
buscar() O(log2(n))
introducir() O(log2(n))+O(1)
eliminar() ?
h = 0 ;
for i in 1..n loop
h := T[h xor C[i]];
end loop ;
return h
n: longitud de la cadena
C[i]: i-simo caracter
T: nmeros aleatorios (una permutacin de 0..255).
Ventajas:
Cambios pequeos en las cadenas (cadenas similares) resultan
en cambios grandes en el resultado (proviene de la criptografa).
Maneja anagramas
Otros: sumar impares, mayor cdigo ASCII
las
lascolisiones
colisiones M-1 x
pueden
puedenser
serun
un
clase
rbol
rbolbinario?
binario?
0
1
...
M-1
Reglas de visibilidad:
El bloque en el que est declarado un objeto es su mbito
En cualquier lnea del programa, slo los objetos declarados en
el bloque actual y en los abiertos son accesibles.
Slo puede haber nuevas declaraciones en el bloque actual.
Si un objeto est declarado en ms de un bloque abierto, se
utiliza la definicin del bloque ms interno (la ms reciente).
Implicaciones:
El ltimo bloque en abrir es el primero en cerrar.
Una vez cerrado un bloque, no se vuelve a abrir.
Al cerrar un bloque, todas sus declaraciones son inaccesibles.
12048 Compiladores II - J. Neira Universidad de Zaragoza 27
Ejemplos: Pascal
program pr;
var a : char;
function f (i : integer): integer;
var d : real;
begin
.. 1
end;
procedure p (var j: char)
var i, f : real;
begin
..
procedure q ;
var i, c : integer;
begin
?
? f = i*d;
end 2
end; 1
begin
...
end. 0
12048 Compiladores II - J. Neira Universidad de Zaragoza 28
Ejemplos: C
char a;
int f (int i, int j, char* c)
{
double d;
..
} 1
Se
Sepierde
pierdeel
elorden
ordende
deinsercin!
insercin!
empleado = record
... Se mantiene para dar
end; soporte a generadores
automticos de progra-
Se permite mas
alumno = record
cursa = ^asignatura; En algunos casos evitan
... anidamientos excesivos
end;
12048 Compiladores II - J. Neira Universidad de Zaragoza 36
5. Perspectiva
Visibilidad: Las reglas de visibilidad pueden ser
diferentes en situaciones especiales:
PASCAL: Los nombres de los campos de los registros
no son visibles sin el nombre del registro.
q.ads
with P:
12048 Compiladores II - J. Neira Universidad de Zaragoza 39
5. Perspectiva
Sobrecarga: el mismo PASCAL: funciones
smbolo tiene significados
diferentes dependiendo del function f (n : integer)
contexto. : integer;
PASCAL: operadores begin
aritmticos. if n > 1 then
f := n * f (n-1)
var i, j : integer; else
r, s : real; f := 1
.... end;
j := i * 2;
s := r * 2.0;
#define TAMANO 7
typedef struct {
char *nombre;
int nivel;
TIPO_SIMBOLO tipo;
TIPO_VARIABLE variable; SIMBOLO *buscar_simbolo(
int dir; TABLA_SIMBOLOS tabla,
... char *nombre)
} SIMBOLO;
/* NULL si el nombre no aparece
typedef LISTA en la tabla, dlc puntero al
TABLA_SIMBOLOS[TAMANO]; simbolo mas reciente */
principio
escribir(i);
fin
cmo se asigna valor a una variable?
1. Instruccin de asignacin
2. Lectura
3. Parmetros por referencia
cundo se consulta el valor de una variable?
1. Expresiones
2. Escritura
3. Paso de parmetros por valor
12048 Compiladores II - J. Neira Universidad de Zaragoza 42
Tarea a)
Explica qu habra que modificar en la tabla de smbolos
(tanto en la definicin del tipo SIMBOLO como de las
funciones asociadas) para detectar estas situaciones.
typedef struct {
char *nombre;
int nivel;
...
int asignada;
} SIMBOLO;
SIMBOLO *introducir_variable (....)
{
...
simbolo.asignada = 0;
...
}
12048 Compiladores II - J. Neira Universidad de Zaragoza 43
Tarea b)
Indica qu producciones habra que modificar, y cmo,
para implementar esta verificacin.
lista_asignables: tIDENTIFICADOR
{
...
$1.simbolo.asignada = 1;
...
}
| lista_asignables ',' tIDENTIFICADOR
;
expresion:
...
factor: tIDENTIFICADOR
{
...
if (!$1.simbolo.asignada)
error(Variable sin valor asignado.);
...
}
programa p; programa p;
entero i, j; entero i;
principio accion a;
leer (j); principio
si j > 0 ent escribir(i);
i := 1; fin
fsi
escribir (i); principio
fin i := 1;
a(i);
fin
programa p;
lista: inicializador
| lista , inicializador
;
{identificador} {
if (!buscar_simbolo(tabla, yytext))
introducir_variable(tabla, yytext,...);
}