I - Noções dum compilador
• Partes dum compilador
• Ferramentas de construção de compiladores
• Bibliografia aconselhada:
– Aho, Sethi e Ullman – Cap. 1
Jorge Morais
LFA 1999/2000 - 1
Partes dum compilador
• Análise
– Análise léxica
– Análise sintáctica
– Análise semântica
• Geração de saída
– Geração de código
– Optimização de código
• Tabela de símbolos
• Tratamento de erros
Jorge Morais
LFA 1999/2000 - 2
Tabela de símbolos
• Identificadores e respectivos atributos
• Variáveis:
– Tipo
– Âmbito
• Funções
–
–
–
–
Número de argumentos
Lista com tipos dos argumentos
Método de passagem (valor/referência)
Tipo de retorno
Jorge Morais
LFA 1999/2000 - 3
Tratamento de erros
• Detectar e emitir erro
• Avançar para resto da compilação
• Erros léxicos – resto da entrada não forma nenhum
token
• Erros sintácticos – posição do token não obedece
às regras sintácticas
• Erros semânticos – apesar de estar sintacticamente
correcta, a estrutura não faz sentido
Jorge Morais
LFA 1999/2000 - 4
Geração de código intermédio
• Instruções duma Máquina Abstracta
• Exemplo: y = x + 'a' ;
– Tabela de símbolos: id1 {y,float}; id2 {x,float}
t1 = (float)97
t2 = id2 + t1
id1 = t2
Jorge Morais
LFA 1999/2000 - 5
Optimização de código
• Tentar optimizar o código final de modo a
ficar mais rápido
• No exemplo anterior pode-se reduzir o
número de instruções para apenas uma:
id1 = id2 + 97.0
Jorge Morais
LFA 1999/2000 - 6
Geração de código final
• Código objecto
• Linguagem assembly/linguagem máquina
recolocável
• No exemplo, em assembly, temos:
MOVF id2 , R1
ADDF #97.0 , R1
MOVF R1 , id1
Jorge Morais
LFA 1999/2000 - 7
Contexto dum compilador
Jorge Morais
LFA 1999/2000 - 8
Pré processador
• Produzem a entrada para compiladores
• Processamento de macros
– Simplificação de grandes construções
• Inclusão de ficheiros
– Ficheiros de cabeçalho
• Pré processador “racional”
– Aumento de facilidades na linguagem
• Extensões de linguagem
– Código embebido doutras linguagens
Jorge Morais
LFA 1999/2000 - 9
Assembler
• Código assembly
• Mnemónicas  código máquina
• Gera código máquina recolocável:
– a cada variável é associado um endereço
– cada instrução máquina com endereços é
marcada para posterior recolocação
Jorge Morais
LFA 1999/2000 - 10
Loader/Link Editor
• Loader costuma fazer as duas tarefas
• Adicionar o endereço onde os dados serão
carregados ao endereço recolocável
• Ligar vários programas compilados
separadamente
• Alterar endereços de referências externas
Jorge Morais
LFA 1999/2000 - 11
Ferramentas de auxílio
• Geradores de parsers (yacc, bison)
• Geradores de scanning (lex, flex)
• Engenhos de tradução dirigida pela sintaxe
(gramáticas de atributos)
• Geradores de código automático (uso de
templates)
• Engenhos de fluxo de dados (optimização
de código)
Jorge Morais
LFA 1999/2000 - 12