AULA Nº 2.2

(Download da Aula)

<< anterior próxima >>
menu de aulas dúvidas
 

Estrutura Geral de um Compilador

 Esquema

Unidades Sintáticas

 

São as estruturas gramaticais de um programa, definidas através de uma gramática. (cap. 4)

Árvore Sintática

 

Exemplo: Um bloco com dois comandos.

 

Mostra a estrutura gramatical de um (trecho) de programa.

 

Cada um de seus nós representa uma unidade sintática.

 

Itens léxicos são as unidades sintáticas elementares.

Analisador Sintático.

 

Agrupa os itens léxicos em unidades sintáticas construindo a árvore sintática.

 

Usa uma série de regras sintáticas que constituem a gramática da linguagem fonte.

Gramática de Linguagem de Fonte.

 

Define a estrutura sintática do programa - fonte.

 

O reconhecimento desta estrutura sintática é essencial para o processo de compilação.

Analisador Léxico.

 

Trabalha com os caracteres do programa fonte agrupando-os no item léxico adequado.

 

Reconhece palavras reservadas, variáveis, números ...

Erros Sintáticos

 

Construções que não estão de acordo com as regras de construção de unidades sintáticas.

 

Exemplo de erro sintático: A + * B

 

O Analisador Sintático tem como funções emitir mensagens de erro e tratar o erro para analisar o restante do programa.

 Erros Léxicos

 

Exemplos: overflow de números inteiros, símbolos especiais inválidos.

 Análise Semântica

 

Toda a análise efetuada pelo compilador além da análise sintática: análise de contexto e geração de código.

 Analisador de Contexto

 

Exemplo 1: No comando A := 5 é necessária a seguinte análise:

 

1-

A foi declarado ? Se não o foi, há um erro de contexto.

 

2-

Em que escopo A foi declarado ? Procedimento mais interno englobando A, ou programa principal ?

 

3-

Qual é o tipo de A ? A é um parâmetro ?

 

4-

O tipo de A é um inteiro (compatível com o lado direito da atribuição) ? Se não o for há um erro de contexto.

 

5-

Qual é o endereço de A em código objeto?

 

Exemplo 2: No comando goto 5 :

 

1-

Sintaticamente perfeito, mas se 5 não tiver sido declarado como label, haverá um erro de contexto.

 

Exemplo 3: Trecho de código correto:

 

 

var B : boolean ;

. . . B + 5 . . .

 Gerador de Código

 

O gerador de código é a parte do compilador que gera o programa - objeto. O código é gerado sempre para determinadas unidades sintáticas, usando-se informações fornecidas pelo analisador de contexto.

 

Exemplo: A := 5

Isso gera na linguagem HAL:

 

 Pilha Sintática

 

Uma unidade sintática U pode ser composta de outras unidades sintáticas que devem ser analisadas antes de voltarmos antes de voltarmos à análise de U. Empilha-se a informação para retornar para o ponto de interrupção.

 Pilha Semântica

 

O Analisador Sintático empilha o identificador de itens léxicos na pilha semântica.

 

As informações da pilha de semântica são usadas pelo Analisador de Contexto e pelo Gerador de Código.

 

Exemplo 1:

 

 

Na declaração de uma variável, o analisador sintático coloca o seu id na pilha semântica e chama o analisador de contexto para determinar o seu tipo e colocar nome, tipo, endereço no programa - objeto e outras informações na tabela de símbolos.

 

Exemplo 2:

 

 

Geração de código objeto para uma operação aritmética: O gerador de código consulta a pilha semântica para saber qual é a operação e quais os operandos ( endereços são obtidos da tabela de símbolos).

 Rotina de Símbolos Reservados (Como implementar)

 

Programar um procedimento que leia a tabela de símbolos reservados, criando-a na memória.

 

Programar um procedimento que consulte a tabela de símbolos reservados para determinar se uma seqüência de caracteres pertence a ela.

 

Programar um procedimento que liste os símbolos da tabela de símbolos reservados.