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