Você está na página 1de 75

Traduo Dirigida Pela Sintaxe

Julho 2006
Sugesto de leitura: Livro do Aho, Sethi,
Ullman (drago)- Sees 5.1-5.5
Traduo dirigida pela sintaxe
uma tcnica que permite realizar
traduo (gerao de cdigo)
concomitantemente com a anlise
sinttica
Aes semnticas so associadas s
regras de produo da gramtica de modo
que, quando uma dada produo
processada, essas aes sejam
executadas
Traduo dirigida pela Sintaxe
A execuo das aes semnticas pode:
gerar cdigo intermedirio
gerar ou interpretar cdigo
armazenar informaes na tabela de
smbolos
checar a semntica dos comandos
Emitir mensagens de erro, etc.
Traduo dirigida pela sintaxe
Para tornar as aes semnticas mais
efetivas, pode-se associar variveis aos
smbolos (terminais e no terminais) da
gramtica
Assim, os smbolos gramaticais passam a
conter atributos (ou parmetros) capazes
de armazenar valores durante o processo
de reconhecimento
Traduo dirigida pela sintaxe
Um atributo qualquer propriedade de
uma construo de linguagem de
programao.
O processo de computar um atributo e
associar o seu valor computado com a
construo da linguagem em questo
recebe o nome de amarrao do
atributo.
Traduo dirigida pela sintaxe
Na traduo dirigida pela sintaxe, os
atributos so diretamente associados aos
smbolos gramaticais da linguagem
Se X for um smbolo gramatical (terminal
ou no terminal), e a for um atributo
associado a X, escrevemos X.a para o
valor de a associado a X.
Traduo dirigida pela sintaxe
Exemplo:
D var id : type { addTAbSimb( id.lexeme, type.tipo}
type id { type.tipo = buscaTS(id.lexeme);
if ( type.tipo no for identificador de tipo)
erro(Tipo indefinido na linha +linha);
}
Toda vez que uma regra de produo
usada no processo de reconhecimento de
uma sentena, os smbolos gramaticais so
alocados junto com seus atributos
Traduo dirigida pela sintaxe
Pensando na rvore de derivao da
sentena sob anlise, como se a cada
n da rvore (smbolo gramatical)
correspondesse a uma instanciao de
um smbolo e seus atributos
como se o n contivesse campos para
armazenar valores correspondentes ao
smbolo
Traduo dirigida pela sintaxe
Lexeme um
atributo do
tomo

D var id : type { addTAbSimb( id.lexeme, type.tipo }


type id { type.tipo = buscaTS(id.lexeme);
if ( type.tipo no for identificador de tipo)
erro(Tipo indefinido na linha +linha);
}
O smbolo gramatical
type tem um atributo
tipo que indica qual o
tipo encontrado
Traduo dirigida pela sintaxe
1) D var id : type { addTAbSimb( id.lexeme, type.tipo}
2) type -> id { type.tipo = buscaTS(id.lexeme);
if ( type.tipo no for identificador de tipo)
erro(Tipo indefinido na linha +linha)
}
Durante o processo de reconhecimento,
quando a produo 2 reduzida, o atributo
tipo associado ao no terminal type recebe o
valor do tipo reconhecido
Traduo dirigida pela sintaxe
1) D var id : type { addTAbSimb( id.lexeme, type.tipo}
2) type -> id { type.tipo = buscaTS(id.lexeme);
if ( type.tipo no for identificador de tipo)
erro(Tipo indefinido na linha +linha)
}
A reduo da produo 1 adiciona na tabela
de smbolos o nome da varivel e seu
respectivo tipo
Traduo dirigida pela sintaxe
Sabemos que em nosso modelo sendo
implementado, cada smbolo no terminal
foi convertido em uma funo
Na maioria das linguagens no possvel
associar atributos nome de funes
No entanto, esses atributos podem ser
representados por parmetros passados
funo, ou mesmo um valor de retorno
Traduo dirigida pela sintaxe
Por exemplo, na gramtica:
D var id : type { addTAbSimb( id.lexeme, type.tipo}
type -> id { type.tipo = buscaTS(id.lexeme);
if ( type.tipo no for identificador de tipo)
erro(Tipo indefinido na linha +linha)
}
Temos dois smbolos no terminais
Logo, necessitamos de duas funes para
implementar um analisador sinttico
descendente recursivo
Traduo dirigida pela sitaxe
void D (void)
{
match(VAR);
IDVar = atomoCorrente;
match(ID);
match(COLON);
type( &tipo);
addTabSimb(IDVar.lexeme, tipo);
}
Traduo dirigida pela sintaxe
void type( ttype *t)
{
atomoIDTipo = atomoCorrente;
match(ID);
ptrID = buscaTS(atomoIDTipo.lexeme);

if ( !prtID)
erro(Identificador de tipo +atomoIDTipo.lexeme + indefinido);

if (ptrID.categoria != IDTIPO)
erro(Identificador +atomoIDTipo.lexeme + no identificador
de tipo);

t = ptrID.tipo;
}
Exerccio
Quais seriam as aes semnticas para o
comando:

declaracao_de_variaveis ::=
declare lista_de_ID1 : tipo { ; lista_de_IDi : tipo };

lista_de_ID ::= identificador { , identificador }


Traduo Dirigida pela Sintaxe
Trata da compilao de linguagens guiadas por
gramticas livres de contexto.
Associa informaes atrelando atributos aos
smbolos gramaticais que representam as
construes.
Os valores dos atributos so computados pelas
aes semnticas.
Existem duas notaes:
Definio dirigida pela sintaxe
Esquema de traduo
Traduo Dirigida pela Sintaxe

Traduo Dirigida pela Sintaxe

Definio Dirigida pela Esquema de Traduo


Sintaxe
Traduo de Linguagens
O fluxo de tokens sintaticamente analisado
construda a rvore gramatical
A rvore percorrida avaliando-se as regras
semnticas
Regras semnticas podem:
Gerar cdigo
Salvar informaes na TABELA DE SMBOLOS
Emitir mensagens de erro
Realizar outras atividades
Pode ser de 1 ou mais passagens
Pode ser implementada em uma passagem, executando
as aes semnticas juntamente com a anlise
sinttica.
Definio dirigida pela sintaxe
Especificaes de alto nvel
Cada smbolo gramatical possui um
conjunto de atributos associados divididos
em:
Atributos sintetizados: valor calculado em
funo dos filhos
Atributos herdados: valor calculado em
funo dos pais e irmos
Definio dirigida pela sintaxe

Regras semnticas estabelecem dependncias


entre os atributos representados em um grafo
O grafo determina a ordem de avaliao das
regras
A avaliao das regras semnticas gera os
valores dos atributos
A rvore gramatical que mostra os valores dos
atributos chamada de rvore gramatical
anotada
Definio dirigida pela sintaxe

Cada produo A est associado a


um conjunto de regras semnticas na
forma:

B := f(c1, c2, ..., ck)


Definio dirigida pela sintaxe
Onde f uma funo que vigora em uma das
seguintes situaes:
B um atributo sintetizado de A e c1, c2, ..., ck so
atributos pertencentes aos smbolos gramaticais da
produo
B um atributo herdado, pertencente a um dos
smbolos gramaticais do lado direito da produo e
c1, c2, ..., ck so atributos pertencentes aos
smbolos gramaticais da produo
Em ambos os casos, dizemos que o atributo B
depende dos atributos c1, c2, ..., ck
Definio dirigida pela sintaxe
Vamos analisar uma definio definida
pela sintaxe para uma calculadora.
Esta definio associa um atributo
sintetizado inteiro com os no terminais E,
TeF
Na gramtica, o terminal n representa um
caractere de nova linha
Definio dirigida pela sintaxe

Produo Regra Semntica


LEn Imprimir(E.val)
E E1+T E.val:= E1.val + T.val
ET E.val:= T.val
T T1 * F T.val:= T1.val * F.val
TF T.val:= F.val
F (E) F.val:= E.val
F dgito F.val:= dgito.lexval
Definio dirigida pela sintaxe
rvore gramatical anotada
L

n
E.val = 15

E.val = 15
+ T.val = 4

T.val = 15 F.val = 4

* digit.lexval = 4
T.val = 3 F.val = 5

F.val = 3

digit.lexval = 3
Definio dirigida pela sintaxe
rvore gramatical anotada (forma alternativa)
L

n
E val = 15

E (val = 15)
+ T (val = 4)

T (val = 15) F (val = 4)

* digit (lexval = 4)
T(val = 3) F

digit (lexval = 5)
F (val = 3)

digit (lexval = 3)
Definio dirigida pela sintaxe
Considere a gramtica simples a seguir
para nmeros sem sinal
nmero nmero dgito |
dgito
dgito 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Exerccio 1: Mostre a rvore de derivao


para reconhecer o nmero 345
Definio dirigida pela sintaxe
Considere a gramtica simples a seguir
para nmeros sem sinal (cont.)
nmero nmero dgito |
dgito
dgito 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Exerccio 2: Escreva aes semnticas para


produzir e escrever como sada um
nmero inteiro sem sinal
Definio dirigida pela sintaxe
Produo Regra Semntica
nmero1 nmero2 dgito nmero1.val = nmero2.val * digito.val
nmero dgito nmero.val = digito.val
dgito 0 digito.val = 0
dgito 1 digito.val = 1
dgito 2 digito.val = 1
dgito 3 digito.val = 3
dgito 4 digito.val = 4
dgito 5 digito.val = 5
dgito 6 digito.val = 6
dgito 7 digito.val = 7
dgito 8 digito.val = 8
dgito 9 digito.val = 9
Definio dirigida pela sintaxe
Exerccio: Construa a rvore gramatical
anotada para o nmero 345
Atributos Sintetizados

Na traduo dirigida pela sintaxe


assume-se que os terminais tenham
somente atributos sintetizados na medida
em que as definies no providencie
quaisquer regras semnticas
Os valores para os atributos dos terminais
costumam ser fornecidos pelo lxico:

F dgito F.val= dgito.lexval


Atributos Sintetizados

Atributos sintetizados so bastante


usados na prtica.
Uma definio dirigida pela sintaxe
somente com atributos sintetizados
chamada de definio S-atribuda.
Os atributos costumam ser avaliados de
baixo para cima, das folhas para a raiz.
Atributos Herdados

Atributos herdados so convenientes


para expressar construes de LPs em
relao ao contexto em que aparecem
Bastante til na verificao de tipos
Controlar se um identificador aparece do
lado esquerdo (endereo) ou direito
(valor) de uma atribuio
Atributos Herdados

Produo Regra Semntica


DTL L.in:= T.tipo L.in um
T int T.tipo:= inteiro atributo
herdado
T float T.tipo:= real
L L1, id L1.in:= L.in
incluir_tipo(id.entrada, L.in)

L id incluir_tipo(id.entrada, L.in)
Atributos Herdados

Monte a rvore gramatical anotada para


a cadeia

int a, B, X
Grafo de Dependncias
Se um atributo b em um n de uma rvore
de derivao depende de um atributo c,
ento a regra semntica de b deve ser
avaliada aps a regra semntica que
define c
As interdependncias entre os atributos
herdados e atributos sintetizados em uma
rvore gramatical denotada por um grafo
dirigido chamado grafo de dependncias
Grafo de Dependncias

Um Grafo de Dependncias construdo


para uma rvore gramatical:
Ele mostra as interdependncias entre os
atributos dos ns da rvore gramatical
Objetivo: Definir uma ordem de avaliao
das regras semnticas em uma traduo
dirigida pela sintaxe
Grafo de Dependncias
Cada regra semntica deve ser da forma b := f(c1, c2, ...,ck)
O grafo possui um n para cada atributo. Existe uma aresta de ci
para b se o atributo b depende de ci
para cada n n na rvore gramatical faa
para cada atributo a do smbolo gramatical em n faa
gere um n para a no grafo de dependncias
fim para
fim para
para cada n n na rvore gramatical faa
para cada regra semntica b:= f(c1, c2, ...,ck) faa
para i= 1 at k faa
gere uma aresta a partir do n ci at o n b
fim para
fim para
fim para
Ordem de Avaliao

Uma classificao topolgica uma


ordenao dos ns de um grafo que
segue a regra:
Se mi mj uma aresta do grafo de
dependncias, ento mi aparece antes de
mj na classificao topolgica
Ordem de Avaliao
Uma classificao topolgica indica uma
ordem vlida na qual as regras
semnticas devem ser avaliadas
Os atributos c1, ..., ck dos quais uma regra
semntica dependa b:= f(c1, ..., ck) devem
estar disponveis antes de f ser avaliada
Traduo de Linguagens

Crie uma ordenao topolgica baseada


em regras para a cadeia

float x, y
rvores Sintticas

A rvore sinttica uma representao


intermediria que pode ser construda
por definies dirigidas pela sintaxe
Separa a traduo da anlise sinttica
Trata-se de uma forma condensada de
rvore gramatical
rvore Sinttica
Uma rvore sinttica (abstrata) uma forma
condensada da rvore gramatical na qual:
Operadores e palavras chaves no aparecem
como folhas, mas como ns interiores da rvore
E
+
E T
+
* 4
T F
T F
* 4 3 5
F F rvore Sinttica
3 5
rvore Gramatical
rvores Sintticas

Na rvore sinttica operadores e palavras-


chave no aparecem nas folhas, mas sim em
ns interiores
Tradues dirigida pela sintaxe podem ser
usadas tanto em rvores gramaticais quanto
em rvores sintticas
rvores Sintticas
Construa uma rvore gramatical e uma
rvore sinttica para a produo
S if B then S1 else S2
rvores Sintticas
rvore Gramatical rvore Sinttica do
Comando condicional if
S
if then else

if B then S1 else S2
B S1 S2
rvores Sintticas para Expresses

A rvore sinttica para expresses


correspondente construo da
expresso na forma posfixa
possvel escrever uma definio
dirigida pela sintaxe para construir uma
rvore sinttica de uma expresso
rvores Sintticas para Expresses

Cada n da rvore sinttica pode ser


implementado como um registro com
vrios campos.
Em um n temos:
Um campo que identifica o operador
E campos que so ponteiros para os
operandos
O operador comumente chamado de
label do n.
rvores Sintticas para Expresses

Para criar os ns de uma rvore sinttica


usaremos as funes:
cria_no(op, direita, esquerda)
Cria um n com o operador igual a op e dois campos com
ponteiros para a subrvores esquerda e direita
cria_folha( id, entrada_TS)
Cria um n com identificador com label id e um campo
contendo a entrada da Tabela de Smbolos
cria_folha( num, val)
Cria um n com nmero com label id e um campo contendo
o valor.
Construindo rvores Sintticas

Produo Regra Semntica

E E1 + T E.ptr:= cria_no(+, E1.ptr, T.ptr)


E E1 - T E.ptr:= cria_no(-, E1.ptr, T.ptr)
ET E.ptr:= T.ptr
T (E) T.ptr:= E.ptr
T id T.ptr:= cria_folha(id, id.entrada)
T num T.ptr:= cria_folha(num, num.val)

Figura 1: Definies dirigidas pela sintaxe para construo de uma


rvore sinttica de uma expresso
Construindo rvores Sintticas

Gere a rvore gramatical anotada para a


expresso a 4 + c
Construindo rvores Sintticas
Representao da rvore sinttica em uma
estrutura de dados
+
+

- c
- id

a 4
rvore Sinttica id num 4

Estrutura de dados
Grafo Dirigido Acclico (DAG)
DAG = Directed Acyclic Graph
um grafo usado para identificar as
subexpresses comuns em uma
expresso
Tal como uma rvore sinttica, um DAG
possui um n para cada subexpresso da
expresso
A diferena que no DAG um n pode ter
mais de um pai.
Grafo Dirigido Acclico (DAG)
Numa rvore sinttica, sub-expresses
comuns so representadas como sub-
rvores duplicadas
Seja a expresso:
a+a*(bc)+(bc)*d

Sub-expresses comuns
Sub-expresses comuns
Grafo Dirigido Acclico (DAG)
rvore Sinttica para a expresso
a+a*(bc)+(bc)*d
+

+ *

* - d
a
a - b c

b c

rvore Sinttica
Grafo Dirigido Acclico (DAG)
DAG da a expresso
a+a*(bc)+(bc)*d
+

+ *

* d

a
-

b c

Grafo Dirigido Acclico


Grafo Dirigido Acclico (DAG)
As mesmas definies dirigidas pela
sintaxe da Figura 1 podem ser usadas
para construir o DAG
Basta mudarmos as funes
cria_no(op, direita, esquerda)
cria_folha( id, entrada_TS)
cria_folha( num, val)
As funes devero checar se o n sendo
criado j existe.
Avaliao S-atribuda

Definies S-atribudas so aquelas que


s possuem atributos sintetizados
O valor dos atributos pode ser
controlado pela pilha sinttica em um
parser bottom-up
A cada reduo, o valor de um atributo
sintetizado calculado a partir dos
smbolos empilhados que aparecem do
lado direito da produo
Avaliao S-atribuda
O estado um ponteiro ou ndice de uma
tabela sinttica (usa-se no entanto o
smbolo gramatical para facilitar)
O valor o valor do atributo associado ao
n gramatical correspondente a um estado

A-> XYZ { A.a := f(X.x, Y.y, Z.z) } estado valor


X X.x
Y Y.y
topo Z Z.z
... ...
Avaliao S-atribuda

Os atributos sintetizados so avaliados


exatamente antes de cada reduo
Seja A XYZ, o configurao da pilha
ser:
estado valor
X X.x
Y Y.y
topo Z Z.z
... ...
Avaliao S-atribuda

O atributo Z.z est em val[topo]


O atributo Y.y est em val[topo-1]
O atributo X.x est em val[topo-2]
Aps a reduo topo decrementado de
2 estado valor
X X.x
Y Y.y
topo Z Z.z
... ...
Avaliao S-atribuda
O estado que A ser colocado onde
estava X
O valor do atributo sintetizado A.a ser
colocado em val[topo-1]

estado valor estado valor


X X.x A A.a
topo
Y Y.y
topo Z Z.z ... ...
... ...
Avaliao S-atribuda

Produo Regra Semntica


LE Imprimir(val[topo])
E E1+T val[ntopo]:= val[topo-2] + val[topo]
ET val[ntopo]:= val[topo]
T T1 * F val[ntopo]:= val[topo-2] x val[topo]
TF val[ntopo]:= val[topo]
F (E) val[ntopo]:= val[topo-1]
F dgito val[ntopo]:= dgito.lexval
Avaliao S-atribuda

Quando uma produo reduzida com r


smbolos gramaticais do lado direito,
tem-se ntopo= topo-r+1
Depois da execuo de cada conjunto
de regras semnticas, topo= ntopo
Exemplo: avaliao da expresso 3*5+4
Definio L-atribuda

Definies em que os atributos so sempre


avaliados em uma ordem de pesquisa em
profundidade
Uma definio dirigida pela sintaxe L-
atribuda se cada atributo herdado de Xj, onde
1j n que esteja do lado direito de uma
produo A X1 X2...Xn depender somente:
Dos atributos dos smbolos X1 X2...Xj-1 esquerda
de Xj
Dos atributos herdados de A
Definio L-atribuda
procedimento visitar_df(n: n)
para cada filho m de n da esquerda para direita, faa
avaliar os atributos herdados de m
visitar_df(m)
fim para
avaliar os atributos sintetizados de n
fim
Esquemas de Traduo
Tambm so aes semnticas, tal como
definies dirigidas pela sintaxe.
Indica a ordem em que as regras
semnticas devem ser avaliadas
Exibem detalhes de implementao
Esquema de Traduo

O esquema de traduo uma gramtica


livre de contexto na qual as aes
semnticas so inseridas no lado direito
das produes

E TR
T num {imprimir(num.val)}
R op_aditivo T {imprimir(op_aditivo.lexema)} R
R
Esquemas de Traduo
Com esquemas de traduo podemos
determinar a ordem na qual aes e
avaliaes de atributos acontecem.
Traduo Top-Down
Definies L-Atribudas sero
implementadas durante um analisador
preditivo.
Usaremos esquemas de traduo.
Eliminao de recurso esquerda de
um esquema de traduo
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.val }

