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 ET T T1 * F TF 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 DTL 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 ET T T1 * F TF 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