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

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

Esquemas L-atribuídos

Apresentações semelhantes


Apresentação em tema: "Esquemas L-atribuídos"— Transcrição da apresentação:

1 Esquemas L-atribuídos

2 Conceitos Permitem usar atributos herdados e sintetizados
Dada uma produção A→ X1 X2 X3 ... Os atributos herdados de X2 só devem depender de atributos de A e de X1. Os atributos herdados de X3 só devem depender de atributos de A, de X1 e de X2. E assim por diante. Todo esquema S-atribuído será também L-atribuído

3 Avaliação de atributos
Para avaliar os atributos, usa-se o algoritmo de caminhamento: Caminhamento_profundidade(n:nodo) Inicio Para cada filho m de n, da esquerda para a direita, faça: Calcule os atributos herdados de m; Caminhamento_profundidade(m); Fim para Calcule os atributos sintetizados de n; Fim

4 Ordenação das ações semânticas
Ao se definir a gramática, deve ser garantido que um atributo já seja conhecido ao ser referenciado em alguma ação. Portanto: Ação para calcular atributo herdado de símbolo na parte direita da produção deve estar à esquerda desse símbolo. Ação para calcular atributo não terminal à esquerda da produção deve estar no final da produção. Ação para calcular atributo sintetizado de símbolo na parte direita da produção deve estar à direita desse símbolo.

5 Implementação de esquemas L-atribuidos
Esquemas L-atribuídos normalmente serão implementados por analisadores top-down. Deve-se portanto, eliminar a recursividade à esquerda das produções, se existirem. Ao se eliminar a recursividade, as ações semânticas da produção também devem ser modificadas.

6 Implementação de esquemas L-atribuidos
Sendo a produção genérica com recursividade: A → A1 B {A.a = g(A1.a, B.b)} A → C {A.a = f(C.c)} A eliminação da recursividade da gramática pode ser feita inserindo o símbolo X, tal que: A → C X X → B X | ε

7 Implementação de esquemas L-atribuidos
Sendo a produção genérica com recursividade: A → A1 B {A.a = g(A1.a, B.b)} A → C {A.a = f(C.c)} A função calculada na ação da segunda produção será transferida para a produção gerada por A, porém seu valor irá para atributo herdado do símbolo X. O atributo sintetizado de A será obtido no final da avaliação da produção, e irá depender de atributo sintetizado de X. A → C {X.h = f(C.c)} X {A.a = X.s}

8 Implementação de esquemas L-atribuidos
Sendo a produção genérica com recursividade: A → A1 B {A.a = g(A1.a, B.b)} A → C {A.a = f(C.c)} A função calculada na ação da primeira produção será transferida para a produção gerada por X, porém seu valor irá para atributo herdado do símbolo X1. O atributo sintetizado de X será obtido da mesma forma, no final da avaliação. X → B {X1.h = g(X.h, B.b)} X1 {X.s = X1.s}

9 Implementação de esquemas L-atribuidos
Sendo a produção genérica com recursividade: A → A1 B {A.a = g(A1.a, B.b)} A → C {A.a = f(C.c)} A produção que gera palavra vazia gerada por X será usada para se obter o valor do atributo sintetizado de X, da forma: X → ε {X.s = X.h}

10 Implementação de esquemas L-atribuidos
Sendo a produção genérica com recursividade: A → A1 B {A.a = g(A1.a, B.b)} A → C {A.a = f(C.c)} Eliminando-se a recursividade teremos: A → C {X.h = f(C.c)} X {A.a = X.s} X → B {X1.h = g(X.h, B.b)} X1 {X.s = X1.s} X → ε {X.s = X.h}

11 Exemplo Gramática a ser avaliada:
E→E1 + T {E.val = E1.val + T.val} E→E1 - T {E.val = E1.val - T.val} E→T {E.val = T.val} T→(E) {T.val = E.val} T→num {T.val = num.lexval} (Recursividade em E. Não é preciso modificar as duas últimas produções)