Esquema de traduo com uma gramtica


recursiva esquerda.
Eliminao de recurso esquerda de
um esquema de traduo
E -> T { R.i = T.val }
R { E.val = R.s }
R -> +
T { R1.i = R.i + T.val }
R1 { R.s = R1.s }
R -> -
T { R1.i = R.i - T.val }
R1 { R.s = R1.s }
R -> { R.s = R.i }
T -> ( E ) { T.val := E.val }
T -> num { T.val = num.val }

Esquema de traduo transformado com uma gramtica


recursiva direita.
Eliminao de recurso esquerda de
um esquema de traduo
E

T.val = 9 R.i = 9

num.val = 9 - T.val = 5 R.i = 4

num.val = 5 + T.val = 2 R.i = 6

num.val = 2

Avaliao da expresso 9 5 + 2
Esquema de Traduo

Quando usamos atributos herdados e


sintetizados, usamos as heursticas a seguir
para criar esquemas de traduo
Um atributo herdado para um smbolo do lado
direito precisa ser calculado em uma ao anterior
Uma ao no pode se referir a uma atributo
sintetizado de um smbolo direita da ao
Um atributo sintetizado para um no terminal
esquerda deve ser calculado somente aps o
clculo de todos os atributos que o mesmo
referencie

Você também pode gostar