You are on page 1of 24

Compiladores

Conceitos Básicos

Professor: Cristiano Rodrigo Azevedo

Email: cristiano.azevedo@unoesc.edu.br
Visão Geral
 Analisadores Sintáticos, juntamente com analisadores
léxicos são componentes fundamentais dos compiladores.
 O Sistema permite a criação e manipulação de
representações visuais de gramáticas livres de contexto.
 Estas representações, juntamente com definições
adicionais, são convertidas em tabelas.
 As tabelas, mais um interpretador genérico, são usadas
para compor um analisador sintático.
Introdução

 Análise Léxica: Analisa a partir da quebra da entrada do


código fonte em palavras conhecidas como tokens.

 Análise Sintática: Analisa a estrutura de frases do


programa.

 Análise Semântica: Calcula o “significado” do programa


Análise sintática

final = (nota1 + nota2) / 2;


Tabela de Símbolos

Analisador Léxico Id1 final double ...

Id2 nota1 double ...


Id1, =, (, Id2, +, Id3, ), /, 2 Id3 nota2 double ...

...
Analisador Sintático

Id1 /

+ 2

Id2 Id3
Os erros podem ser:

 Léxicos: tais como errar a grafia de um identificador,


palavra-chave ou operador

 Sintáticos: tais como uma expressão aritmética com


parênteses não balanceados

 Semânticos: tais como um operador aplicado a um


operando incompatível lógicos, tais como uma chamada
infinitamente recursiva
Função do Analisador sintático
 O Analisador sintático desempenha ainda outra importante
função:
 A construção da árvore sintática (árvore de derivação)
do programa fonte.
 Uma árvore sintática é uma estrutura em forma de árvore
que descreve as construções da linguagem reconhecidas
pelo AS no programa fonte.
 Se o programa fonte possui um comando if, sua árvore
sintática deve espelhar esse fato e descrever como esse
comando é formado.
Arquitetura básica Analisador
sintático

tabela de
símbolos

Sequência Aceita ou
de símbolos
Analisador
Rejeita

Árvore de
sintaxe
Existem três estratégias gerais
de análise:
 Universal
 Podem analisar qualquer gramática livre de contexto
(GLC).
 Exemplo: o algoritmo de Coke‐Younger‐Kasami e o
algoritmo de Earley

 Reconhecimento descendente (“top-down”)

 Reconhecimento ascendente (“bottom-up”)


Analisadores

 Analisador Descendente e Analisador Ascendente são


aplicáveis em quase todos os casos, mas com eficiência
apenas a certas subclasses gramaticais
 LL (Left to Right - Leftmost derivation )
 LR (Left to Right - Rightmost derivation )
 A maioria das linguagens de programação consegue ser
descritas por gramáticas LL (convenientes para
implementação manual) e LR (adequadas para construção
automática).
Reconhecimento Descendente
 Reconhecimento descendente (“top-down”)
 Um reconhecedor descendente efetua o
reconhecimento de uma frase construindo uma árvore
de derivação partindo da raiz e terminando nas folhas,
criando os nós da árvore segundo uma travessia
descendente da esquerda para a direita.
Entrada: ccbca
Top-Down/Esquerda
S→AB S ⇒ AB
A→c ⇒ cB
B→cbB ⇒ ccbB
B→ca ⇒ ccbca
Reconhecimento Descendente
 A árvore é construída da raiz para as folhas
 Em cada vértice (com um símbolo não terminal A):
 selecionar uma produção com A à esquerda e construir
os vértices filhos de A com os símbolos à direita nessa
produção;
 selecionar o vértice onde continuar.
 Termina quando todas as folhas são símbolos terminais.
 A aceitação dá-se a sequência 𝛼 for esgotada.
 As decisões são tomadas por observação de 𝛼↑, chamado
“look ahead” símbolo.
Reconhecimento Descendente
 Criando os nós da árvore em pré‐ordem (busca em profundidade)

 Produz uma derivação mais à esquerda para uma cadeia de entrada

 São 2 tipos
 ASD com retrocesso

 Método de tentativa e erro

 ASD Preditivo

 Recursivo

 Não recursivo
Exemplo
if (a - 10 > b * 2)
a = b;
if