12 Exemplo Eliminando a recursividade, inserindo o símbolo X:
E→T {X.h = T.val} X {E.val = X.s} X→ + T {X1.h = X.h +T.val} X1{X.s = X1.s} X→ - T {X1.h = X.h – T.val} X1{X.s = X1.s} X → ε {X.s = X.h} T→(E) {T.val = E.val} T→num {T.val = num.lexval}

13 Exemplo E T X.h= X E.val= num T.val= + T X1.h= X1 X.s= num T.val=
Avaliando a sentença – 1, teremos a árvore: E T X.h= X E.val= num T.val= + T X1.h= X1 X.s= num T.val= - T X2.h= X2 X1.s= num T.val= ε X2.s =

14 Exemplo E T X.h= X E.val= num T.val= + T X1.h= X1 X.s= 8 num T.val=
Atribuindo valores ao símbolo num: E T X.h= X E.val= num T.val= + T X1.h= X1 X.s= num T.val= T X2.h= X2 X1.s= num T.val= ε X2.s = 1

15 Exemplo E T X.h= X E.val= num T.val=8 + T X1.h= X1 X.s= 8 num T.val=
Fazendo o caminhamento na árvore: E T X.h= X E.val= num T.val=8 + T X1.h= X1 X.s= num T.val= T X2.h= X2 X1.s= num T.val= ε X2.s = 1

16 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h= X1 X.s= 8 num T.val=
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h= X1 X.s= num T.val= T X2.h= X2 X1.s= num T.val= ε X2.s = 1

17 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h= X1 X.s= 8 num T.val=4
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h= X1 X.s= num T.val=4 T X2.h= X2 X1.s= num T.val= ε X2.s = 1

18 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s=
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s= num T.val=4 T X2.h= X2 X1.s= num T.val= ε X2.s = 1

19 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s=
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s= num T.val=4 T X2.h= X2 X1.s= num T.val= ε X2.s = 1

20 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s=
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s= num T.val=4 T X2.h=11 X2 X1.s= num T.val= ε X2.s = 1

21 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s=
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s= num T.val=4 T X2.h=11 X2 X1.s= num T.val= ε X2.s = 11 1

22 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s=
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1 X.s= num T.val=4 T X2.h=11 X2 X1.s= 11 num T.val= ε X2.s = 11 1

23 Exemplo E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1X.s= 11
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= num T.val=8 + T X1.h=12 X1X.s= 11 num T.val=4 T X2.h=11 X2 X1.s= 11 num T.val= ε X2.s = 11 1

24 Exemplo E T X.h=8 X E.val= 11 num T.val=8 + T X1.h=12 X1 X.s= 11
Fazendo o caminhamento na árvore: E T X.h=8 X E.val= 11 num T.val=8 + T X1.h=12 X1 X.s= 11 num T.val=4 T X2.h=11 X2 X1.s= 11 num T.val= ε X2.s = 11 1

25 Obtenção da árvore sintática
Alterando algumas ações da gramática (os não terminais terão ponteiros – ptr - e será gerado nó ao invés de cálculo): E→T {X.h = T.ptr} X {E.ptr = X.s} X→ + T {X1.h = geranodo(‘+’,X.h,T.ptr)} X1{X.s = X1.s} X→ - T {X1.h = geranodo(‘-’,X.h ,T.ptr)} X1 {X.s = X1.s} X → ε {X.s = X.h} T→(E) {T.ptr = E.ptr} T→num {T.ptr = gerafolha(num,num.lexval)} T→id {T.ptr = gerafolha(id,id.indice)}

26 Obtenção da árvore sintática
Portanto, serão geradas folhas da árvore ao se processar produções em T, e nodos ao se processar as produções em X. Para a entrada x y, a árvore de derivação fica: E T X id - T X + num T X Gerar nodo id ε Gerar folha Gerar nodo Gerar folha Gerar folha

27 Árvore de sintaxe obtida
+ - id y id x num 2


Carregar ppt "Esquemas L-atribuídos"

Apresentações semelhantes


Anúncios Google