|
|
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. |