Compilador é um processador de linguagens. Um programa que traduz um programa escrito em uma linguagem (linguagem fonte) e gera um programa equivalente escrito em outra linguagem (linguagem alvo ou linguagem objeto).
Suas funcionalidades são divididas em duas etapas: análise e síntese.
Análise
- Também denominada de front-end do compilador.
- O compilador subdivide o programa fonte e o submete a análise a fim de verificar sua correção conforme a linguagem de programação fonte.
- Compreende análise léxica, análise sintática e análise semântica.
- Na presença de uma não conformidade com as especificações da linguagem fonte, o compilador apresenta mensagem esclarecedora do erro.
- O compilador armazena informações sobre o programa fonte em uma estrutura denominada tabela de símbolos.
Síntese
- Também denominada de back-end do compilador.
- O compilador constroi o programa objeto com base na representação intermediária (código intermediário) e nas informações da tabela de símbolos.
- Alguns compiladores podem realizar também otimizações nos código gerados
- A primeira fase do compilador é a análise léxica ou leitura (scanning).
- O analisador léxico lê o arquivo do programa fonte, caractere a caractere, e os agrupa em sequências significativas denominadas lexemas.
- Para cada lexema obtido do código fonte, o analisado léxico gera um token no formato abaixo. Esse token é passado para o analisador sintático.
Nela, também foi implementada a tabela de símbolos, uma estrutura de dados na qual são armazenadas informações sobre os nomes utilizados no programa:
- Nome, tipo, escopo, espaço de memória alocado
- No caso de funções: quantidade e tipos de argumentos , tipo de retorno, método de passagem de parâmetro
A estrutura deve ser projetada de forma a permitir que o compilador armazene e recupere rapidamente dados de nomes encontrados no programa fonte.
A segunda fase do compilador é a análise sintática. Ele recebe como entrada os tokens identificados pelo analisador léxico e cria uma representação da estrutura gramatical da sequência de tokens.
- A representação utilizada pelo analisador sintático é uma árvore sintática.
- O analisador sintático verifica se a ordem em que os tokens aparecem no código fonte está de acordo com a sintaxe da linguagem.
A terceira fase do compilador. O analisador semântico utiliza a tabela de símbolos e a árvore sintática gerada pelo analisador sintático para verificar se o programa está semanticamente de acordo com as especificações da linguagem fonte.
Sua atividade principal realizada pelo analisador semântico é a verificação de tipos: consiste em verificar se cada operador possui operandos compatíveis
Geração de Código Intermediário1
É uma representação intermediária (código intermediário) de baixo nível pode ser gerada pelo compilador a fim de facilitar a tradução para a linguagem alvo.
Exemplo de representação intermediária: código de três endereços.
- Sequência de instruções do tipo assembly
- Cada instrução possui até três operandos
- Cada instrução de atribuição possui no máximo um operador do lado direito
- O compilador precisa gerar um nome temporário para guardar o valor computado
Para a execução do arquivo utilize o codigo no terminal:
* java -jar /ArquivoJAR/Compilador.java
Alunos:
Bruna Gomes
Diego Simões
Marina Bernardes
Footnotes
-
O gerador de código está em construção
↩