33
Análise Sintática I: Analisadores Descendentes com Retrocesso

Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

  • Upload
    vukien

  • View
    216

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Análise Sintática I: Analisadores Descendentes com Retrocesso

Page 2: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Definição

� A análise sintática é o processo de determinar � se uma cadeia de átomos (tokens), isto é, o

programa já analisado pelo analisador léxico, pode ser gerado por uma gramática

� Seu objetivo é a construção da árvore sintática ou apenas a decisão se a cadeia fornecida é ou não uma sentença da gramática que define a linguagem

Page 3: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Papel da Análise Sintática na Estrutura de um Compilador

Análiseléxica

Análisesintática

Análisesemântica

Prog. fontepede token

token

árvoresintática

Page 4: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Formas de análise sintática

� A análise sintática pode ser:�Top-down (A.S. Descendente), na qual a

construção da árvore de derivação/sintática (explicitamente ou não) é da raiz para as folhas

�Bottom-up (A.S. Ascendente), que começa das folhas para o símbolo inicial

Page 5: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Métodos de análise

� Existem métodos universais de análise sintática, como o algoritmo de Cocke-Younger-Kasami e o de Earley,

� que trabalham com qualquer tipo de gramática livre de contexto,

� Mas são ineficientes para se usar na produção de compiladores,

� pois são de ordem de O(n3), com n sendo o tamanho da cadeia de tokens.

Page 6: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Métodos de análise

� Earley, em 1970, apresentou um método de A.S. Top-Down sem Backtracking que reconhece todas as GLCs com O(n3);

- mas se elas forem não ambíguas, o tempo é O(n2) e chega a ser O(n) para muitas linguagens.

Mais detalhes em: www.cs.uiowa.edu/~RVS/Courses/Compiler/Notes/earley.pdf

Page 7: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Métodos de análise

Os métodos Top-Down e Bottom-Up mais eficientes e interessantes são determinísticos (O(n)).

Eles trabalham somente com subclasses de GLCs, mas muitas dessas subclasses, por exemplo, as gramáticas LL(k) e LR(k) são bastante expressivas para descrever a maioria das linguagens de programação.

� Duas delas são de interesse imediato:

� LL(1): Left to right scan, Left-most derivation, 1 token look-ahead

� LR(1): Left to right scan, Right-most derivation, 1 token look-ahead

Page 8: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Métodos de análiseVeremos 3 métodos de A.S.D. e suas vantagens e desvantagens:

� A.S.D. Recursiva com Retrocesso (tentativa e erro na escolha de produção)

� Parsers Preditivos:� Com procedimentos recursivos: são mais adequados para

serem escritos manualmente; um símbolo look-aheaddetermina a produção a ser escolhida

� Dirigidos por tabela: fazem uso de uma pilha explícita para guardar o lado direito das produções;

� mais adequado para serem implementados automaticamente pela pré-computação da Tabela de Análise

Page 9: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

A.S.D. com Retrocesso

� Ineficiente� Foi usada em implementações pioneiras� Ainda é utilizada em aplicações

específicas� Usada em muitos compilers-compilers

com backtracking;

Page 10: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Funcionamento

α� cadeia a ser analisadaD � árvore formada apenas pelo símbolo

reservado Sfolha corrente � S

Page 11: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Repita:{Seja X a folha corrente}

Se X é não terminal então[ escolha uma produção X::=X1X2...Xr; substitua na árvore D a folha corrente por uma árvore com raiz de rótulo X e descendentes diretos com rótulos X1, X2, ... Xr;folha corrente � X1]

senão {X é terminal}[Se α=Xβ entãoα�β;folha corrente � próxima folha em D no percurso das folhas da

esquerda para a direita]senão {α=λ ou 1o símbolo de α não é X}

[retroceder, ou seja, restaurar os valores de D e de folha corrente,antes da última aplicação de produção;

Se existe outra produçãoentão aplicação da produçãosenão retroceder novamente {repete-se até que uma produção seja encontrada}]

até que (α=λ e folha corrente aponta para fora da árvore -> ACEITAR) ou (D=S e não há alternativa -> ERRO)

Page 12: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

ExemploSeja a gramática

E::=E+T | TT::=T*F | FF::= a | b | (E)

� elimina-se a recursão a esquerda, para evitar que o algoritmo entre numa repetição infinita

E::=T+E | TT::=F*T | FF::=a | b | (E)

�atenção: mudar a recursividade muda o significado atribuído às expressões� a eliminação da recursividade feita não resolveu o problema,

