Está en la página 1de 51

Leccin 1: Tablas de Smbolos

1. Introduccin
2. Espacio de nombres
3. Organizacin
4. Lenguajes de bloques
5. Perspectiva
6. tabla.c y tabla.h
7. Ejercicios

Lecturas: Scott, seccin 3.3


Munchnick, captulo 3
Aho, sessin 7.6
Fischer, captulo 8
Holub, seccin 6.3
Bennett, seccin 5.1
Cooper, secciones 5.7 y B.4
12048 Compiladores II - J. Neira Universidad de Zaragoza 1
La Tabla de Smbolos
porqu es importante?
anlisis lxico? int a, 1t;
anlisis sintctico?
anlisis semntico? ?
?
generacin de cdigo?
optimizacin?
ejecucin?
while a then ...
porqu es particular y compleja?
qu informacin maneja? ?
?
cmo/cundo se aade informacin?
cmo/cundo se consulta?
cmo/cundo se elimina?

los intrpretes la necesitan? c := i > 1;


y los depuradores? ? ?
? ?
y los desensambladores?

12048 Compiladores II - J. Neira Universidad de Zaragoza 2


1. Introduccin
Tabla de Smbolos: estruc- Puede contener
tura utilizada por el compila- adicionalmente:
dor para almacenar informa- smbolos temporales
cin (atributos) asociada a
los smbolos declarados en etiquetas
el programa en compilacin. smbolos predefinidos
Conceptualmente:
Diccionario de un programa coleccin de registros
nombre: anlisis lxico Estructura fuertemente in-
tipo: anlisis sintctico fluenciada por aspectos sin-
mbito: anlisis semntico tcticos y semnticos del
direccin: generacin de cdigo lenguaje:

Los tipos disponibles en el lenguaje: determinan el


CONTENIDO de la tabla.
Las reglas de mbito: determinan la visibilidad de los
smbolos, e.g., el MECANISMO DE ACCESO a la tabla.
12048 Compiladores II - J. Neira Universidad de Zaragoza 3
Contenido de la tabla
Palabras reservadas: tienen un Literales, constantes que
significado especial; NO pueden denotan un valor
ser redefinidas.
Smbolos generados por el
program begin end type compilador:
var array if ...
var a: record
Smbolos predefinidos: tienen b,c : integer;
un significado especial, pero end;
pueden ser redefinidos.
genera el smbolo noname1
sin cos get put read para el tipo annimo corres-
write integer! real! pondiente al registro.

Smbolos definidos por el programador


Variables: tipo, lugar en memoria, valor? referencias?
Tipos de datos: descripcin
Procedimientos y funciones: direccin, parmetros, tipo de resultado
Parmetros: tipo de variable, clase de parmetro
Etiquetas: lugar en el programa
12048 Compiladores II - J. Neira Universidad de Zaragoza 4
Consulta
Al procesar ............... el compilador ................
declaraciones consulta la tabla para impedir
duplicacin ilegal de nombres de smbolos.
sentencias consulta la tabla para verificar que
los smbolos involucrados sean accesibles y se utilicen
correctamente. const c = v;
var v : t; Existe el identificador c?
Existe el identificador v?
v := f (a, b + 1);
Est el tipo t definido?
es f una funcin?
v := e; El nmero de argumentos
Est v definido? Es una coincide con el de parme-
variable? Cul es su direccin? tros?
Est e definido? Es una El tipo de argumentos
variable? coincide con el de parme-
tros?
Es del mismo tipo que v (o de
tipo compatible)? El uso de los argumentos es
12048 Compiladores II - J. Neira Universidadcorrecto?
de Zaragoza 5
Actualizacin
Al procesar ............... el compilador ................
declaraciones actualiza la tabla para introducir
nuevos smbolos.
bloques actualiza la tabla para modificar la
visibilidad de los smbolos.
const c = v; var v : t;

Incluir c con el tipo de v y su valor Incluir v con el tipo t


Asignarle una posicin en memoria? Asignarle una posicin en memoria

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:

