Você está na página 1de 6

Estrutura de um compilador

No processo de traduo de uma linguagem fonte para uma linguagem


objeto, existem duas tarefas bsicas a serem executadas por um
compilador:
Anlise (front end) = o texto de entrada na linguagem fonte examinado,
verificado e compreendido; recebe o programa fonte, verifica as partes
constituintes desse programa e impe uma estrutura gramatical sobre elas.
Sntese (back end) = o texto de sada, na linguagem objeto gerado, de
forma a corresponder ao texto de entrada. Recebe uma representao
intermediria do programa e constri o programa para a maquina alvo.
Estas duas fases podem ser intercaladas, no necessitando que a anlise
seja completamente feita para poder passar para sua gerao do primeiro
trecho de cdigo.
A tarefa de analise deve ter como resultado uma representao do
programa fonte que contenha informao suficiente para a gerao do
programa objeto correspondente. Esta representao, conhecida como
representao intermediria complementada por tabelas que contem
informao adicional sobre o programa fonte.

Tabela de smbolos, guarda para cada identificador (smbolo) as informaes


correspondentes
Sintaxe = forma de construo de programas corretos na linguagem;
(analise)
Semantica = descreve o que acontece quando o programa executado;
(gerao de codigo)
Por razes de convenincia prtica, a fase de anlise normalmente se
subdivide em anlise lxica, anlise sinttica e anlise semntica. Sabe-se
que possvel representar completamente a sintaxe de uma linguagem de
programao atravs de uma gramtica sensvel ao contexto mas como no
existem algoritmos prticos para tratar essas gramticas, a preferncia
recai em usar gramticas livres de contexto. Assim, a separao entre
anlise sinttica e anlise semntica dependente de implementao:
deixa-se para a anlise semntica a verificao de todos os aspectos da
linguagens que no se consegue exprimir de forma simples usando
gramticas livres de contexto.
Por outro lado, sabe-se que a implementao de reconhecedores de
linguagens regulares (autmatos finitos) mais simples e mais eficiente do
que a implementao de reconhecedores de linguagens livres de contexto
(autmatos de pilha). Como possvel usar expresses regulares para
descrever a estrutura de componentes bsicos das linguagens de
programao, tais como identificadores, palavras reservadas, literais
numricos, operadores e delimitadores, essa parte da tarefa de anlise
(anlise lxica) implementada separadamente, pela simulao de
autmatos finitos.
Assim, a anlise lxica tem como finalidade a separao e identificao dos
elementos componentes do programa fonte; normalmente esses
componentes so especificados atravs de expresses regulares. A anlise
sinttica deve reconhecer a estrutura global do programa, descrita atravs
de gramticas livres de contexto. A anlise semntica se encarrega da
verificao das regras restantes. Essas regras tratam quase sempre da
verificao de que os objetos so usados no programa da maneira prevista
em suas declaraes, por exemplo verificando que no h erros de tipos.

Formas de Implementar um compilador


Fase = realiza uma funo bem definida no processo de compilao
Passo = passagem do programa compilador sobre o programa fonte que
est sendo compilado
Como definir o numero de passos:
-

Memoria Disponvel;
Tempo de Compilao;
Caractersticas da linguagem;
Referencias futuras;
Tempo de execuo;
tamanho da equipe;
prazo para desenvolvimento;

Analisador lxico = (scanner) l o fluxo de caracteres do programa fonte e


agrupa esses caracteres em lexemas;
Analisador sinttico = (parser) usa os tokens para produzir uma
representao na forma de rvore a fim de representar a estrutura
gramatical do fluxo de tokens
Estrutura de um compilador
1) Analisador semntico = utiliza a arvore semntica e a tabela de
smbolos para verificar a consistncia semntica do programa para a
definio da linguagem;
2) Gerao de cdigo intermedirio = representao intermediaria do
programa fonte a partir da arvore sinttica;

3) Otimizao de cdigo = algoritmos para melhorar a qualidade do


cdigo intermedirio visando gerar um cdigo de maquina melhor
4) Gerao de cdigo = recebe como entrada a representao
intermediria e mapeia esse programa para a linguagem alvo (cdigo
de maquina)