pois mudou a associação dos operadores� Análise de a+b

Page 13: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Seja a sentença a*b

a*b

E

a*b

E

T + E

a*b

E

T + E

F * T

a*b

E

T + E

F * T

a

(1) (2) (3) (4)

*b

E

T + E

F * T

a

(5)

b

E

T + E

F * T

a

(6)

b

E

T + E

F * T

a

(7)

F * T

b

E

T + E

F * T

a

(8)

F * T

a

b

E

T + E

F * T

a

(9)

F * T

b

7�

λ

E

T + E

F * T

a

(10)

F * T

b

b

E

T + E

F * T

a

(11)

F * T

( E ) 6�7�

b

E

T + E

F * T

a

(12)

F

b

E

T + E

F * T

a

(13)

F

a 12�

b

E

T + E

F * T

a

(14)

F

b

Page 14: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

λ

E

T + E

F * T

a

(15)

F

b

12�

b

E

T + E

F * T

a

(16)

F

( E )

3�6�12�

a*b

E

T + E

F * T

b

(17)

3�

a*b

E

T + E

F * T

(18)

( E ) 2�3�

*b

E

T + E

(19)

F

a*b

E

T + E

(20)

F

a

a*b

E

T + E

(21)

F

a19�

a*b

E

T + E

(22)

F

b19�

a*b

E

T + E

(23)

F

( E )1�2�19�

a*b

E

T

(24)

a*b

E

T

(25)

F * T

a*b

E

T

(26)

F * T

a

Page 15: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

*b

E

T

(27)

F * T

a

b

E

T

(28)

F * T

a

b

E

T

(29)

F * T

a F * T

b

E

T

(30)

F * T

a F * T

a

29�

b

E

T

(31)

F * T

a F * T

b

λ

E

T

(32)

F * T

a F * T

b

29�

b

E

T

(33)

F * T

a F * T

( E ) 28�29�

b

E

T

(34)

F * T

a F

b

E

T

(35)

F * T

a F

a

b

E

T

(36)

F * T

a F

b

λ

E

T

(37)

F * T

a F

b

Page 16: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

A.S.D. com retrocesso� A utilização de retrocesso fará com que as ações de

modificações da tabela e possível geração de código em compiladores de 1 passo sejam anulados. Geralmente esta não é uma tarefa simples.

� O número de derivações pode ser uma função exponencialdo tamanho da cadeia

� Este algoritmo caracteriza derivações esquerdas de cadeias (substitui o terminal mais a esquerda)

� A recursividade a esquerda não é permitida nos métodos de A.S.D.

� Pela ineficiência e problemas, a análise descendente só é usada quando se elimina retrocesso

Page 17: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

ExemploE ::= E op T | TT ::= a

� recursiva a esquerda� tem precedência da esquerda para a direita de seus

operadoresE

E op T

E op T

T

a

a

aa op a op a

Page 18: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

ExemploE ::= T op E | TT ::= a

� recursiva a direita� tem precedência da direita para a esquerda de seus

operadoresE

T op E

T op E

T

a

a

aa op a op a

Page 19: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Eliminação de retrocessos e de recursão a esquerda

Para eliminar retrocessos: fazer com que o algoritmo tome a decisão correta quanto à produção a ser aplicada.

Uma classe de gramática para as quais isso pode ser feito pode ser descrita por:

1. Toda produção é da forma A�Xα, X terminal2. Se A�X1α1 | X2α2 | ... | Xmαm, então X1≠X2≠... ≠Xm

Page 20: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

� No algoritmo de análise, a escolha de expansões é resolvida consultando-se o 1o

símbolo de entrada

Ex.: Seja a gramática E � a | b | * EE | + EEque satisfaz 1 e 2.

Page 21: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Na análise da sentença + a * b a

+ a * b a

E

(1)

+ a * b a

E

(2)

+ E E

a * b a

E

(3)

+ E E

a * b a

E

(4)

+ E E

a

* b a

E

(5)

+ E E

a

* b a

E

(6)

+ E E

a * E E

b a

E

(7)

+ E E

a * E E

b a

E

(8)

+ E E

a * E E

b

a

E

(9)

+ E E

a * E E

b

a

E

(10)

+ E E

a * E E

b a

λ

E

(11)

+ E E

a * E E

b a

Page 22: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

� Essas restrições são muito severas (é muito difícil encontrar uma gramática que satisfaça essas condições para uma determinada linguagem).

� Vamos obter uma classe mais ampla de gramáticas.