12048 Compiladores II - J. Neira Universidad de Zaragoza 8


2. Nombres
Recuerda: conceptualmente se
almacenan registros con los
nombres de smbolos y sus struct {
atributos. char nombre[MAX];
...
Se precisa un mecanismo de } entrada_tabla;
almacenamiento y bsqueda
por nombre.
espacio para identificador
ms largo posible
Alternativa 1: definir el campo
nombre como un vector de nombre atributos
caracteres. base ...
indice
FORTRAN IV: limitacin al n- comienzo
mero de caracteres significativos
(6). No es as en los lenguajes x
modernos.
Variabilidad en la longitud de
nombres -> desperdicio de espa-
cio

12048 Compiladores II - J. Neira Universidad de Zaragoza 9


Utilizar el Heap
Alternativa 2: definir el campo nombre como un puntero a
caracter.
nombre atributos HEAP

...base ...
indice

struct { ... comienzo


char *nombre; ...
...
} entrada_tabla; x ...
...
e->nombre = strdup(nombre);
Obtencin de espacio puede ser lenta
Reutilizacin depende del mecanismo de recuperacin de
memoria del HEAP
Requerimientos para una tabla de smbolos son ms
simples que los del HEAP
12048 Compiladores II - J. Neira Universidad de Zaragoza 10
Espacio de nombres
Alternativa 3: definir el campo nombre como un ndice en
un vector de nombres.

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];

La administracin se hace localmente


El espacio se reutiliza
El espacio no es ilimitado
12048 Compiladores II - J. Neira Universidad de Zaragoza 11
Espacio de nombres
Pequeo: puede ser
cul
culdebe
debeser
sereleltamao
tamao insuficiente
del
delespacio
espaciode
denombres?
nombres? Grande: puede
desperdiciarse espacio
Solucin: espacio de nombres segmentado

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

nombre = segmento * s + indice

Tamao limitado por el tamao del vector de punteros


(T=50 punteros de 1024 caracteres = espacio de 50k)
12048 Compiladores II - J. Neira Universidad de Zaragoza 12
3. Organizacin
Tres operaciones fundamentales:
buscar()
introducir()
eliminar()
Alternativa 1: Lista no ordenada buscar() O(n)
introducir() O(1)
nombre atributos eliminar() O(1)
0
nombre atributos
p
Insertar aqu n
u

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)) O(n)


introducir() O(log2(n))+O(n) O(n)+O(1)
eliminar() ? ?
Se
Sepierde
pierdeel
elorden
orden
de
deinsercin!
insercin!
12048 Compiladores II - J. Neira Universidad de Zaragoza 14
3. Organizacin
Alternativa 3: rboles binarios Slo si est
balanceado!
nombre atributos

buscar() O(log2(n))
introducir() O(log2(n))+O(1)
eliminar() ?

En el caso ms desfavorable, la complejidad de las opera-


ciones es igual a la de la lista ordenada.
i i
var i, j var i, m
j, m,
k, k j, j
l, l l, l
m : integer; m
k: integer;
k
No se puede garantizar que el rbol sea balanceado (los
nombres no son aleatorios).
12048 Compiladores II - J. Neira Universidad de Zaragoza 15
3. Organizacin
Alternativa 4: tablas de Colisiones: dos cadenas
dispersin. Mecanismo diferentes pueden estar
para distribuir aleatoria- asociadas al mismo ndice.
mente un nmero arbitrario
de tems en un conjunto
finito de clases.
cmo
cmo
0 base
i x
manejarlas?
manejarlas?
h(base) = 0
h(x) = i
...
h(comienzo) = j
j comienzo
Con una funcin de disper-
M-1 h?
h? sin adecuada, y un mane-
jo de colisiones eficiente,
Funcin de dispersin h: se puede buscar() en
asocia una cadena de tiempo constante.
caracteres con un cdigo
de dispersin = ndice en
la tabla.
12048 Compiladores II - J. Neira Universidad de Zaragoza 16
La funcin de dispersin h
Caractersticas deseables:
h(s) debe depender slo de s
Eficiencia: debe ser fcil y rpida del calcular
Eficacia: debe producir listas de colisiones pequeas
Uniforme: todos los ndices asignados con igual probabilidad
Randomizante: nombres similares a direcciones diferentes
Paradoja del cumpleaos:
Tenemos N nombres, y una tabla de tamao M
Sea h uniforme y randomizante. Inserciones antes de una
colisin:
M sqrt(pi M/2)
10 4
Nmeros aleatorios entre 0 y 100:
365 24
1.000 40
84 35 45 32 89 1 58 16 38 69 5 90 16 53 61 ...
10.000 125
Colisin al 13avo.
100.000 396
12048 Compiladores II - J. Neira Universidad de Zaragoza 17
Ejemplos
Mtodo de la divisin
function hash_add(s : string; M : integer) : integer;
var k : integer;
begin
k := 0;
for i := 1 to length(s) do k := k + ord(s[i]);
hash_add := k mod M;
end;

