determinar o tipo de gramática compiladores joão m. p. cardoso

47
Determinar o tipo de gramática Compiladores João M. P. Cardoso

Upload: internet

Post on 18-Apr-2015

107 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Determinar o tipo de gramática Compiladores João M. P. Cardoso

Determinar o tipo de gramática

Compiladores

João M. P. Cardoso

Page 2: Determinar o tipo de gramática Compiladores João M. P. Cardoso

Exemplo

Dada a seguinte gramática, diga se o analisador sintáctico pode ser LL(1), LR(0), ou LR(1)

• S X $ (1)

• X “(“ | Y (2, 3)

• Y “(“ Y “)” | (4, 5)

Page 3: Determinar o tipo de gramática Compiladores João M. P. Cardoso

Determinar o tipo de gramática

Seja X o tipo de analisador (LL(1), LR(0), etc.):

1. Construir a tabela do parser para X– Para as gramáticas LR a criação da tabela do

parser requer a construção do DFA

2. Caso existam conflitos, a gramática não pode ser implementada pelo analisador X

Caso não existam conflitos, a gramática pode ser implementada pelo analisador X

Page 4: Determinar o tipo de gramática Compiladores João M. P. Cardoso

Determinar o tipo de gramática: LL(1)

Page 5: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)

• Tabela do parser obtida directamente– Para cada produção da gramática vamos determinar o conjunto First do

RHS

• Caso o RHS possa derivar determinámos o Follow do LHS

– Colocámos cada produção nas colunas cujos símbolos terminais pertencem aos conjuntos determinados anteriormente e na linha que identifica o LHS

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Page 6: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Produção: S X– First(X) = {“(“} colocar S X na célula [S, “(“]

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX

Y

Page 7: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Produção: S X– First(X) = {“(“} colocar S X na célula [S, “(“]

– como S pode derivar (via X) determinar Follow(S) = { }

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX

Y

Page 8: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Produção: X “(“ (2)– First(“(“) = {“(“} colocar X “(“ na célula [X, “(“]

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX X “(“

Y

Page 9: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Produção: X Y (3)– First(Y) = {“(“} colocar X Y na célula [X, “(“]

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX X “(“

X YY

Page 10: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Produção: X Y (3)– First(Y) = {“(“} colocar Y “(“ na célula [Y, “(“]

– como X pode derivar (via Y) determinar Follow(X) = { }

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX X “(“

X YY

Page 11: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Produção: Y “(“ Y “)” (4)– First(“(“ Y “)”) = {“(“} colocar Y “(“ Y “)” na

célula [Y, “(“]

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX X “(“

X YY Y “(“ Y “)”

Page 12: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Produção: Y (5)

– Follow(Y) = {“)“} colocar Y na célula [Y, “)“]

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX X “(“

X YY Y “(“ Y “)” Y

Page 13: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)• Tabela do parser

– Já foram analisadas todas as produções da gramática

– A tabela está completa

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Não-terminais

Terminais“(” “)”

S S XX X “(“

X YY Y “(“ Y “)” Y

Page 14: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LL(1)

Não-terminais

Terminais“(” “)”

S S XX X “(“

X YY Y “(“ Y “)” Y

Conflito entre duas produções a aplicar não é LL(1)

• Tabela do parser obtida directamente

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Page 15: Determinar o tipo de gramática Compiladores João M. P. Cardoso

Determinar o tipo de gramática: LR(0)

Page 16: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)Itens:

• S • X $

• S X • $

• X • “(“

• X “(“ •

• X • Y

• X Y •

• Y • “(“ Y “)”

• Y “(“ • Y “)”

• Y “(“ Y • “)”

• Y “(“ Y “)” •

• Y •

1. Identificar itens LR(0)

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Page 17: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)Itens:

• S • X $

• S X • $

• X • “(“

• X “(“ •

• X • Y

• X Y •

• Y • “(“ Y “)”

• Y “(“ • Y “)”

• Y “(“ Y • “)”

• Y “(“ Y “)” •

• Y •

1. Identificar itens LR(0)

2. Construir DFA

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

Page 18: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item

e associar-lhe um estado

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $s0

Page 19: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item

e associar-lhe um estado (s0)

– Determinar closure(S • X $)

• Adicionar ao estado s0 todos os itens com X no LHS e com RHS começado por •

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $s0

Page 20: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item

e associar-lhe um estado (s0)

– Determinar closure(S • X $)

• Adicionar ao estado s0 todos os itens com X no LHS e com RHS começado por •

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • Y

s0

Page 21: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item

e associar-lhe um estado (s0)

– Determinar closure(S • X $)

– Por cada item I adicionado ao estado s0 determinar closure(I)S X (1)

X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • Y

s0

Page 22: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item

e associar-lhe um estado (s0)

– Determinar closure(S • X $)

– Por cada item I adicionado ao estado s0 determinar closure(I)

• Closure(X • “(“) = { }S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • Y

s0

Page 23: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item

e associar-lhe um estado (s0)

– Determinar closure(S • X $)

– Por cada item I adicionado ao estado s0 determinar closure(I)

• Closure(X • Y)S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • Y

s0

Page 24: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item

e associar-lhe um estado (s0)

– Determinar closure(S • X $)

– Por cada item I adicionado ao estado s0 determinar closure(I)

• Closure(X • Y)S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0

Page 25: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA– Começar com 1º item e

associar-lhe um estado (s0)

– Determinar closure(S • X $)

– Por cada item I adicionado ao estado s0 determinar closure(I)

– Parar quando não houver mais itens para acrescentar a s0

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0

Page 26: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA• Depois de um estado

estar completo• Determinar transições

possíveis• Transição entre

estados está relacionada com o símbolo que permite o avanço do ponto sobre esse mesmo símbolo

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0

Page 27: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA• Depois de um estado

estar completo• Determinar transições

possíveis• Transição entre

estados está relacionada com o símbolo que permite o avanço do ponto sobre esse mesmo símbolo

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

Page 28: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

2. Construir DFA• Depois de um estado

estar completo• Determinar transições

possíveis• Por cada transição é

adicionado um novo estado que contém o(s) item(itens) directamente obtido(s) pelo avanço do ponto

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

Page 29: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

• Por cada transição é adicionado um novo estado que contém o(s) item(itens) directamente obtido(s) pelo avanço do ponto

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

S X • $ s1

Page 30: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

• Por cada transição é adicionado um novo estado que contém o(s) item(itens) directamente obtido(s) pelo avanço do ponto

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

S X • $ s1

X “(“ •Y “(“ • Y “)”

s2

X Y • s3

Page 31: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

• Por cada novo estado repetir os passos que foram realizados no estado s0

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

S X • $ s1

X “(“ •Y “(“ • Y “)”

s2

X Y • s3

Page 32: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

S X • $ s1

X “(“ •Y “(“ • Y “)”Y • “(“ Y “)”Y •

s2

X Y • s3

• Por cada novo estado repetir os passos que foram realizados no estado s0

Page 33: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

S X (1) X “(“ | Y (2, 3)Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

S X • $ s1

X “(“ •Y “(“ • Y “)”Y • “(“ Y “)”Y •

s2

X Y • s3

• Parar quando não for possível adicionar novos estados

“(“

Y

Page 34: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

Itens:• S • X $• S X • $• X • “(“• X “(“ •• X • Y• X Y •• Y • “(“ Y “)”• Y “(“ • Y “)”• Y “(“ Y • “)”• Y “(“ Y “)” •• Y •

S X (1)

X “(“ | Y (2, 3)

Y “(“ Y “)” | (4, 5)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 X

“(“

Y

S X • $ s1

X “(“ •Y “(“ • Y “)”Y • “(“ Y “)”Y •

s2

X Y • s3

• Não adicionar um novo estado quando este contém os mesmos itens de um estado já existente

“(“

Y

Page 35: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)

S • X $X • “(“X • YY • “(“ Y “)”Y •

s0 S X • $ s1X

X “(“ • Y “(“ • Y “)”Y • “(“ Y “)”Y •

s2

“(“

X Y • s3

YY “(“Y • “)”s4Y

Y “(“Y “)” •s5“)”

Y “(“• Y “)”Y • “(“ Y “)”Y •

s6

“(“

Y

“(“

S X (1)

X “(“ | Y (2, 3)

Y “(“ Y “)” | (4, 5)

Page 36: Determinar o tipo de gramática Compiladores João M. P. Cardoso

1. Identificar itens LR(0)

2. Construir DFA

3. Construir tabela do parser

4. Verificar se existem conflitos

LR(0)

Page 37: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(0)“(“ “)” $ X Y

S0 Shift s2

Reduce (5)

Reduce (5) Reduce (5) Goto s1 goto s3

S1 Accept

S2 Reduce (2)

Reduce (5)

Shift s6

Reduce (2)

Reduce (5)

Reduce (2)

Reduce (5)

Goto s4

S3 Reduce (3) Reduce (3) Reduce (3)

S4 Shift s5

S5 Reduce (4) Reduce (4) Reduce (4)

S6 Reduce (5)

Shift s6

Reduce (5) Reduce (5) Goto s4

Conflitos reduce / reduce e shift/reduce

Conflito shift/reduce

A gramática não é LR(0)

• Tabela do parser

Page 38: Determinar o tipo de gramática Compiladores João M. P. Cardoso

Determinar o tipo de gramática: LR(1)

Page 39: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)

Itens:• S • X $ ?• S X • $ ?• X • “(“ “(“• X • “(“ “)“• X • “(“ $• X “(“ • “(“• X “(“ • “)“• X “(“ • $• X • Y “(“• X • Y “)“• X • Y $• X Y • “(“• X Y • “)“• X Y • $• Y • “(“ Y “)” “)“• Y • “(“ Y “)” “(“• Y • “(“ Y “)” $• Y “(“ • Y “)” “)“• Y “(“ • Y “)” “(“• Y “(“ • Y “)” $• Y “(“ Y • “)” “)“• Y “(“ Y • “)” “(“• Y “(“ Y • “)” $• Y “(“ Y “)” • “)“• Y “(“ Y “)” • “(“• Y “(“ Y “)” • $• Y • “)“• Y • “(“• Y • $

1. Identificar itens LR(1)

Símbolos Terminais: “(“ e “)”

Símbolo de término da análise: $

2. Construir DFA• Mesmo procedimento do que para o

LR(0) com diferenças na adição de itens a um estado

• S X (1) • X “(“ | Y (2, 3)• Y “(“ Y “)” | (4, 5)

Page 40: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)

S • X $ ?s0

• S X (1) • X “(“ | Y (2, 3)• Y “(“ Y “)” | (4, 5)

2. Construir DFA– 1º item I no estado s0

Page 41: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)

S • X $ ?X • “(“ $X • Y $

s0

• S X (1) • X “(“ | Y (2, 3)• Y “(“ Y “)” | (4, 5)

2. Construir DFA– 1º item I no estado s0– Determinar closure(I):– X • “(“ “(“– X • “(“ “)“– X • “(“ $– X • Y “(“– X • Y “)“– X • Y $

– Colocar apenas os itens do Closure cujo símbolo de lookhaed esteja contido no First($ ?) = {$}

– X • “(“ $– X • Y $

Page 42: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)

S • X $ ?X • “(“ $X • Y $

s0

• S X (1) • X “(“ | Y (2, 3)• Y “(“ Y “)” | (4, 5)

2. Construir DFA– Por cada novo item I no estado

determinar closure(I)• closure(X • “(“ $) = { }

• Closure(X • Y $) = • Y • “(“ Y “)” “)“• Y • “(“ Y “)” “(“• Y • “(“ Y “)” $• Y • “)“• Y • “(“• Y • $

Page 43: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)

S • X $ ?X • “(“ $X • Y $Y • “(“ Y “)” $Y • $

s0

• S X (1) • X “(“ | Y (2, 3)• Y “(“ Y “)” | (4, 5)

2. Construir DFA– Por cada novo item I no estado

determinar closure(I)– Colocar apenas os itens do

Closure cujo símbolo de lookhaed esteja contido no First($) = {$}

– Y • “(“ Y “)” $– Y • $

Page 44: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)

S • X $ ?X • “(“ $X • Y $Y • “(“ Y “)” $Y • $

s0

• S X (1) • X “(“ | Y (2, 3)• Y “(“ Y “)” | (4, 5)

2. Construir DFA– Determinar transições– Repetir as etapas de criação do

DFA tal como no caso do LR(0)

Page 45: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)

S • X $ ?X • “(“ $X • Y $Y • “(“ Y “)” $Y • $

s0 S X • $ ?s1

X

X “(“ • $ Y “(“ • Y “)” $Y • “(“ Y “)” “)”Y • “)”

s2

“(“

X Y • $s3

YY “(“Y • “)” $s4Y

Y “(“Y “)” • $s5“)”

Y “(“• Y “)” “)”Y • “(“ Y “)” “)”Y • “)”

s6

“(“

Y

“(“

Y “(“Y • “)” “)”s7

Y “(“Y “)” • “)”s8

“)”• S X (1) • X “(“ | Y (2, 3)• Y “(“ Y “)” | (4, 5)

Page 46: Determinar o tipo de gramática Compiladores João M. P. Cardoso

1. Identificar itens LR(1)

2. Construir DFA

3. Construir tabela do parser– Reduções são colocadas nas colunas

correspondentes a símbolos de lookahead no item que indica redução

• Ex: O item do estado s3: X Y • $ implica a redução (3) na linha s3, coluna $

4. Verificar se existem conflitos

LR(1)

Page 47: Determinar o tipo de gramática Compiladores João M. P. Cardoso

LR(1)“(“ “)” $ X Y

S0 Shift s2 Goto s1 goto s3

S1 Accept

S2 Shift s6 Reduce (5) Reduce (2) Goto s4

S3 Reduce (3)

S4 Shift s5

S5 Reduce (4)

S6 Shift s6 Reduce (5) Goto s7

S7 Shift s8

S8 Reduce (4)

A gramática é LR(1), pois não existem conflitos

• Tabela do parser