análise sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4...

34
Compiladores 2012/2013 1 Análise Sintática Compiladores Cristina C. Vieira

Upload: truongkien

Post on 10-Nov-2018

225 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 1

Análise Sintática

Compiladores

Cristina C. Vieira

Page 2: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 2

Sumário

Terminologia de gramáticas CFG

(gramáticas independentes do contexto)

Transformação de gramáticas CFG

Eliminar ambiguidades

Eliminar a recursividade à esquerda

Fatorizar à esquerda

Page 3: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 3

Analisador sintáctico

descendente

A recursividade à esquerda pode

levar a ciclos infinitos!

Exemplo de produção:

Term Term*Num

Passos potenciais na análise:

Term

Num * Term

Term

Term

Num * Term

Term

Num *

Page 4: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 4

Analisador sintáctico

descendente

A recursividade à esquerda pode

levar a ciclos infinitos!

Solução: modificar gramática de

modo a eliminar recursividade à

esquerda

Page 5: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 5

Eliminar recursividade à

esquerda

Começar com produções da forma

A A

A

Sequências , de símbolos

terminais e não-terminais que não

começam com A

Repetição da aplicação: A A

forma a árvore sintática seguinte:

A

A

A

Page 6: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 6

Eliminar recursividade à

esquerda

Produções de substituição

A A A R R é um novo símbolo não-terminal

A R R

R

A

A

A

R

R

R

Árvore inicial

Nova Árvore

Page 7: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 7

Gramática do Exemplo

INT = [0-9]+

Start Expr

Expr Expr “+” Term

Expr Expr “-” Term

Expr Term

Term Term “*” INT

Term Term “/” INT

Term INT

Conjunto de tokens

(símbolos terminais):

{ +, -, *, /, INT }

Page 8: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 8

Gramática Modificada

Pedaço da gramática

original

Term Term “*” INT

Term Term “/” INT

Term INT

Pedaço da gramática

modificada

Term INT Term’

Term’ “*” INT Term’

Term’ “/” INT Term’

Term’

Page 9: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 9

Gramática Modificada

Start Expr

Expr Term Expr’

Expr’ “+” Term Expr’

Expr’ “-” Term Expr’

Expr’

Term INT Term’

Term’ “*” INT Term’

Term’ “/” INT Term’

Term’

INT = [0-9]+

INT = [0-9]+

Start Expr

Expr Expr “+” Term

Expr Expr “-” Term

Expr Term

Term Term “*” INT

Term Term “/” INT

Term INT

Page 10: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 10

Comparando as Árvores

sintáticas

Term

INT *

Term

INT *

INT

Term

INT Term’

INT * Term’

INT * Term’

Gramática original Gramática modificada

Page 11: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 11

Eliminar Recursividade à

esquerda

Necessária na análise sintática

preditiva

Modifica o algoritmo de procura no espaço de produções

Elimina recursividade directa infinita

Contudo: gramática modificada é menos intuitiva

Requer mais transformações para se atingir AS desejada

Page 12: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 12

Requer +transformações para

se alcançar AST desejada

Árvore sintática para: 2*3*4

Construir AS desejada durante a derivação!

Term

INT

2

Term’

INT

3

* Term’

INT

4

* Term’

Term

INT

3

*

Term

INT

4 *

INT

2

AS Concreta AS desejada

Page 13: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 13

Analisadores Sintáticos

Técnicas de análise

Muitas técnicas de análise sintática

diferentes

Cada uma pode manusear algum

conjunto de CFGs

Categorização das técnicas

( )

Page 14: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 14

Terminologia

Muitas técnicas de análise sintática diferentes

Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)

Categorização das técnicas

L – análise da esq. para a drt.

R - análise da drt. para a esq.

( )

Page 15: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 15

Terminologia

Muitas técnicas de análise sintática diferentes

Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)

Categorização das técnicas

L – derivação pela esquerda

R – derivação pela direita

( )

Page 16: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 16

Terminologia

Muitas técnicas de análise sintática diferentes

Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)

Categorização das técnicas

Número de lookahead

( )

Page 17: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 17

Terminologia

Muitas técnicas de análise sintática diferentes

Cada uma pode manusear algum conjunto de CFGs (gramáticas independentes do contexto)

Categorização das técnicas

Exemplos: LL(3), LR(1)

Até agora: LL(1)

