Práctica: Análisis Semántico

Extienda el código de la práctica 2.9.5 para comprobar la compatibilidad de tipos.



1 p $ \rightarrow$ b
2 b $ \rightarrow$ ds ss
3 b $ \rightarrow$ ss
4 ds $ \rightarrow$ d ';' ds
5 ds $ \rightarrow$ d ';'
6 d $ \rightarrow$ INT il
7 d $ \rightarrow$ STRING il
8 ss $ \rightarrow$ s ';' ss
9 ss $ \rightarrow$ s
10 s $ \rightarrow$ ID '=' e
11 s $ \rightarrow$ '{' b '}'
12 s $ \rightarrow$ P e
13 s $ \rightarrow \epsilon$
14 e $ \rightarrow$ e1 '+' t
15 e $ \rightarrow$ e1 '-' t
16 e $ \rightarrow$ t
17 t $ \rightarrow$ t1 '*' f
18 t $ \rightarrow$ t '/' f
19 t $ \rightarrow$ f
20 f $ \rightarrow$ '(' e ')'
21 f $ \rightarrow$ ID
22 f $ \rightarrow$ NUM
23 f $ \rightarrow$ STR
24 il $ \rightarrow$ ID ',' il
25 il $ \rightarrow$ ID


En cuanto a las sentencias de bloque, se pretende que el ámbito y visibilidad de las variables sea como en el lenguaje C, esto es, las declaraciones mas internas con el mismo identificador ocultan las mas externas. Así:

int a;
a = 4;
{
  int a;
  a = 5;
  p a
}; /* el ; es necesario */
p a

Imprimiría 5 y 4. Para traducir esta sentencia es necesario usar una lista/pila de referencias a tablas de símbolos. Cada sentencia compuesta o bloque tendrá su propia tabla de símbolos. Los identificadores se búscan en la lista de referencias a tablas de símbolos, primero en la última tabla de símbolos insertada y sino se encuentra se busca en la penúltima insertada, etc.

Guarde como un atributo del identificador ($ SYMTABLE$) la referencia a la tabla de símbolos a la que pertenece. Guarde como un atributo del nodo bloque ($ BLOCK$) la referencia a la tabla de símbolos asociada.

Casiano Rodríguez León
2009-12-09