Um compilador usa uma tabela de símbolos para guardar informações sobre os nomes declarados em um programa. A tabela de símbolos é pesquisada cada vez que um nome é encontrado no programa fonte. Alterações são feitas na tabela de símbolos sempre que um
novo nome ou nova informação sobre um nome já existente é obtida.
A gerência da tabela de símbolos de um compilador deve ser implementada de forma a permitir
inserções e consultas da forma mais eficiente possível, além de permitir o crescimento dinâmico da mesma.
Com isso é possível concluir que a tabela de símbolos serve como um banco de dados para o processo de compilação. Seu principal conteúdo são informações sobre tipos e atributos de cada nome definido pelo usuário no programa. Essas informações são colocadas na tabela de símbolos pelos analisadores léxico e sintático e usadas pelo analisador semântico e pelo gerador de código.
Entradas na tabela de símbolos
Cada entrada na tabela de símbolos é a declaração de um nome. O formato das entradas pode não ser uniforme (embora seja mais fácil manipular entradas uniformes) porque as informações armazenadas para cada nome podem variarde acordo com o tipo/uso do nome.
Cada entrada na tabela de símbolos pode ser implementada como um registro ("record" ou "struct") contendo campos (nome, tipo, classe, tamanho, escopo, etc.) que a qualificam.
Tipos de Entradas:
- palavras reservadas: inseridas inicialmente na tabela (antes da análise léxica ser iniciada);
- fortemente relacionadas com o papel de um nome no contexto da linguagem fonte;
- o analisador léxico pode começar o processo de entrada dos nomes -- risco: nome pode denotar objetos distintos.
Exemplo:
int x;
struct x {float y, z;};
x: inteiro e rótulo de uma estrutura de campos.
Neste caso:
- léxico retorna ao sintático o nome (ou um apontador para o lexema que forma o nome);
- registro na tabela: criado quando o papel sintático do nome for detectado
- duas entradas para x: inteiro e estrutura.