lfa-18 - Dei-Isep

Propaganda
IV – Análise semântica
• Associação de regras semânticas a
produções
• Bibliografia aconselhada:
– Aho, Sethi e Ullman – capítulo 5.1 a 5.4
Jorge Morais
LFA 1999/2000 - 1
Tradução orientada pela sintaxe
• Existem duas formas de associar regras
semânticas a produções
– Definições orientadas pela sintaxe (gramática
de atributos): especificações de alto nível para
traduções
– Esquemas de tradução: indicam a ordem de
avaliação das regras semânticas
Jorge Morais
LFA 1999/2000 - 2
Gramática de atributos
• Gramática independente de contexto onde cada
símbolo gramatical (nó na árvore de derivação)
tem associado um conjunto de atributos
• Estes atributos podem ser:
– Sintetizados: valor obtido a partir dos filhos
– Herdados: valor obtido a partir do pai ou outros
descendentes deste
• Os atributos podem ser qualquer coisa: número,
tipo, endereço de memória, etc...
Jorge Morais
LFA 1999/2000 - 3
Exemplo – calculadora
PRODUÇÃO
L  E ‘\n’
E  E1 + T
ET
T  T1 * F
TF
F(E)
F  INT
Jorge Morais
REGRA SEMÂNTICA
Print(E.val)
E.val=E1.val+T.val
E.val=T.val
T.val=T1.val*F.val
T.val=F.val
F.val=E.val
F.val=INT.val
LFA 1999/2000 - 4
Exemplo – declaração de variável
PRODUÇÃO
REGRA SEMÂNTICA
DTL
L.herd = T.tipo
T  int
T.tipo=inteiro
T  real
T.tipo=real
L  L1 , ID
L1.herd=L.herd
ad_tipo(ID.entr,L.herd)
ad_tipo(ID.entr,L.herd)
L  ID
Jorge Morais
LFA 1999/2000 - 5
Esquemas de tradução
• Gramática independente de contexto onde
existem atributos associados aos símbolos
gramaticais e as acções semânticas são
colocadas entre chavetas
• O valor do atributo tem que estar disponível
quando for usado
Jorge Morais
LFA 1999/2000 - 6
Exemplo – calculadora
L  E ‘\n’
E  E1 + T
ET
T  T1 * F
TF
F(E)
F  INT
Jorge Morais
{ Print(E.val) }
{ E.val = E1.val+T.val }
{ E.val = T.val }
{ T.val = T1.val*F.val }
{ T.val = F.val }
{ F.val = E.val }
{ F.val = INT.val }
LFA 1999/2000 - 7
Exemplo – declaração de variável
D  T {L.herd = T.tipo} L
T  int {T.tipo = inteiro}
T  real {T.tipo = real}
L  {L1.herd = L.herd} L1 , ID
{ ad_tipo(ID.entr,L.herd) }
L  ID { ad_tipo(ID.entr,L.herd) }
Jorge Morais
LFA 1999/2000 - 8
Exemplo – notação posfixa
E  T E’
E’  + T { Print(‘+’) } E’ | 
T  F T’
T’  * F { Print(‘*’) } T’ | 
F  INT { Print(INT.val) } | ( E )
Jorge Morais
LFA 1999/2000 - 9
Download