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