41
Compiladores Prof. Bruno Moreno Aula 9 06/05/2011

Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

  • Upload
    hakhanh

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Compiladores

Prof. Bruno Moreno

Aula 9 – 06/05/2011

Page 2: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Como transformar uma

expressão regular em um

AFN?

Page 3: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Exp. Regular para AFN

Para E

Para a

Para s | t

Page 4: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Exp. Regular para AFN

Para st

Para s*

Page 5: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Exemplo

R = (a|b)*abb s | t

st

s*

Page 6: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

SAÍDA DO ANALISADOR

LÉXICO

Page 7: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Saída do Analisador Léxico

Fornece dois elementos para cada símbolo

Símbolo propriamente dito (posição na memória)

Ou apontando para ele

Um número que identifica a classe do símbolo

Page 8: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Saída do Analisador Léxico

Tabela de Símbolos (exemplo)

SÍMBOLO ID_CLASSE

Indefinido 0

Identificador 1

Inteiro 2

Begin 3

Abs 4

End 5

( 6

) 7

+ 8

- 9

* 10

/ 11

** 12

:= 13

beginab + (x2*y)/35 /* expressão aritmética */

end

CHAMADA SAÍDA SIGNIFICADO

1ª 3, “begin” begin

2ª 1, “ab” ab

3ª 8, “+” +

4ª 6, “(“ (

5ª 1, “x2” x2

6ª 10, “*” *

7ª 1, “y” y

8ª 7, “)” )

9ª 11, “/” /

10 2, “35” 35

11ª 5, “end” end

Page 9: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

O ANALISADOR SINTÁTICO

Page 10: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

O Analisador Sintático

O analisador sintático obtém uma cadeia de

tokens proveniente do analisador léxico

Page 11: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

O Analisador Sintático

Verifica se esta cadeia pode ser gerada pela

gramática da linguagem-fonte

Page 12: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

O Analisador Sintático

Relata erros de sintaxe

Recupera-se do erro para que a compilação

continue

Função do analisador sintático

Verificar se as construções usadas no programa

estão gramaticalmente corretas

Em uma linguagem natural é semelhante a

avaliar a construção frasal que obriga ter, por

exemplo, sujeito, verbo e predicado

Page 13: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Analisador Sintático

Já estudamos previamente os principal

artefatos de investigação utilizados pelo

Analisador Sintático

Árvores de decisão e Gramáticas

Page 14: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Analisador Sintático

Existem duas formas de realizar a análise

sintática

Análise descendente (top-down)

Constroem as árvores de cima para baixo (raiz para folhas)

Análise ascendente (bottom-up)

Constroem as árvores de baixo para cima (folhas para raiz)

Em ambos os casos, a entrada é varrida da

esquerda para a direita, um símbolo de cada vez

Page 15: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Analisador Sintático

Normalmente, as estruturas sintáticas válidas

são especificadas através de uma gramática

livre de contexto

Descreve as regras de formação de sentenças da

linguagem

A gramática é formada por regras de produções

Cada produção é uma regra de formação,

mostrando como um símbolo pode gerar (ou

produzir) outros

Page 16: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramática Livre de Contexto

Produções na forma

A → a

Por que “Livre de Contexto”?

Não terminal A pode ser substituído por a em

qualquer contexto, sem depender de qualquer

análise dos símbolos que sucedem ou

antecedem A

Diferente das gramáticas sensíveis ao

contexto

a → b, com a ∈ (N U T)+ e b ∈ (N U T)*

Page 17: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramática Livre de Contexto

Qualquer gramática G = {N, T, P, S}

N – Conjunto de símbolos não terminais

T – Conjunto de símbolos terminais

P – Conjunto de regras

S – Símbolo inicial

Page 18: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramática Livre de Contexto

Exemplo

G = ({E}, {+, -, *, /, ), (, x}, P, E}

P = E → E + E | E – E | E * E | E / E | (E) | x

Sentença: x+x*x

E

E + E

x E * E

x x

Page 19: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramática Livre de Contexto

Exemplo

G = ({<num>, <digit>}, {0, 1, ..., 9}, P, <num>)

P = <num> → <num><digit> | <digit>

<digit> → 0, 1, ..., 9

Sentença: 45 <num>

<num> <digit>

<digit> 5

4

Page 20: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Derivação mais à esquerda

É a seqüência de formas sentenciais que se

obtém derivando sempre o símbolo não-

terminal mais à esquerda

Exemplo

G = ({E}, {+, -, *, /, ), (, x}, P, E}

P = E → E + E | E – E | E * E | E / E | (E) | x

Sentença: x+x*x E → E + E → x + E → x + E * E → x + x * E → x + x * x

Page 21: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Derivação mais à direita

É a sequencia de formas sentenciais que se

obtém derivando sempre o símbolo não-

terminal mais à direita

Exemplo

G = ({E}, {+, -, *, /, ), (, x}, P, E}

P = E → E + E | E – E | E * E | E / E | (E) | x

Sentença: x+x*x E → E + E → E + E * E → E + E * x → E + x * x → x + x * x

Page 22: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramática Ambígua

É a gramática que permite construir mais de uma árvore

de derivação para uma mesma sentença

Exemplo

G = ({E}, {+, -, *, /, ), (, x}, P, E}

P = E → E + E | E – E | E * E | E / E | (E) | x

E

E + E

x E * E

x x

E

E * E

E + E x

x x

Page 23: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramáticas Ambíguas

Qual o problema de uma gramática

ambígua?

Reconhecedores de linguagens exigem

derivações unívocas para obter um bom

desempenho

