A Construção de Compiladores

 

A construção de compiladores para linguagens imperativas é uma tarefa já suficientemente sintetizada pela literatura de computação e que envolve compreender, adaptar à especificação da linguagem e implementar as estruturas mostradas na Figura 5.

Suponha por exemplo que um compilador Pascal-like recebe com entrada o seguinte trecho de código:
circunf:=2*pi*raio
Na primeira etapa do compilador, o trecho passa pelo analisador léxico, que o vê como uma sequência de caracteres. Após a leitura do primeiro caracter, que é o c, o analisador léxico identifica que a sequência corrente de caracteres deve estar definindo um identificador, o que é verdade. Quando encontra o primeiro caracter do símbolo de atribuição, ele retorna para o analisador sintático que encontrou um identificador e que seu nome é circunf. O mesmo processo de repete, quando identifica um <símbolo de atribuição> + <número> + <símbolo de multiplicação> + <identificador> + <símbolo de multiplicação> + <identificador>, como mostrado abaixo.

Este trecho está correto do ponto de vista sintático, mas isso não é sempre verdade. Como o analisador léxico não verifica a corretude sintática (isso é próprio do analisador sintático), sua saída pode ser um código incorreto. Por exemplo, um trecho como circunf:=2 pi raio é lexicamente correto mas não sintaticamente.

O produto do analisador sintático, por sua vez, é a árvore sintática do código, devidamente coerente com a gramática da linguagem. O desenho abaixo ilustra a árvore sintática gerada.

Como, passo seguinte do compilador, o analisador semântico verifica a tipagem dos identificadores do código. Supondo que todos os identificadores são reais, a única tarefa do analisador será adicionar à árvore a conversão do número 2 para real, gerando a árvore a seguir.

Se a representação final do programa compilado deve ser na forma de árvore sintática, esta árvore é a saída do compilador. É o caso de um interpretador, que possui praticamente toda a estrutura de um compilador, mas que executa o código a partir da árvore sintática, após passagem pelo analisador semântico. No caso dos compiladores em geral, é necessário ainda passar pelos geradores de código que realizarão a translação da árvore para o código final compilado.

No estudo de compiladores estamos interessados, no mínimo, em: sistematizar cada uma das etapas do processo de compilação, procurar linguagens que formalizem as construções encontradas nos programas e projetar algoritmos que implementem cada uma das etapas. Aqui vamos nos deter em descrever mais detalhadamente a análise léxica e análise sintática.


VoltarHomePróximoe-mail