> =

- * a b

a 10 b 2
Reconhecimento Ascendente

 A árvore é construída das folhas para a raiz.

 Os símbolos de 𝛼 são associados até se reconhecer o


lado direito de uma produção.

 A aceitação dá-se, esgotada a sequência 𝛼, se o símbolo


inicial estiver na raiz da árvore.
Reconhecimento Ascendente
 Reconhecimento ascendente (“bottom-up”)
 Parte-se dos símbolos terminais em direção ao símbolo
inicial da gramática
 Processo de derivação mais à direita

Entrada: bcbca

Bottom-Up/Direita
S→AB bcbca ⇐ Acbca
A→b ⇐ AcbB
B→cbB ⇐ AB
B→ca ⇐S
Reconhecimento Ascendente
 A técnica é chamada de método de precedência dos
operadores
 Baseia-se no exame de pares de operadores consecutivos
do programa-fonte, e na tomada de decisões sobre a
operação que deve ser realizada em 1º lugar
 Exemplo: A + B * C – D
 A multiplicação e a divisão devem ter uma
precedência maior que a soma e a subtração
 B * C tem que ser calculada antes da outras 2
operações da expressão
Reconhecimento Ascendente
 Analisadores sintáticos ascendentes
 Analisadores conhecidos como empilha-reduz (shift-
reduce )
 Etapas do reconhecimento: determinar quando reduzir e
determinar a produção a ser utilizada para que a análise
prossiga
Reconhecimento Ascendente

 Componentes do analisador ascendente


 Pilha, onde os símbolos a serem reduzidos são empilhados
 Tabela sintática que guia o processo de empilhamento e
redução
 Processo de reconhecimento de uma sentença
1. Empilhar símbolos da cadeia de entrada
2. Quando um lado direito apropriado de uma produção aparece, ele
é reduzido (substituído) pelo lado esquerdo da produção
3. Se a análise tiver sucesso, esse processo ocorre até que os
símbolos da cadeia de entrada sejam todos consumidos e a pilha
fique apenas com o símbolo inicial da gramática
Reconhecimento Ascendente
Funcionamento
 O analisador empilha símbolos até ter na pilha uma
sequência de símbolos que corresponde à definição de
um não-terminal
 Sequência de símbolos: lado direito da produção

 Não-terminal: lado esquerdo da produção

 Handle Produção cujo lado direito está na pilha

 Operação de redução: substituição do lado direito do handle pelo seu


lado esquerdo

 O uso da sequência correta de handles no processo de análise leva


ao símbolo inicial da gramática
Reconhecimento Ascendente

 Operações durante a análise


 Empilha: coloca-se no topo da pilha o primeiro símbolo da
cadeia de entrada
 Reduz: substitui-se o lado direito do handle pelo seu lado
esquerdo
 Aceita: a cadeia de entrada é reconhecida
 Erro: a cadeia de entrada não é reconhecida
Exemplo

 Dada a gramática, mostre o reconhecimento para as


entradas id+id
1. E→E+E
2. E→E*E Pilha Cadeia Regra

3. E → (E) Ø $

4. E → id
Exercícios 1

 Dada a gramática, mostre o reconhecimento para as


entradas id+id*id , id+(id*id) e (id*(id+id))
1. E→E+E
2. E→E*E Pilha Cadeia Regra

3. E → (E) Ø $

4. E → id
Exercícios 2

 Processo de reconhecimento:
 Gramatica:
1. S → [L] | a
2. L→L;S|S
 Reconhecer a cadeia: [a;a]
Reconhecimento Ascendente
Pilha Cadeia Regra
1. S → [L] | a Ø [a;a] $
2. L → L ; S | S
Ø [a;a] $ Empilha [
Ø[ a;a] $ Empilha a
Ø[a ;a] $ Reduz S→a
Ø[S ;a] $ Reduz L→S
Ø[L ;a] $ Empilha ;
Ø[L; a] $ Empilha a
Ø[L;a ]$ Reduz S→a
Ø[L;S ]$ Reduz L→L;S
Ø[L ]$ Empilha ]
Ø[L] $ Reduz S→[L]
ØS $ ACC

You might also like