You are on page 1of 8

Compiladores 2005/06

Aula Prática 7

Tabelas de símbolos
Eduardo Marques
DCC-Departamento de Ciência de Computadores
FCUP – Faculdade de Ciências da Universidade do Porto

Notas disponíveis em
http://www.dcc.fc.up.pt/~edrdo/compiladores

Tabelas de símbolos
● Uma tabela de símbolos é usado por um
compilador para manter informação sobre
construções da linguagem identificadas por um
nome:
– Variáveis
– Funções
– Tipos
● Que tipo de informação (além do nome)?
– Escopo, tipo, modificadores (depende da construção)

2
Interface a uma tabela de símbolos
● Semelhante ao de qualquer estrutura MAP genérica
MAP: Name → Symbol
● Provém duas operações básicas
– int stDefine(symbTree* st, char* name, symb* st)
– symb_t* stLookup(symbTree* st, char* name)
● stDefine()
– Chamada quando um novo símbolo é definido
● stLookup()
– Chamada para procurar um símbolo
● Outras duas pelo menos serão necessárias
– stCreate(), stFree() – para criação/libertação 3

Possíveis implementações
● As usuais para uma estrutura MAP
– Array (ou lista)
– Árvore (binária ou não)
– Hash tables ("flat" ou ligada)
● Geralmente combinadas com o uso de uma
"pool" de constantes - buffer único para guardar
os nomes (strings)

4
Array
0 1 2 3
info info info info
name name name name

'X' '\0' 'Y' '\0' 'A' 'B' 'C' '\0' 'D' 'E' 'F' '\0' .... ... ... ... ... ... ... ...

Constant
pool
5

Interface à pool de constantes


(usada pela ST)
● cp_t* cpCreate()
● cpFree(cp_t*)
● char* cpInsert(cp_t*, char* name)
● Eventualmente optimisado para não ter repetições
● Exemplo no código da aula 2: strbuf_ XXX(), ...

6
Árvore (binária)
info name
left right

info name info name


left right left right

info name info name


left right left right

'X' '\0' 'Y' '\0' 'A' 'B' 'C' 'X' '\0' 'D' 'E' 'F' '\0' ....

Tabela de hashing (ligada)

Bucket 1 info | name | next info | name | next


Bucket 2
Bucket 3
Bucket 4 info | name | next info | name | next
...
Bucket n

'X' '\0' 'Y' '\0' 'A' 'B' 'C' '\0' 'D' 'E' 'F' '\0' ....

8
Eficiência (tempo)
● Array desordenados
● Inserção: O(1)
● Pesquisa: O(n)
● Array ordenado
● Inserção: O(n/2)
● Pesquisa: O(log n)
● Árvore - Inserção / Pesquisa : O(log n)
● Hash table ligada - Inserção / Pesquisa: O(N/B) para
B=número de buckets ~ O(1) para B suficientemente
grande e boa definição de função de "hashing"
9
● Eficiência em espaço: todas O(n) ...

Propriedades de símbolos (em C)


● Tipos
– Escopo, expressão do tipo
● Variável
– Definição / Escopo / Storage
– Tipo
– Tamanho de array (para arrays)
– Nível de indirecção (para apontadores)
– Outros modificadores: por ex: const
● Função
– Tipo, parâmetros, storage, local de definição ...
10
Exercícios
● 1. Revisão de EDA
– Quais as características desejáveis de uma "hash function"
associada a uma tabela de "hashing" ?
● 2. Defina as operações para manter a "pool" de
constantes (criação / libertação / inserção)
● 3. Revisão de EDA: Defina depois o interface da
"symbol table" (stCreate(), stFree(), stDefine(),
stLookup()) usando, arrays, àrvores, ou tabelas de hash
● 4. Adapte a gramática bison da aula 4 para fazer
verificação de tipos, tendo em conta um interface para
tabela de símbolos
11

Escopo - alguns casos a considerar


(em C)
int global; Global, utilizável externamente

static int module_internal;


Global mas interna
int func(int arg_x, int arg_y){

int var_x, var_y; Local ao bloco da função


{

float var_x, int var_y;

...
Locais ao bloco interno
}
12
}
Escopo & ST
- possível implementação
● Tabela de símbolos globais (externos)

● Tabela de símbolos globais (internos ao módulo)

● Cada função tem a sua tabela de símbolos com


diferenciação do escopo por bloco usando esquema de
numeração de blocos.
● Existe um indicador de "profundidade" de escopo
associado a cada instância do símbolo e TS é
ordenada em função desse indicador por forma a que
o escopo válido mais recente seja o obtido.
– stLookup(st, name, int scopeDepth)
● Também poderiamos usar linhas iniciais e finais de 13
para identificar o escopo.

ST com tabela de hashing


e indicador de escopo ...

Bucket 1 ... info | 0 | name


Bucket 2
Escopo mais recente primeiro
Bucket 3
Bucket 4 info | 2 | name info | 1 | name
...
Bucket n

'V' '_' X' '\0' 'V' '_' 'Y'\0' 'A' 'R' 'G' '_' 'X''\0' ....

14
Exercícios
● 5. Indique as alterações gerais necessárias à
gramática bison (sintaxe e acções semânticas)
definida no exercício 4 para lidar com blocos
internos de instruções dentro de funções. Depois
implemente-as.

15

You might also like