A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Determinar o tipo de gramática

Apresentações semelhantes


Apresentação em tema: "Determinar o tipo de gramática"— Transcrição da apresentação:

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

2 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)

3 Determinar o tipo de gramática
Seja X o tipo de analisador (LL(1), LR(0), etc.): 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 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

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

5 LL(1) Tabela do parser obtida directamente S  X (1)
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)

6 LL(1) Tabela do parser Produção: S  X
First(X) = {“(“}  colocar S  X na célula [S, “(“] Não-terminais Terminais “(” “)” S S  X X Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

7 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) = { } Não-terminais Terminais “(” “)” S S  X X Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

8 LL(1) Tabela do parser Produção: X  “(“ (2)
First(“(“) = {“(“}  colocar X  “(“ na célula [X, “(“] Não-terminais Terminais “(” “)” S S  X X X  “(“ Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

9 LL(1) Tabela do parser Produção: X  Y (3)
First(Y) = {“(“}  colocar X  Y na célula [X, “(“] Não-terminais Terminais “(” “)” S S  X X X  “(“ X  Y Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

10 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) = { } Não-terminais Terminais “(” “)” S S  X X X  “(“ X  Y Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

11 LL(1) Tabela do parser Produção: Y  “(“ Y “)” (4)
First(“(“ Y “)”) = {“(“}  colocar Y  “(“ Y “)” na célula [Y, “(“] Não-terminais Terminais “(” “)” S S  X X X  “(“ X  Y Y Y  “(“ Y “)” S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

12 LL(1) Tabela do parser Produção: Y   (5)
Follow(Y) = {“)“}  colocar Y   na célula [Y, “)“] Não-terminais Terminais “(” “)” S S  X X X  “(“ X  Y Y Y  “(“ Y “)” Y   S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

13 LL(1) Tabela do parser Já foram analisadas todas as produções da gramática A tabela está completa Não-terminais Terminais “(” “)” S S  X X X  “(“ X  Y Y Y  “(“ Y “)” Y   S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

14 LL(1) Tabela do parser obtida directamente Conflito entre duas
produções a aplicar  não é LL(1) Não-terminais Terminais “(” “)” S S  X X X  “(“ X  Y Y Y  “(“ Y “)” Y   S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

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

16 LR(0) Identificar itens LR(0) Itens: S  • X $ S  X • $ X  • “(“
X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • Identificar itens LR(0) S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

17 LR(0) Identificar itens LR(0) Construir DFA Itens: S  • X $ S  X • $
X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • Identificar itens LR(0) Construir DFA S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

18 LR(0) Construir DFA Começar com 1º item e associar-lhe um estado
S  • X $ 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)

19 LR(0) 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 • s0 S  • X $ 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)

20 LR(0) 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 • s0 S  • X $ X  • “(“ X  • Y 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)

21 LR(0) 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) s0 S  • X $ X  • “(“ X  • Y 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)

22 LR(0) 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  • “(“) = { } s0 S  • X $ X  • “(“ X  • Y 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)

23 LR(0) 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) s0 S  • X $ X  • “(“ X  • Y 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)

24 LR(0) 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) s0 S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  • 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)

25 LR(0) 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 s0 S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  • 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)

26 LR(0) Construir DFA Depois de um estado estar completo S  • X $
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 s0 S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  • 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)

27 LR(0) Construir DFA Depois de um estado estar completo X S  • X $
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 X s0 S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  • Itens: S  • X $ S  X • $ X  • “(“ X  “(“ • X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • “(“ Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

28 LR(0) Construir DFA Depois de um estado estar completo X S  • X $
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 X s0 S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  • Itens: S  • X $ S  X • $ X  • “(“ X  “(“ • X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • “(“ Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

29 LR(0) X S  X • $ S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  •
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 “(“ Y S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

30 LR(0) X S  X • $ S  • X $ X  • “(“ X  • Y X  “(“ •
Por cada transição é adicionado um novo estado que contém o(s) item(itens) directamente obtido(s) pelo avanço do ponto X S  X • $ s1 s0 S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  • s2 Itens: S  • X $ S  X • $ X  • “(“ X  “(“ • X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • X  “(“ • Y  “(“ • Y “)” “(“ s3 Y X  Y • S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

31 LR(0) X S  X • $ S  • X $ X  • “(“ X  • Y X  “(“ •
Y  • “(“ Y “)” Y  • s2 Itens: S  • X $ S  X • $ X  • “(“ X  “(“ • X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • X  “(“ • Y  “(“ • Y “)” “(“ s3 Y X  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)

32 LR(0) X S  X • $ S  • X $ X  • “(“ X  • Y X  “(“ •
Y  • “(“ Y “)” Y  • s2 Itens: S  • X $ S  X • $ X  • “(“ X  “(“ • X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • X  “(“ • Y  “(“ • Y “)” Y  • “(“ Y “)” Y  • “(“ s3 Y X  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)

33 LR(0) X S  X • $ S  • X $ X  • “(“ X  • Y X  “(“ •
Y  • “(“ Y “)” Y  • s2 Itens: S  • X $ S  X • $ X  • “(“ X  “(“ • X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • X  “(“ • Y  “(“ • Y “)” Y  • “(“ Y “)” Y  • “(“ “(“ s3 Y Y X  Y • Parar quando não for possível adicionar novos estados S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

34 LR(0) X S  X • $ S  • X $ X  • “(“ X  • Y X  “(“ •
Y  • “(“ Y “)” Y  • s2 Itens: S  • X $ S  X • $ X  • “(“ X  “(“ • X  • Y X  Y • Y  • “(“ Y “)” Y  “(“ • Y “)” Y  “(“ Y • “)” Y  “(“ Y “)” • Y  • X  “(“ • Y  “(“ • Y “)” Y  • “(“ Y “)” Y  • “(“ “(“ s3 Y Y X  Y • Não adicionar um novo estado quando este contém os mesmos itens de um estado já existente S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

35 LR(0) X S  X • $ S  • X $ X  • “(“ X  • Y Y  • “(“ Y “)” Y  •

36 LR(0) Identificar itens LR(0) Construir DFA Construir tabela do parser
Verificar se existem conflitos

37 LR(0) Tabela do parser Conflitos reduce / reduce e shift/reduce
“(“ “)” $ X Y S0 Shift s2 Reduce (5) Goto s1 goto s3 S1 Accept S2 Reduce (2) Shift s6 Goto s4 S3 Reduce (3) S4 Shift s5 S5 Reduce (4) S6 Conflitos reduce / reduce e shift/reduce Conflito shift/reduce A gramática não é LR(0)

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

39 LR(1) Identificar itens LR(1) Símbolos Terminais: “(“ e “)”
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  • $ LR(1) Identificar itens LR(1) Símbolos Terminais: “(“ e “)” Símbolo de término da análise: $ 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)

40 LR(1) Construir DFA 1º item I no estado s0 S  • X $ ? S  X (1)
X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

41 LR(1) Construir DFA 1º item I no estado s0 S  • X $ ?
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($ ?) = {$} S  • X $ ? X  • “(“ $ X  • Y $ S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

42 LR(1) s0 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  • $ S  • X $ ? X  • “(“ $ X  • Y $ S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

43 LR(1) s0 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  • $ S  • X $ ? X  • “(“ $ X  • Y $ Y  • “(“ Y “)” $ Y  • $ S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

44 LR(1) Construir DFA Determinar transições S  • X $ ?
Repetir as etapas de criação do DFA tal como no caso do LR(0) S  • X $ ? X  • “(“ $ X  • Y $ Y  • “(“ Y “)” $ Y  • $ S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5)

45 LR(1) S  X • $ ? X S  • X $ ? “(“ X  • “(“ $ X  • Y $ X  “(“ • $
Y  • “(“ Y “)” $ Y  • $ “(“ s2 X  “(“ • $ Y  “(“ • Y “)” $ Y  • “(“ Y “)” “)” Y  • “)” s6 “(“ Y  “(“• Y “)” “)” Y  • “(“ Y “)” “)” Y  • “)” “(“ s3 Y Y Y s7 s4 X  Y • $ Y  “(“Y • “)” “)” Y  “(“Y • “)” $ “)” “)” s5 s8 S  X (1) X  “(“ | Y (2, 3) Y  “(“ Y “)” |  (4, 5) Y  “(“Y “)” • $ Y  “(“Y “)” • “)”

46 LR(1) Identificar itens LR(1) Construir DFA 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 $ Verificar se existem conflitos

47 LR(1) Tabela do parser A gramática é LR(1), pois não existem conflitos
“(“ “)” $ 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 Goto s7 S7 Shift s8 S8 A gramática é LR(1), pois não existem conflitos


Carregar ppt "Determinar o tipo de gramática"

Apresentações semelhantes


Anúncios Google