Compiladores – Análise Semântica Introdução - WWW2

Propaganda
11/3/2008
Introdução
• Análise Semântica é por vezes referenciada como análise sensível ao contexto porque lida com algumas semânticas simples – tais como o uso de uma variável somente se ela já tiver sido declarada –
o que está além das capacidades de uma GLC.
• Geralmente, usa‐se a tabela de símbolos para realizar / computar a semântica.
• Mais formalmente, pode ser utilizada a tradução dirigida pela sintaxe com gramáticas de atributos.
Compiladores –
Análise Semântica
Fabiano Baldo
Fabiano Baldo ‐ UDESC
2
Introdução
Introdução
• A análise semântica envolve computação além da alcançada pelas GLC e algoritmos de análise sintática.
• A informação semântica está fortemente relacionada ao significado eventual ou semântico de um programa sendo compilado.
• Dado que ele acontece antes da execução do programa, ela é considerada uma análise semântica estática.
• A análise semântica em uma linguagem estaticamente tipada, como é o caso do C, envolve a construção de uma tabela de símbolos para manter o significado dos identificadores e realizar a inferência de tipo para propagar estes significados e tipos de checagem para expressões e declarações.
Fabiano Baldo ‐ UDESC
Fabiano Baldo ‐ UDESC
3
Introdução
Introdução
• Que tipo de significado está envolvido e que excede a capacidade das GLCs:
•
•
•
•
•
•
•
•
• A análise semântica pode ser dividida em duas categorias:
X foi declarado apenas uma vez?
X foi declarado antes do seu primeiro uso?
X foi definido antes do seu primeiro uso?
X é um escalar, um array, uma função, ou uma classe?
X é declarado mais nunca utilizado?
A que declaração X se refere?
Os tipos de uma expressão são compatíveis?
As dimensões casam com o declarado?
Fabiano Baldo ‐ UDESC
4
• Para estabelecer a corretude de um programa a fim de garantir sua execução apropriada. Isto varia de acordo com a rigidez semântica da linguagem em questão. Linguagens i id
â ti d li
tã Li
com orientação dinâmica, como LISP, pode não exigir uma análise um análise semântica estática.
• Para melhorar a eficiência da execução do programa. Isto é freqüentemente relacionado a otimização de código.
5
Fabiano Baldo ‐ UDESC
6
1
11/3/2008
Análise Semântica Estática
Atributos e Gramática de Atributos
• Envolve tanto a descrição quando a implementação das análises utilizando algoritmos apropriados.
• Atributos e gramáticas de atributos pode ser utilizados para escrever regras semânticas.
• Gramáticas de atributos pode ser úteis para linguagens que obedecem o princípio da semântica dirigida pela sintaxe (o conteúdo semântico de um programa está intimamente relacionado com sua sintaxe).
• Linguagens de programação modernas costumam seguir esta princípio.
• A semântica costuma não ser formalmente especificada pelos projetistas da linguagem, deixando para o construtor do compilador a tarefa de identificar os atributos da gramática
Fabiano Baldo ‐ UDESC
7
• Um atributo é uma propriedade da linguagem de programação que precisa ser verificada.
• Alguns exemplos de atributos são:
–
–
–
–
–
Tipo de dados de uma variável;
Valor de uma expressão;
Localização de uma variável em memória;
Código‐objeto de um procedimento;
Quantidade de dígitos significativos em um número.
Fabiano Baldo ‐ UDESC
8
Gramática de Atributos
Gramática de Atributos
• Regras semânticas expressam como a computação dos atributos se relaciona com as regras gramaticais da linguagem.
• Este conjunto de atributos e regras semânticas é denominado gramática de atributos.
• A construção de uma gramática de atributos é consideravelmente complicada.
• Portanto, uma base muito melhor para a expressão das computações semânticas é a sintaxe abstrata, representada por árvore de sintaxe abstrata.
• Os atributos pode ser fixados antes do processo de compilação (ou da construção do compilador).
• Os atributos pode ser também determinados somente durante a execução do programa.
• O processo de computar um atributo e associar seu valor com O processo de computar um atributo e associar seu valor com
a construção da ling. recebe o nome de amarração do atributo.
• O momento em que ocorre a amarração de um atributo é denominado tempo de amarração.
• Atributos amarrados antes da execução são ditos estáticos;
• Atributos amarrados durante a execução são ditos dinâmicos;
Fabiano Baldo ‐ UDESC
9
10
Exemplo 1: Gramática de Atributos para números sem sinal
Gramática de Atributos
• Se X for um símbolo gramatical e a for um atributo de X, escrevemos X.a para o valor de a associado a X.
• Dada uma coleção de atributos a1,...,ak, o princípio da semântica dirigida pela sintaxe implica que para cada regra gramatical X0→X1X2...Xn, os valores dos atributos Xi.aj de cada símbolo Xi são relacionados aos valores dos atributos dos outros símbolos da regra.
• Cada relação é especificada por uma regra semântica ou equação de atributos:
Fabiano Baldo ‐ UDESC
Fabiano Baldo ‐ UDESC
11
• Considere a gramática abaixo:
• O atributo mais significativo de um número é seu valor, e recebe o nome val
recebe o nome val.
• Sua gramática de atributos é especificada como segue:
Fabiano Baldo ‐ UDESC
12
2
11/3/2008
Exemplo 1: Árvore de Derivação para números sem sinal
Exemplo 2: Gramática de Atributos para expressões
• Considere a gramática abaixo:
• Árvore de derivação para o inteiro 345
• O atributo de exp, term e factor é seu valor numérico val.
• Sua gramática de atributos é especificada como segue:
S
ái d
ib
é
ifi d
Fabiano Baldo ‐ UDESC
13
Exemplo 2: Gramática de Atributos para expressões
• Note que o ‘+’ na regra gramatical exp1→exp2’+’term
representa o token no programa fonte, e o + na regra semântica representa a operação aritmética a ser executada em tempo de execução.
• Não há equações com number.val à esquerda, pois seu valor é calculado anteriormente, na fase sintática.
Fabiano Baldo ‐ UDESC
15
Exemplo 3: Gramática de Atributos para declarações de variáveis
• Considere a gramática abaixo:
Fabiano Baldo ‐ UDESC
14
Exemplo 2: Árvore de Derivação para números sem sinal
• Árvore de derivação para a expressão (34‐3)*42
Fabiano Baldo ‐ UDESC
16
Exemplo 3: Árvore de Derivação para números sem sinal
• Árvore de derivação para a declaração float x, y
• Para representar o tipo dos dados é adicionado um atributo a chamado dtype
chamado dtype.
Fabiano Baldo ‐ UDESC
17
Fabiano Baldo ‐ UDESC
18
3
11/3/2008
Exemplo 4: Gramática de Atributos para números com base
Exemplo 4: Gramática de Atributos para números com base
• Considere a gramática abaixo:
• Neste caso number e digit necessitam de um novo atributo, chamado base.
Fabiano Baldo ‐ UDESC
19
Exemplo 4: Árvore de Derivação para números sem sinal
20
Algoritmos para Computação de Atributos
• Árvore de derivação para o número 345o
Fabiano Baldo ‐ UDESC
Fabiano Baldo ‐ UDESC
• De que forma um compilador pode computar gramáticas de atributos?
• Isto leva a transformar a equação de atributos em regras de computação.
• Considere a seguinte equação de atributos:
21
Fabiano Baldo ‐ UDESC
22
Algoritmos para Computação de Atributos
Grafo de Dependência e Ordem de Avaliação • Ela é vista como uma atribuição do valor da expressão funcional à direita ao atributo Xi.aj, onde todos os atributos do lado direito devem ser conhecidos.
• Alguns do atributos do lado direito podem depender dos valores de outros atributos antes de serem computados
valores de outros atributos antes de serem computados.
• A solução desse problema de dependência está em encontrar uma ordem para a avaliação que garanta a disponibilidade dos valores a cada computação de atributo
• Essa dependência pode ser resolvida através da construção de um grafo de dependência.
• Dada uma gramática de atributos, cada regra gramatical tem um grafo de dependência associado.
• Esse grafo tem um nó rotulado para cada atributo Xi.aj de cada símbolo da regra gramatical, e para cada equação de atributos.
Fabiano Baldo ‐ UDESC
Fabiano Baldo ‐ UDESC
23
• Associada à regra gramatical existe um arco de cada nó Xm.ak à direita do nó Xi.aj
24
4
11/3/2008
Exemplo: Grafo de Dependência para Números
Exemplo: Grafo de Dependência para Números
• Para a regra gramatical e sua equação de atributos:
• O grafo de dependência para a cadeia 345 é:
• O grafo de dependência é:
• Para a regra gramatical e sua equação de atributos:
• O grafo de dependência é:
Fabiano Baldo ‐ UDESC
25
Exemplo: Grafo de Dependência para Declarações
Fabiano Baldo ‐ UDESC
26
Exemplo: Grafo de Dependência para Declarações
• Na gramática para declaração, a regra
Tem a seguinte equação de atributos e grafo de dependência • A regra tem a seguinte grafo de dependência: • Dado que decl não está envolvida no grafo de dependência, não fica claro qual regra gramatical está associada com ela
não fica claro qual regra gramatical está associada com ela.
– Por este motivo o grafo de dependência é desenhado sobre a árvore de análise sintática correspondente.
• De maneira similar, a regra tem como grafo de dependência
• As regras e tem grafos de dependências triviais. Fabiano Baldo ‐ UDESC
– Isso deixa mais claro a qual regra gramatical a dependência está associada.
27
Exemplo: Grafo de Dependência para Declarações
28
Exemplo: Grafo de Dependência para Declarações
• O grafo de dependência sobre a árvore de análise sintática para float x,y
• O grafo de dependência sobre a árvore de análise sintática para pode ser escrita:
Fabiano Baldo ‐ UDESC
Fabiano Baldo ‐ UDESC
29
Fabiano Baldo ‐ UDESC
30
5
11/3/2008
Exemplo: Grafo de Dependência para Números com Base
Exemplo: Grafo de Dependência para Números com Base
• O grafo de dependência para a regra gramatical • O grafo de dependência para a regra gramatical é:
é:
• A dependência é criada por onde depende de • O grafo mostra a dependência de e Fabiano Baldo ‐ UDESC
31
Exemplo: Grafo de Dependência para Números com Base
Fabiano Baldo ‐ UDESC
32
Exemplo: Grafo de Dependência para 345o
• O grafo de dependência para a regra é:
• A dependência é criada por Fabiano Baldo ‐ UDESC
33
Fabiano Baldo ‐ UDESC
34
Atributos Sintetizados e Herdados
Atributos Sintetizados
• A avaliação de atributos baseada em regras depende de um percurso explícito ou implícito da árvore sintática.
• Diversos tipos de percursos têm poder diferente em termos dos tipos de dependências de atributos que podem ser manipulados.
• Para estudar estas diferenças, é necessário classificar os atributos por tipos de dependências.
• Um atributo é sintetizado se todas as suas dependências apontarem de filho para pai na árvore de análise sintática.
• Portanto, um atributo a é sintetizado se, dada uma regra gramatical A →X1X2...Xn, a única equação de atributos associada com um a à esquerda tiver a forma:
A.a=f(X1.a1,...,X1.ak,...,Xn.a1,...,Xn.ak)
• Uma gramática de atributos em que todos os atributos são sintetizados é denominada S‐atribuída.
Fabiano Baldo ‐ UDESC
Fabiano Baldo ‐ UDESC
35
36
6
11/3/2008
Gramática S‐atribuída
Atributos Herdados
• Os valores de atributos de uma gramática S‐atribuída
podem ser computados por um único percurso ascendente, ou em pós‐ordem, da árvore.
• Pseudocódigo para um avaliador recursivo em pós‐
ordem:
• Um atributo que não é sintetizado é denominado atributo herdado.
• Existem três tipos de herança de atributos:
a) Herança de pai para filho;
b) Herança entre irmãos;
c) Herança entre irmãos através de ponteiros entre irmãos.
a)
Fabiano Baldo ‐ UDESC
37
Atributos Herdados
b)
c)
Fabiano Baldo ‐ UDESC
38
Gramática L‐atribuída
• Uma gramática de atributos para os atributos a1,...,ak
é L‐atribuída se, para cada atributo herdado aj e cada regra gramatical X0→X1X2...Xn, as equações associadas a aj forem todas da forma:
• Os valores dos atributos herdados podem ser computados por um percurso em pré‐ordem e in‐
ordem para percorrer a árvore de análise sintática.
Xi.aj=fij(X0.a1,...,X0.ak, X1.a1,...,X1.ak,..., Xi‐1.a1,...,Xi‐1.ak))
• Ou seja, se o valor de aj em Xi puder apenas depender dos atributos dos símbolos X0,...,Xi‐1 que ocorram à esquerda de Xi na regra gramatical.
Fabiano Baldo ‐ UDESC
39
Fabiano Baldo ‐ UDESC
40
Considerações
• S‐atribuída é um caso especial de L‐atribuída.
• Dada uma gramática L‐atribuída em que os atributos herdados não dependem dos atributos sintetizados, um analisador sintático descendente recursivo pode avaliar todos os atributos como segue:
– Transformação dos atributos herdados em parâmetros;
– Transformação dos atributos sintetizados em valores de retorno.
Fabiano Baldo ‐ UDESC
41
7
Download