Tamao = 19, ids A0...A199 Tamao = 100, ids A0...A99


0-
- 50-
-
0- *********** -
- -
-
-
- **********
********** - -
- -
-
- **********
**********
-
- -
-
- ********** -
- -
-
-
- **********
********** -
- -
-
-
- ***********
*********
-
- -
- *
**
- *********** -
- *
* -
- ***
*****
-
- ***********
*********** -
- *
* -
- *****
******
- *********** -
- *
* -
- *******
********
-
- ***********
*********** - * - *********
- *********** -
- *
* -
- *********
********
-
18- ***********
***********
-
- -
- *******
******
-
- -
- *****
****
-
- -
- ***
**
- - *
Tamao = 19, ids A0...A99 -
-
-
-
-
-
-
-
-
-
-
- -
-
- -
0-
- **********
********* -
- -
-
- ******** -
- -
-
-
- *******
****** - -
-
-
-
- *****
****
-
- -
-
- *** -
- -
-
-
- *** -
49- -
99-
-
- *
**
-
- ***
****
- *****
-
-
-
18-
******
*******
********
*********
No maneja anagramas
12048 Compiladores II - J. Neira Universidad de Zaragoza 18
Ejemplos
int hash_horner(char *s, int M)
{
int h, a = 256;
for (h=0; *s != \0; s++) h = (a*h + *s) % M;
return h; bcba 47 ccad 1 baca 26 abad 4
}
bddc 43 bdac 83 dbcb 24 cada 85
dabc 85 dabb 84 dbab 17 dabd 86
dbdb 78 dcbd 60 dbdd 80
babb 74 bccc 2 addd 39
Test: abcd bcbd 50 adbc 31 bcda 55
256*(256*(256*97+98)+99)+100

mod despus de cada multiplicacin:

256*97+98 = 24930 % 101 = 84


256*84+99 = 21603 % 101 = 90
256*90+100 = 23140 % 101 = 11

Colisin al 21 (desviacin estndar grande).


12048 Compiladores II - J. Neira Universidad de Zaragoza 19
Ms ejemplos
unsigned hash_pjw (unsigned char *s)
{
unsigned i, hash_val = 0;
for (; *s; ++s) {
hash_val = (hash_val << 2) + *s;
if (i = hash_val & 0x3fff)
hash_val = (hash_val ^(i >> 12)) & ~0x3fff;
}
return hash_val;
}
Longitud media igual a hash_add
9% ms lenta que hash_add [Holub 90].

function uw_hash (s : string; M : integer) : integer;


var l : integer;
begin
l := length(s);
uw_hash := (ord(s[1]) * ord(s[l])) mod M;
end;
UW-PASCAL: sencilla, funciona razonablemente; es preferible
utilizar todos los caracteres.

12048 Compiladores II - J. Neira Universidad de Zaragoza 20


[Pearson, 90]
Especfica para cadenas de texto de longitud variable

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

12048 Compiladores II - J. Neira Universidad de Zaragoza 21


Manejo de colisiones
Mantener N < M: si h(s)mod M est ocupada intentar:
Resolucin lineal:
(h(s) + 1) mod M, (h(s) + 2) mod M, etc.