Seja a relação FIRSTFirst(X) = {Y є T | X ψ*

p Y } {primeiro_símbolo}

isto é, First(X) = {X} se X є T= {Y є T | X =>* Yα} se X є N

Page 23: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

A restrição passa a ser:- para todo símbolo A є N com as regras:

A � X1α1 | X2α2 | ... | Xnαn

onde X є V, temos que:- First(Xi) são disjuntos dois a dois:

- First(Xk) ∩ First(Xj) = { } para ∀ k,j є {1, 2...n} com k≠j

Agora, o algoritmo de análise deve verificar a qual dos conjuntos First pertence o 1o símbolo da cadeia de entrada α.

Como os conjuntos devem ser disjuntos, haveráno máximo 1 alternativa possível

Page 24: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Seja a gramática:

S � AS | BAA � aB | CB � bA | dC � c

Gerem o conjunto dos FIRST para todos os símbolos

Page 25: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

S � AS | BAA � aB | CB � bA | dC � c

d--d

c--c

b--b

a--a

cc,CcC

b,db,d,Bb, dB

a,ca,C,c,Aa, CA

a,b,d,cA,B,a,C,b,d,c,SA, BS

Firstψ*pψp

Page 26: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Passos da análise para a sentença abcdad

abcdad

S

(1)

abcdad

S

(2)

A S

abcdad

S

(3)

A S

a B

bcdad

S

(4)

A S

a B

bcdad

S

(5)

A S

a B

b A

cdad

S

(6)

A S

a B

b A

cdad

S

(7)

A S

a B

b A

C

cdad

S

(8)

A S

a B

b A

C

c

Page 27: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

dad

S

(9)

A S

a B

b A

C

c

dad

S

(10)

A S

a B

b A

C

c

B A

dad

S

(11)

A S

a B

b A

C

c

B A

d

ad

S

(12)

A S

a B

b A

C

c

B A

d

Page 28: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

ad

S

(13)

A S

a B

b A

C

c

B A

d a B

d

S

(14)

A S

a B

b A

C

c

B A

d a B

λ

S

(15)

A S

a B

b A

C

c

B A

d a B

d

A classe de gramática que satisfaz esta restrição é chamada LL(1) �

analisa uma cadeia da esquerda para a direita produzindo uma derivação esquerda, verificando apenas 1 símbolo da cadeia de entrada para decidir qual a produção aplicada.

S � AS � ABS � abAS � abCS � abcS� abcBA � abcdA �

abcdAB � abcdaB � abcdad

Page 29: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Como definido, LL(1) = Left to right, Left-mostderivation, 1 símbolo look-ahead

Ex.:S � aAB | aBAA � b | cSB � d | eS

Não é LL(1), mas como A começa com b ou c e B começa com d ou e, a escolha de S pode se basear no segundo caractere – LL(2).

Page 30: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

A gramática de expressões abaixo não é LL(1), pois os conjuntos First não são disjuntos dois a dois. Na verdade, não é LL(K).

E � T + E | TT � F * T | FF � a | b | (E)

A gramática equivalente abaixo pode resolver o problema:

E � T E’E’ � + E | λT � F T’T’ � * T | λF � a | b | (E)

Agora, os conjuntos First são disjuntos dois a dois.

Quando uma regra gera λ háuma segunda checagem a ser feita: veremos logo mais

Page 31: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

Problema: aumento do comprimento das derivações e conseqüente aumento do número de operações para realizar a análise.

Para minimizar esse problema, podemos aplicar outros recursos, isto é, adotar uma notação estendida para gramática (EBNF) e modificar o algoritmo de análise.

1) Fatoração

E � T+E | T � E � T (+E | λ)

Page 32: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

De uma forma geral, se:

A � βу1 | βу2 | ... | βуn, com β≠у

podemos fatorá-la em:

A � β (у1 | у2 | ... | уn)

Dessa forma, a escolha da alternativa pode ser retardada.

Ex.:E � T (+E | λ)T � F (*T | λ)F � a | b | (E)

Page 33: Análise Sintática I: Analisadores Descendentes com ...wiki.icmc.usp.br/images/2/2b/Aula4_ASint1.pdf · Definição A análise sintática é o processo de determinar se uma cadeia

2) Substituição da notação recursiva por uma notação iterativa

E � E + T | Tpor

E � T {+ T}

3) Combinação de Fatoração e Substituição

E � E + T | E - T | Tfatora: E � E (+ T | - T) | Tsubstitui: E � T { +T | - T} ou E� T {(+|-) T}