48
1 Compiladores

1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

Embed Size (px)

Citation preview

Page 1: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

1

Compiladores

Page 2: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

2

Compilador

Programa

v = 5;if (v>5) x = 12 + v;while (x !=3) { x = x - 3; v = 10;}......

Add v,v,0cmp v,5jmplt ELSETHEN: add x, 12,vELSE:WHILE:cmp x,3...

Código de Máquina

Page 3: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

3

analisadorléxico parser

Compilador

programa código demáquina

entrada saída

Page 4: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

4

Um parser conhece a gramáticada linguagem de programação

Page 5: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

5

ParserPROGRAM STMT_LISTSTMT_LIST STMT; STMT_LIST | STMT;STMT EXPR | IF_STMT | WHILE_STMT | { STMT_LIST }

EXPR EXPR + EXPR | EXPR - EXPR | IDIF_STMT if (EXPR) then STMT | if (EXPR) then STMT else STMTWHILE_STMT while (EXPR) do STMT

Page 6: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

6

O parser encontra a derivação para uma entrada particular

10 + 2 * 5

Parser

E -> E + E | E * E | INT

E => E + E => E + E * E => 10 + E*E => 10 + 2 * E => 10 + 2 * 5

entrada

derivação

Page 7: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

7

10

E

2 5

E => E + E => E + E * E => 10 + E*E => 10 + 2 * E => 10 + 2 * 5

derivação

árvore de derivação

E E

E E

+

*

Page 8: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

8

10

E

2 5

árvore de derivação

E E

E E

+

*

mult a, 2, 5add b, 10, a

código de máquina

Page 9: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

9

Parsing

Page 10: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

10

gramática

Parserstringde entrada

derivação

Page 11: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

11

Exemplo:

Parser

derivação

S

bSaS

aSbS

SSSentrada

?aabb

Page 12: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

12

Busca Exaustiva

||| bSaaSbSSS

Fase 1:

S

bSaS

aSbS

SSSaabb

Todas as possíveis derivações de comprimento 1

Encontrar derivação

Page 13: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

13

S

bSaS

aSbS

SSS aabb

Page 14: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

14

Fase 2

aSbS

SSS

aabb

SSSS

bSaSSSS

aSbSSSS

SSSSSS

Fase 1

abaSbS

abSabaSbS

aaSbbaSbS

aSSbaSbS

||| bSaaSbSSS

Page 15: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

15

Fase 2

SSSS

aSbSSSS

SSSSSS

aaSbbaSbS

aSSbaSbS

Fase 3

aabbaaSbbaSbS

||| bSaaSbSSS

aabb

Page 16: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

16

Resultado final da busca exaustiva

Parser

derivação

S

bSaS

aSbS

SSSentrada

aabb

aabbaaSbbaSbS

(top-down parsing)

Page 17: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

17

Complexidade de tempo da busca exaustiva

Suponha que não existam produções da forma

A

BA

Número de fases para um string : w ||2 w

Page 18: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

18

Tempo para a fase 1:k

k possíveis derivações

Para uma gramática com regras k

Page 19: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

19

Tempo para a fase 2: 2k

possíveis derivações2k

Page 20: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

20

Tempo para a fase : ||2wk

possíveis derivações||2wk

||2 w

Page 21: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

21

Tempo total requerido para um string :w

||22 wkkk

Extremamente ruim!!!

fase 1 fase 2 fase 2|w|

Page 22: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

22

Existem algoritmos mais rápidospara tipos especiais de gramáticas

S-grammar: axA

símbolo stringde variáveis

),( aA ocorre apenas uma vezPar

Page 23: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

23

S-grammar - exemplo:

cS

bSSS

aSS

abccabcSabSSaSS

Cada string tem uma única derivação

Page 24: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

24

No parser por busca exaustiva existe uma única escolha em cada fase

Para S-grammars:

Tempo total para parsing de :w ||w

Tempo para cada fase: 1

Page 25: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

25

Para gramáticas livres de contexto em geral:

Existe um algoritmo de parsingque faz parsing de um stringem tempo 3||w

Page 26: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

26

Simplificações de

Gramáticas Livres de Contexto

Page 27: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

27

Regra de Substituição

bB

abbAB

abBcA

aaAA

aA

abbcA

ababbAcA

aaAA

aA

Substitua B

gramáticaequivalente

Page 28: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

28

Em geral:

nyyyB

xBzA

||| 21

Substitua B

zxyzxyzxyA n||| 21 gramáticaequivalente

Page 29: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

29

Produções Inúteis

aAA

AS

S

aSbS

aAaaaaAaAAS

Algumas derivações nunca terminam...

Produção Inútil

Page 30: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

30

bAB

A

aAA

AS

Outra gramática:

Nunca é atingida a partir de S

Produção inútil

Page 31: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

31

Em geral:

Se wxAyS

Então a variável é útilA

Caso contrário, a variável é inútilA

)(GLw

Page 32: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

32

Uma produção é útil se todas as suas variáveis são úteis

xA

Page 33: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

33

Removendo Produções Inúteis

Gramática Exemplo:

aCbC

aaB

aA

CAaSS

||

Page 34: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

34

Primero:encontre todas as variáveis queproduzem strings só com terminais

aCbC

aaB

aA

CAaSS

|| },{ BA

},,{ SBA

Passo 1:

Passo 2:

Page 35: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

35

Mantenha apenas as variáveisque produzem símbolos terminais

aCbC

aaB

aA

CAaSS

||

},,{ SBA

aaB

aA

AaSS

|

Page 36: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

36

Segundo:Encontre todas as variáveisatingíveis a partir de

aaB

aA

AaSS

|

S A B

Grafo de Dependência

nãoatingível

S

Page 37: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

37

Mantenha apenas as variáveisatingíveis a partir de S

aaB

aA

AaSS

|

aA

AaSS

|

Gramática Final

Page 38: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

38

Variáveis Nulas

A

Variável Nula: A

Page 39: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

39

Removendo Variáveis Nulas

Gramática Exemplo:

M

aMbM

aMbS

Variável nula

Page 40: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

40

M

M

aMbM

aMbSSubstitua

abM

aMbM

abS

aMbS

Gramática Final

Page 41: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

41

Produções Unitárias

BAProdução Unitária:

Page 42: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

42

Removendo Produções Unitárias

Observação:

AA

É removida imediatamente

Page 43: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

43

Gramática Exemplo:

bbB

AB

BA

aA

aAS

Page 44: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

44

bbB

AB

BA

aA

aAS

SubstituaBA

bbB

BAB

aA

aBaAS

|

|

Page 45: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

45

Remova

bbB

BAB

aA

aBaAS

|

|

bbB

AB

aA

aBaAS

|

BB

Page 46: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

46

SubstituaAB

bbB

aA

aAaBaAS

||

bbB

AB

aA

aBaAS

|

Page 47: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

47

Remova produções repetidas

bbB

aA

aBaAS

|

bbB

aA

aAaBaAS

||

Gramática final

Page 48: 1 Compiladores. 2 Compilador Programa v = 5; if (v>5) x = 12 + v; while (x !=3) { x = x - 3; v = 10; }...... Add v,v,0 cmp v,5 jmplt ELSE THEN: add x,

48

Removendo Tudo

Passo 1: Remova Variáveis Nulas

Passo 2: Remova Produções Unitárias

Passo 3: Remova Variáveis Inúteis