Lo que va mal tiende a empeorar:


clustering primario

Se forman largas cadenas, que


tienden a crecer ms
El costo promedio de buscar()
se acerca a M a medida que la
tabla se llena
Demasiado lento si la tabla est
al 70%-80%
Resolucin cuadrtica:

(h(s) + 1^2) mod M, (h(s) + 2^2) mod M, etc.


Tiene un problema parecido (clustering secundario)
12048 Compiladores II - J. Neira Universidad de Zaragoza 22
Manejo de colisiones
Hashing doble: otra funcin h determina los intervalos de los
saltos
h(s) mod M,
(h(s) + h(s)) mod M,
(h(s) + 2*h(s)) mod M,
etc.

Anlisis muy complejo


No es demasiado lento
hasta que la tabla se
ocupa al 90%-95%

12048 Compiladores II - J. Neira Universidad de Zaragoza 23


Escoger el valor de M
Evitar potencias de 2:
k mod 2b selecciona los b bits ms bajos de k
Ignora parte de la informacin
Si la funcin no es uniforme el los bits bajos, genera colisiones
innecesariamente

Hashing doble: h(s) y M deben ser primos relativos


Puede hacer imposible encon- La experiencia aconseja escoger
trar un sitio libre en una tabla no nmeros primos cercanos a po-
llena! tencias de 2:
Test:

h = 10, h = 3, M = 9 Tabla de ~4000 elementos:


1 4 7 1 4 7 1 4 7 1 4 7 ...
m = 4093
h = 10, h = 3, M = 10
0 3 6 9 2 5 8 1 4 7 0 3 ... Mayor n. primo <= 4096 = 212
12048 Compiladores II - J. Neira Universidad de Zaragoza 24
Manejo de colisiones
Permitir N >> M
(alternativa ms usual):
0 base
Encadenamiento de las 1
colisiones (tablas abiertas). indice
No falla cuando se llena
la tabla
Ocupacin mnima de
comienzo
espacio en la tabla ...
Funcin uniforme
acceso constante

las
lascolisiones
colisiones M-1 x
pueden
puedenser
serun
un
clase
rbol
rbolbinario?
binario?

12048 Compiladores II - J. Neira Universidad de Zaragoza 25


Tabla de dispersin y nombres
(son ortogonales)
bb aa ss ee i i nn dd i i cc ee cc oom
m i i ee nnzz oo xx

0
1


...

M-1

12048 Compiladores II - J. Neira Universidad de Zaragoza 26


4. Lenguajes de Bloques
Block Structured Languajes (Algol 60):
Cada lnea de un programa pertenece a una serie de bloques
(mbitos) anidados (abiertos)
El ms interno es el bloque actual
Los bloques que no contienen la lnea estn cerrados

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

void g (char j, int c)


{
double i, f;
static int d;
..
{
int i, j, c;
?
? }
f = i*a;
2
} 1
main ()
{
...
} 0

12048 Compiladores II - J. Neira Universidad de Zaragoza 29


4. Lenguajes de Bloques
Consideramos mbitos estticos: al compilar, puedo
determinar a qu objeto se refiere cada instruccin.
mbitos dinmicos: esto se determina durante la
ejecucin.
a : integer -- global declaration
procedure first
a := 1
procedure second
a : integer -- local declaration
first ()
a := 2
if read_integer() > 0 qu
quescribe
escribe
second ()
else este
esteprograma
programa
first () en
encada
cadacaso?
caso?
write_integer(a)

12048 Compiladores II - J. Neira Universidad de Zaragoza 30


4. Lenguajes de Bloques
Alternativa 1: Una tabla por bloque
cada mbito: actual

Abrir un bloque: apilar() bloques


abiertos
Cerrar un bloque:
desapilar()
ms
buscar(): se busca desde externo
el tope hacia abajo.
Pila de bloques

Ventaja: la operacin de desapilar()es muy eficiente.