E também para concluir a derivação sintática

Page 24: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramáticas Ambíguas

Qual o problema lógico, de interpretação, nas

duas árvores de derivação a seguir?

E

E + E

x E * E

x x

E

E * E

E + E x

x x

+ é executado em primeiro lugar * é executado em primeiro lugar

Page 25: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramáticas Ambíguas

Resolução de ambiguidade

Não existe um procedimento geral para retirar

ambigüidade de uma linguagem

Além disso, existem gramáticas em que é

impossível eliminar produções ambíguas

Linguagens Inerentemente Ambíguas

Page 26: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

LINGUAGENS

INERENTEMENTE AMBÍGUAS

Page 27: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Linguagens Inerentemente

Ambíguas

São aquelas que qualquer GLC que a

descreva é ambígua

Exemplo

{ w | w = anbncmdm | anbmcmdn, n ≥ 1, m ≤ 1}

Para n =1, m = 2

w = abc2d2 ou ab2c2d

Page 28: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

RECURSIVIDADE

Page 29: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramática recursiva à

esquerda

Permite a derivação

A → Aa para algum A ∈ N

Um não terminal (A) deriva ele mesmo, de forma

direta ou indireta, como símbolo mais à

esquerda

Reconhecedores top-down exigem que a

gramática não seja recursiva à esquerda

Quando a recursão é direta, a eliminação é

simples

Page 30: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Gramática recursiva à

esquerda

Quando a recursão é indireta, a eliminação

requer que a gramática seja inicialmente

simplificada

Gramática simplificada

É uma GLC que não apresenta símbolos inúteis

Page 31: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

TRANSFORMAÇÃO DE GLCS

Page 32: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Transformação de GLCs

O processo de transformação de uma GLC

se caracteriza por transformar uma gramática

sem que ela perca a qualidade de gerar a

mesma linguagem

Gramáticas que geram mesma linguagem

utilizando regras de produção diferentes são

chamadas de gramáticas equivalentes

Page 33: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

ELIMINAÇÃO DE RECURSIVIDADE

À ESQUERDA

Page 34: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Eliminação de Recursividade à

Esquerda

Para recursividade direta

Pode ser eliminada manualmente

Para recursividade indireta

Primeiramente, a gramática deve ser simplificada

Page 35: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Recursividade à Esquerda

Eliminação da recursividade direta

Substituir cada regra da forma

A → Aa1 | Aa2 | ... | Aan| b1 | b2 | ... | bm

onde nenhum bi começa por A, por

A → b1X | b2X | ... | bmX

X → a1X | a2X | ... | anX | E

Se produções vazias não são permitidas, a

substituição deve ser:

A → b1 | b2 | ... | bm | b1X | b2X | ... | bmX

X → a1 | a2 | ... | an | a1X | a2X | ... | anX

Page 36: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Recursividade à Esquerda

(Exemplo 1)

Linguagem: b(a)*

Com recursividade

A → Aa | b

b, ba, baa, baaa, ...

1º Passo: Identificar recursão

Page 37: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Recursividade à Esquerda

(Exemplo 1)

Linguagem: b(a)*

Com recursividade

A → Aa | b

A → bA’

b, ba, baa, baaa, ...

1º Passo: Identificar recursão

2º Passo: Para cada produção com

recursão

A → bA’

2.1: O não terminal que gera a regra de

produção deve receber agora a parte não

recursiva concatenada com um novo não

terminal

Page 38: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Recursividade à Esquerda

(Exemplo 1)

Linguagem: b(a)*

Com recursividade

A → Aa | b

A → bA’

A’ → aA’ | E

b, ba, baa, baaa, ...

1º Passo: Identificar recursão

2º Passo: Para cada produção com

recursão

A → bA’

2.1: O não terminal que gera a regra de

produção deve receber agora a parte não

recursiva concatenada com um novo não

terminal

A’ → aA’ | E

2.2: O novo não terminal deve receber a

direita da produção recursiva

concatenada com o próprio novo não

terminal e também a regra gerando vazio

Page 39: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Recursividade à Esquerda

(Exemplo 2)

E → E + T | T

T → T * F | F

F → (E) | id

1º Passo: Identificar recursão

Page 40: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Recursividade à Esquerda

(Exemplo 2)

E → E + T | T

T → T * F | F

F → (E) | id

E → TE’

E’ → +TE’ | E

1º Passo: Identificar recursão

2º Passo: Para cada produção com

recursão

E → TE’

2.1: O não terminal que gera a regra de

produção deve receber agora a parte não

recursiva concatenada com um novo não

terminal

E’ → +TE’ | E

2.2: O novo não terminal deve receber a

direita da produção recursiva

concatenada com o próprio novo não

terminal e também a regra gerando vazio

Page 41: Prof. Bruno Moreno Aula 9 06/05/2011brunomoreno.com/.../wp-content/uploads/2012/05/compiladores_Aula9.pdf · Saída do Analisador Léxico Fornece dois elementos para cada símbolo

Recursividade à Esquerda

(Exemplo 2)

E → E + T | T

T → T * F | F

F → (E) | id

E → TE’

E’ → +TE’ | E

T → FT’

T’ → *FT’ | E

F → (E) | id

1º Passo: Identificar recursão

2º Passo: Para cada produção com

recursão

T → FT’

2.1: O não terminal que gera a regra de

produção deve receber agora a parte não

recursiva concatenada com um novo não

terminal

T’ → *FT’ | E

2.2: O novo não terminal deve receber a

direita da produção recursiva

concatenada com o próprio novo não

terminal e também a regra gerando vazio