Estrutura de um Compilador
Last updated
Last updated
Tal como na linguagem natural, as linguagens high-level, a sua compilação envolve mais que uma linguagem:
Análise léxica:
Composição de letras e outros caracteres em palavras.
Análise sintáctica:
Composição destas palavras em estruturas sintácticas adequadas.
Análise semântica:
Verificação se a estrutura sintáctica tem significado.
Conversão da sequência de caracteres em sequência de elementos lexicais.
Cada elemento lexical pode ser definido por um tuplo, com uma identificação do elemento e do seu valor.
Exemplo:
pos = pos + vel + 5;
<id,pos> <=> <id,pos> <+> <id, vel> <+> <int, 5> <;>
Os espaços brancos são eliminados pelo analisador lexical.
Chamada também de parsing.
Onde se verifica a conformidade da sequência de elementos lexicais com a estrutura sintática da linguagem.
Podemos fazer uma aproximação à sua estrutura formal através duma representação tipo árvore. Para isso, é necessário que se especifique um estrutura desejada, baseada numa gramática.
Duas características das árvores sintácticas:
Não incluem alguns elementos lexicais.
Definem sem ambiguidade a ordem das operações.
Parte final do front end do compilador.
São verificadas restrições que não o foram nas duas fases anteriores. Exemplo:
verificar se um identificador foi declarado,
verificar a conformidade no sistema de tipos da linguagem.
Note-se que apenas restrições com verificação estática, podem ser objecto de análise.
Utiliza a árvore sintáctica da análise sintáctica assim como uma estrutura de dados designada por tabela de símbolos (assente em arrays associativos).
Esta última fase de análise deve garantir o sucesso das fases subsequentes.
Havendo garantia de que o código da linguagem fonte é válido, então podemos passar aos efeitos pretendidos com esse código.
Podem ser:
simplesmente a indicação de validade do código fonte;
a tradução do código fonte numa linguagem destino;
ou a interpretação e execução imediata.
Pode haver interesse na identificação e localização precisa de eventuais erros.
É usual indicar não só a instrução mas também a linha onde cada erro ocorre.