Compiladores: Fases, Erros e Tabela de Símbolos
Classificado em Tecnologia
Escrito em em português com um tamanho de 3,59 KB
Analisador Léxico
Sua tarefa principal é ler os caracteres de entrada e produzir uma sequência de tokens que o analisador sintático utiliza. Quando recebe do analisador sintático um comando para "obter o próximo token", o analisador léxico lê os caracteres de entrada até identificar o próximo token.
Uma de suas funções é remover comentários e espaços em branco (como espaços, tabulações e quebras de linha) do programa-fonte.
Analisadores Sintáticos: Métodos Top-Down e Bottom-Up
Os métodos mais usados nos compiladores são classificados como descendentes (top-down) ou ascendentes (bottom-up).
Como indicado por seus nomes, os analisadores sintáticos descendentes constroem árvores do topo (raiz) para o fundo (folhas), enquanto que os ascendentes começam pelas folhas e trabalham árvore acima até a raiz. Em ambos os casos, a entrada é varrida da esquerda para a direita, um símbolo de cada vez.
Neste tipo de análise sintática (referindo-se ao bottom-up), a construção da árvore de derivação para uma determinada cadeia começa pelas folhas da árvore e segue em direção à sua raiz. Caso seja obtida uma árvore cuja raiz tem como rótulo o símbolo inicial da gramática, e na qual a sequência dos rótulos das folhas forma a cadeia dada, então a cadeia é uma sentença da linguagem, e a árvore obtida é a sua árvore de derivação.
Classificação de Erros em Compiladores
- Léxicos: Erros na grafia de um identificador, palavra-chave ou operador.
- Sintáticos: Erros como uma expressão aritmética com parênteses não balanceados.
- Semânticos: Erros como um operador aplicado a um operando incompatível.
- Lógicos: Erros como uma chamada infinitamente recursiva.
Verificações Essenciais em Compiladores
Verificação de Tipos
Um compilador deveria relatar um erro se um operador for aplicado a um operando incompatível.
Verificação do Fluxo de Controle
Os comandos que fazem o fluxo de controle deixar uma construção precisam ter algum local para onde transferir o controle. Por exemplo, o comando break
em C faz com que o controle deixe o while
, for
ou switch
envolvente mais interno; um erro ocorre se tal comando envolvente não existir.
Verificação de Unicidade
Existem situações nas quais um objeto precisa ser definido exatamente uma vez. Por exemplo, em Pascal, um identificador precisa ser declarado unicamente.
Verificações Relacionadas aos Nomes
Algumas vezes, o mesmo nome precisa figurar duas ou mais vezes. Por exemplo, em Ada, um laço ou bloco precisa ter um nome que apareça no início e no final da construção. O compilador precisa verificar se o mesmo nome é usado em ambos os locais.
Tabela de Símbolos
Uma tabela de símbolos é uma estrutura de dados contendo um registro para cada identificador, com os campos contendo os atributos do identificador.
As informações sobre o identificador são coletadas pelas fases de análise de um compilador e usadas pelas fases de síntese para gerar o código-alvo. Durante a análise léxica, a cadeia de caracteres que forma um identificador é armazenada em uma entrada da tabela de símbolos. As fases seguintes do compilador acrescentam informações a esta entrada. A fase de geração utiliza as informações armazenadas para gerar o código adequado.