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.

Entradas relacionadas: