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

Post on 18-Apr-2015

107 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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)

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

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

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)

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

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

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

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

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

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 “)”

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

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

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)

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

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)

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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)

1. Identificar itens LR(0)

2. Construir DFA

3. Construir tabela do parser

4. Verificar se existem conflitos

LR(0)

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

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

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)

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

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 $

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 • $

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 • $

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)

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)

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)

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

top related