Nas próximas aulas • Análises LR(k)

( ) L L k

Page 18: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 18

Terminologia

LL(k)

Descendente (top-down), preditiva

Constrói derivação pela esquerda (leftmost) de

cima para baixo

LR(k)

Ascendente (bottom-up), shift-reduce

Constrói derivação pela direita (rightmost) de

baixo para cima

Page 19: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2011/2012 19

Gramáticas CFG

Especificar gramáticas independentes do

contexto para as linguagens seguintes:

Todas as strings não vazias de a’s com

comprimento par

L = { an bm cm dn | n, m >=1}

Todas as strings com os parênteses

esquerdos e direitos balanceados

Page 20: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

20

o Todas as strings não vazias de a’s com

comprimento par

o S → aa | aSa

o outras?

Gramáticas CFG

Page 21: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

21

o L = { an bm cm dn | n,m >=1}

o S → aSd | aXd

o X → bXc | bc

o outras?

Gramáticas CFG

Page 22: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

22

o Todas as strings com os parênteses esquerdos

e direitos balanceados

o S → SS |(S) |

o outras?

Gramáticas CFG

Page 23: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Eliminar ambiguidades

23

o Uma gramática ambígua produz mais do que uma

derivação, mais à esquerda ou mais à direita, para a

mesma frase

o Exp → Exp OP Exp |(Exp) |“-”Exp | ID | NUM

o OP → “+” | “-” | “*” | “/”

o A multiplicação e a divisão têm prioridade sobre a

soma e a subtração. Logo há que introduzir novos

terminais para reflectir essas prioridades e

associar os operadores à esquerda

Page 24: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Eliminar ambiguidades

24

o Gramática transformada

o E → E + T | E – T | T

o T → T * F | T / F | F

o F → ID | NUM | (E) | - E

Page 25: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Eliminar ambiguidades

25

A gramática G

S → SS |(S) |

É ambígua? Porquê? Encontre uma gramática

não ambígua equivalente.

Page 26: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Eliminar ambiguidades

26

o Gramática não ambígua (quase) equivalente a G

o S → SS |(S’

o S’→ )| S)

Outras?

S → () | SS |(S’

S’→ S)

Page 27: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Eliminar a recursividade à esquerda

27

Transformar as produções do tipo A → A | em produções do tipo:

A → A’

A’→ A’|

Generalizando:

A → A1 | A2 |...|An | 1 | 2 |...| m

A → 1A’| 2A’|...| mA’

A’→ 1A’| 2A’|...| nA’ |

Page 28: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Eliminar a recursividade à esquerda

28

o Eliminar a recursividade à esquerda das

gramáticas:

o G1

o S → (L) | a

o L → L,S | S

o G2

o S → Aa | b

o A → Ac | Sd |

Page 29: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Eliminar a recursividade à esquerda

29

o G1’

o S → (L) | a

o L → S L’

o L’→ , S L’ |

o G2’

o S → Aa | b

o A → bdA’| A’

o A’→ cA’| adA’ |

Page 30: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Fatorizar à esquerda

30

Transformar as produções do tipo:

A → 1 | 2 |...| n | ζ

em produções do tipo:

A → A’| ζ

A’ → 1| 2|...| n

Page 31: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Factorizar à esquerda

31

o Factorizar à esquerda a gramática:

o G

S → aAb | abC | b

A → cb | ca | cC

C → a | b | c

Page 32: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Factorizar à esquerda

32

o G‘

S → aS’ | b

S’ → Ab | bC

A → cC

C → a | b | c

Page 33: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

Compiladores 2012/2013 33

Resumo

Analisador sintáctico descendente

Utilizar Lookahead para evitar Backtracking

Modificar gramática para evitar

necessidade de inspecção de tokens muito

à frente (lookahead): factorização

Modificar gramática para evitar ciclos

infinitos

Como implementar o analisador sintáctico

descendente?

Page 34: Análise Sintática - w3.ualg.ptw3.ualg.pt/~cvieira/tutoria/03_comp_1213/comp_1213_07.pdf · 4 Compiladores 2012/2013 Analisador sintáctico descendente A recursividade à esquerda

TPC

34

S → TS | Td | c

T → Tab | c | ε

o A gramática é ambígua? Porquê?

o Remova a recursividade à esquerda e fatorize a

gramática.

o Após as transformações verifique se a gramática

continua ambígua.