Esquemas L-atribuídos. Conceitos Permitem usar atributos herdados e sintetizados Dada uma...
Transcript of Esquemas L-atribuídos. Conceitos Permitem usar atributos herdados e sintetizados Dada uma...
Esquemas L-atribuídos
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
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 paraCalcule os atributos sintetizados de n;
Fim
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.
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.
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 XX → B X | ε
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}
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}
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}
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}
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)
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}
Exemplo Avaliando a sentença 8 + 4 – 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 =
Exemplo Atribuindo valores ao símbolo num:
E
T X.h= X E.val=
num T.val= + T X1.h= X1 X.s=
8 num T.val=
4 - T X2.h= X2 X1.s=
num T.val= ε X2.s =
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h= X E.val=
num T.val=8 + T X1.h= X1 X.s=
8 num T.val=
4 - T X2.h= X2 X1.s=
num T.val= ε X2.s =
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h= X1 X.s=
8 num T.val=
4 - T X2.h= X2 X1.s=
num T.val= ε X2.s =
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h= X1 X.s=
8 num T.val=4
4 - T X2.h= X2 X1.s=
num T.val= ε X2.s =
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h=12 X1 X.s=
8 num T.val=4
4 - T X2.h= X2 X1.s=
num T.val= ε X2.s =
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h=12 X1 X.s=
8 num T.val=4
4 - T X2.h= X2 X1.s=
num T.val=1 ε X2.s =
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h=12 X1 X.s=
8 num T.val=4
4 - T X2.h=11 X2 X1.s=
num T.val=1 ε X2.s =
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h=12 X1 X.s=
8 num T.val=4
4 - T X2.h=11 X2 X1.s=
num T.val=1 ε X2.s = 11
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h=12 X1 X.s=
8 num T.val=4
4 - T X2.h=11 X2 X1.s= 11
num T.val=1 ε X2.s = 11
1
Exemplo Fazendo o caminhamento na árvore:
E
T X.h=8 X E.val=
num T.val=8 + T X1.h=12 X1X.s= 11
8 num T.val=4
4 - T X2.h=11 X2 X1.s= 11
num T.val=1 ε X2.s = 11
1
Exemplo 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
8 num T.val=4
4 - T X2.h=11 X2 X1.s= 11
num T.val=1 ε X2.s = 11
1
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)}
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 - 2 + y, a árvore de derivação fica:
E
T X
id - T X
num + T X
id εGerar folha
Gerar nodo
Gerar folhaGerar nodo
Gerar folha
Árvore de sintaxe obtida
+
- id y
id x num 2