determinar o tipo de gramática compiladores joão m. p. cardoso
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