Você está na página 1de 5

INTRODUÇÃO A

COMPILADORES
TABELA DE SÍMBOLOS

INTRODUÇÃO

Um compilador usa uma tabela de símbolos (ts) para guardar informações sobre os
nomes declarados em um programa. A ts é pesquisada cada vez que um nome é encontrado
no programa fonte. Alterações são feitas na ts sempre que um novo nome ou nova informação
sobre um nome já existente é obtida.
A gerência da ts 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.

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 variar de 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.

Tabela de Símbolos
Funções:
Armazenar as informações sobre os nomes declarados num programa podendo ser:
 Variáveis
 Procedimentos
 Funções
 Métodos
 Classes
Entre outros
Usada, pelo analisador semântico, para verificar se uma variável foi declarada, na
verificação de compatibilidade de tipos, entre outras consultas que forem necessárias.
Pode ser usada para armazenar os valores das variáveis durante a execução do
programa.
Utilizado no ambiente de debug.
Por ser muito utilizada em consultas, é importante que a estrutura de dados tenha
uma performance considerável.
Também é necessário o crescimento dinâmico de tal estrutura de dados
Por isso a escolha da tabela hashing em nosso trabalho
Devem ser guardados quais endereços de memória serão associados às variáveis
No nosso trabalho foi utilizado o atributo referência na classe Símbolo para essa
utilidade
Escopo:
Um programa pode ter várias tabelas de símbolos dando assim o escopo para os
símbolos. Alguns exemplos:
 Tabela de Símbolos globais (externos)
 Tabela de Símbolos globais (internos ao módulo)
 Tabela de Símbolos de uma função
Cada função tem a sua própria tabela de símbolos
ESCOPO EM 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) { Local ao bloco da função
Int var_x, var_y; Local ao bloco da função
{
Float var_x, int var_y; Locais ao bloco interno
...
}
]
Utilizando a Tabela de Símbolos:
 As informações armazenadas para cada símbolo podem variar de acordo com o
tipo/uso (não sendo o caso do nosso trabalho);
 Cada entrada na tabela pode ser implementada como um registro contendo campos
(nome, tipo, classe, tamanho, escopo, etc.) sobre o símbolo.
 Cria-se a classe Símbolo.
 Cria-se a classe Tabela (Tabela de Símbolos).
 A interação se dar por ações semânticas inseridas no analisador sintático, na classe
principal do compilador.
 A tabela se símbolos interage com quase todas as fases do compilador: varredura,
análise sintática e análise semântica.
- Elas podem fornecer identificadores à tabela
-O analisador semântico interage com os tipos de dados e outras informações
-As fases de otimização e geração de código utilizam a informação da tabela
para efetuar escolhas apropriadas

COMPILADORES
Uma tabela de acesso direto consiste basicamente de:
1. Um arranjo de tamanho fixo com m apontadores
para entradas de tabela (idealmente um número
primo);
2. Entradas de tabela organizadas em m listas
encadeadas separadas, chamadas buques
("buckets"). Cada entrada da tabela de símbolos
aparece em somente uma dessas listas.

ANÁLISE LÉXICA

A análise léxica pode ser encarada como a primeira etapa do processo de compilação.
Nesta etapa, o programa fonte é encarado como uma sequência de caracteres que deverão ser
agrupados e identificados como palavras reservadas da linguagem (em C, por
exemplo, main, int, for), constantes (123, 0x1F, 'A'), identificadores (myvar, Str1).Inicialmente
serão apresentados alguns aspectos genéricos no reconhecimento de símbolos.
Posteriormente, será apresentada uma ferramenta amplamente utilizada na
programação de sistemas para gerar automaticamente analisadores léxicos.
Papel do analisador léxico: ler o arquivo fonte em busca de unidades significativas (os tokens)
Instanciadas por lexemas ou átomos.
 Os tokens usualmente sã o conhecidos pelo seu lexema(seqü ência de caracteres
que compõ e um ú nico token) e atributos adicionais.
 Os tokens podem ser entregues ao parser como tuplas na forma <a, b, ..., n> assim a
entrada:
a=b+3
q poderia gerar as tuplas:
<id,a> <=, > <id, b> <num, 3>
 Note que alguns tokens nã o necessitam atributos adicionais.
 Reconhece e classifica as palavras (tokens)
 Texto de entrada

 Cadeia de Tokens reconhecida:

Quais os tokens que podem ser reconhecidos em uma linguagem de programação como C ?
Palavras reservadas if else while do
Identificadores
Operadores relacionais < > <= >= == !=
Operadores aritméticos +*/-
Operadores lógicos && || & | !
Operador de atribuição =
Delimitadores ;,
Caracteres especiais ()[]{}

Normalmente
utiliza-se um
único atributo que é um apontador para a Tabela de Símbolos que armazena essas
informações em registros.

ANÁLISE SINTÁTICA

Embora a análise sintática consiga verificar se uma expressão obedece às regras de


formação de uma dada gramática, seria muito difícil expressar através de gramáticas algumas
regras usuais em linguagem de programação, como ``todas as variáveis devem ser declaradas''
e situações onde o contexto em que ocorre a expressão ou o tipo da variável deve ser
verificado.
O objetivo da análise semântica é trabalhar nesse nível de inter-relacionamento entre
partes distintas do programa. As tarefas básicas desempenhada durante a análise semântica
incluem a verificação de tipos, a verificação do fluxo de controle e a verificação da unicidade
da declaração de variáveis. Dependendo da linguagem de programação, outros tipos de
verificações podem ser necessários.
Considere o seguinte exemplo de código em C:

A tentativa de compilar esse código irá gerar um erro detectado pelo analisador
semântico, mais especificamente pelas regras de verificação de tipos, indicando que o
operador módulo % não pode ter um operador real. No compilador gcc, essa mensagem é:

ANÁLISE SEMÂNTICA

A análise semântica mais comum consiste na verificação da consistência de tipos dos


operandos envolvidos em operações aritméticas ou dos parâmetros passados a
procedimentos.
O código intermediário deve ser fácil de produzir e fácil de traduzir no programa
objeto.

Você também pode gostar