1 | p
![]() |
2 | b
![]() |
3 | b
![]() |
4 | ds
![]() |
5 | ds
![]() |
6 | d
![]() |
7 | d
![]() |
8 | ss
![]() |
9 | ss
![]() |
10 | s
![]() |
11 | s
![]() |
12 | s
![]() |
13 | s
![]() |
14 | e
![]() |
15 | e
![]() |
16 | e
![]() |
17 | t
![]() |
18 | t
![]() |
19 | t
![]() |
20 | f
![]() |
21 | f
![]() |
22 | f
![]() |
23 | f
![]() |
24 | il
![]() |
25 | il
![]() |
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 (
)
la referencia a la tabla de símbolos
a la que pertenece. Guarde como un atributo del nodo bloque (
)
la referencia a la tabla de símbolos asociada.