Desventaja 1: la eficiencia de buscar()depende de la
profundidad del anidamiento.
Desventaja 2: c/bloque requiere una tabla de dispersin;
desperdicio de espacio.
12048 Compiladores II - J. Neira Universidad de Zaragoza 31
4. Lenguajes de Bloques
Alternativa 2: una sola tabla.
A c/objeto se le asocia un nmero de bloque diferente.
Nombres nuevos al comienzo de la lista de dispersin.
Al cerrar un bloque, se eliminan todos los objetos del
bloque a cerrar.
{
A int a,b; A b 1 a 1
....
{
B int b; B b 2 b 1 a 1
...
C } C b 1 a 1
...
D } D

Ventaja: la bsqueda es ms eficiente


Desventaja: la eliminacin es menos eficiente
En casos en los que se guarda la tabla de smbolos, esta
operacin no se usa.

12048 Compiladores II - J. Neira Universidad de Zaragoza 32


Alternativa 2: una sola tabla
Esta alternativa no es tan apropiada si las colisiones se
almacenan en rboles binarios:
nombre atributos

La insercin siempre se hace en las hojas.


La bsqueda tambin deber ir hasta las hojas para
determinar cul es la definicin ms interna un objeto.
Cerrar un bloque implica recorrer todo el rbol.

Se
Sepierde
pierdeel
elorden
ordende
deinsercin!
insercin!

12048 Compiladores II - J. Neira Universidad de Zaragoza 33


Resumen
Componentes de una tabla Debe respetarse la estruc-
de smbolos: turacin de bloques /
1. Espacio de nombres: se mbitos definidos en el
almacenan los nombres de programa.
los smbolos introducidos en
el programa.
2. Mecanismo de acceso: se Pilas de bloques:
utiliza para comenzar la actualizacin ms eficiente,
bsqueda de un smbolo. bsqueda poco eficiente.
Lista encadenadas
rboles binarios Una tabla para todos los
bloques: bsqueda muy
Tablas de dispersin eficiente, actualizacin menos
3. Tabla de atributos: se eficiente.
almacenan los atributos
asociados a un smbolo.
?

12048 Compiladores II - J. Neira Universidad de Zaragoza 34


5. Perspectiva
Registros y Campos: En C, PASCAL y ADA el
nombre del campo slo debe ser nico dentro de la
definicin del registro:
type r1 = record
a : integer; type a = record
b : real; a : integer;
end; b : record
a : char;
r2 = record b : boolean;
a : char; end;
b : boolean; end;
end;

Aumenta la legibilidad, y facilidad de programacin.


Cmo
Cmoimplementar
implementaresto
estoen
enla
latabla
tablade
de
smbolos
smbolosevitando
evitandoambigedades?
ambigedades?

12048 Compiladores II - J. Neira Universidad de Zaragoza 35


5. Perspectiva
Referencias hacia adelante: en algunos len-
guajes se permite usar nombres antes de decla-
rarlos:
Pascal: registros ADA: etiquetas
type asignatura = record
profesor = ^empleado; <<etiqueta>>
delegado = ^alumno; ...
... ...
end; goto etiqueta;

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.

type r = record ADA: prefijos


n : integer;
c : char; procedure P;
b : boolean; var X : real;
end; procedure Q;
var X : real;
var v : r; begin
..... X := P.X;
n := 0; ...

12048 Compiladores II - J. Neira Universidad de Zaragoza 37


5. Perspectiva
Alteracin de reglas de Problemas:
visibilidad: Las reglas de
visibilidad pueden ser alte- var v1, v2 : r;
radas por el programador: .....
PASCAL: sentencia with. with v1, v2 do
n := 0;
type r = record
n : integer;
c : char; Resuelto en Modula-3:
b : boolean;
end; WITH e = loquesea,
f = loquesea DO
var v : r; e.f1 = f.f2;
..... END;
with v do
n := 0;

12048 Compiladores II - J. Neira Universidad de Zaragoza 38


5. Perspectiva
Compilacin separada: un C: no existe el concep-
programa se construye con to de biblioteca en com-
mdulos compilados pilacin
separadamente. p.h
ADA: se basa en el typedef ..... t;
concepto de biblioteca
p.ads void q(.....);
package P is t1 f(.....);
type t is private;

procedure q(.....); q.c


function f(.....) return t1;
..... #include p.h
end P;

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;

ADA: Concepto de sobrecarga generalizado.


function + (x, y : complejo)
return complejo is ...
function + (u, v : polar)
return polar is ...

12048 Compiladores II - J. Neira Universidad de Zaragoza 40


6. tabla.c y tabla.h
Implementacin de una tabla de smbolos en forma de tabla
de colisiones abierta.
#include <listas.h>

#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 */

SIMBOLO *introducir_variable (TABLA_SIMBOLOS tabla,


char *nombre,
TIPO_VARIABLE variable,
int nivel, int dir);

/* NULL si el nombre ya aparece en la tabla con igual nivel, dlc


puntero a simbolo creado con esos datos */
12048 Compiladores II - J. Neira Universidad de Zaragoza 41
7. Ejercicios
1. Considera la posibilidad de que tu compilador de Pascual
detecte variables utilizadas sin tener valor asignado.
programa p;
entero i;

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.

leer: tLEER '(' lista_asignables ')' ';'


;

lista_asignables: tIDENTIFICADOR
{
...
$1.simbolo.asignada = 1;
...
}
| lista_asignables ',' tIDENTIFICADOR
;

12048 Compiladores II - J. Neira Universidad de Zaragoza 44


Tarea b)
Indica qu producciones habra que modificar, y cmo,
para implementar esta verificacin.

expresion:
...

factor: tIDENTIFICADOR
{
...
if (!$1.simbolo.asignada)
error(Variable sin valor asignado.);
...
}

12048 Compiladores II - J. Neira Universidad de Zaragoza 45


Tarea c)
Explica si tu solucin tiene limitaciones, es decir, si en
algn caso puede NO detecta una situacin de este tipo.

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

12048 Compiladores II - J. Neira Universidad de Zaragoza 46


Inicializadores
2. Considera la posibilidad de utilizar inicializadores para
variables simples en Pascual, ilustrada en el siguiente
ejemplo:

programa p;

var n = 1, c = "c", b = true;


.....
accion q (entero E i; caracter ES d);
var j = 2*i+1, g = entacar(caraent(d)+1), f = not b;
.....

Como puedes ver, en la sintaxis propuesta est explcito el


valor inicial, e implcito el tipo de variable.

12048 Compiladores II - J. Neira Universidad de Zaragoza 47


Tarea a)
Escribe las producciones que especifican sintcticamente
este tipo de declaracin de variables.

inicializadores: tVAR lista


;

lista: inicializador
| lista , inicializador
;

inicializador: tIDENTIFICADOR = expresion


;

12048 Compiladores II - J. Neira Universidad de Zaragoza 48


Tarea b)
Completa las producciones anteriores para incluir las
verificaciones semnticas y actualizaciones de tabla de
smbolos que sean pertinentes. Define los atributos que
requieras para cada smbolo.

12048 Compiladores II - J. Neira Universidad de Zaragoza 49


Funciones
3. Considera el siguiente trozo de programa Pascal:

function f (......) : .....;


function g (.......) : .....;
begin
.....
f := .....;
.....
end
begin
.....
end

TAREA a) Desde el punto de vista del compilador, es esto


aceptable? Explica tu respuesta.
TAREA b) Explica si esta situacin se da o no en C.

12048 Compiladores II - J. Neira Universidad de Zaragoza 50


mbitos
4. En un lenguaje con un solo mbito, variables de un tipo, y
sin declaraciones, puede el analizador lxico manejar la
tabla de smbolos?

10 REM programa simple en BASIC 4


20 REM
30 z = 0
40 IF a > 0 GOTO 60
50 z = 1
60 PRINT z, a

{identificador} {
if (!buscar_simbolo(tabla, yytext))
introducir_variable(tabla, yytext,...);
}

12048 Compiladores II - J. Neira Universidad de Zaragoza 51

También podría gustarte