Compiladores Análise Semântica
Análise semântica A semântica define o significado dos programas sintaticamente corretos; Por exemplo, em C, a instrução if(a>b) max = a; else max = b; Diz que a expressão a>b deve ser avaliada e, dependendo do retorno (true ou false), um dos dois comandos de atribuição será executado.
Análise semântica Regras sintáticas: mostram como formar o comando; Regras semânticas: mostram qual é o efeito do comando; Erros semânticos tipos inválidos - o programa dá um resultado, mas não é correto! o computador não advinha o que eu quero logo: o programa que escrevi não resolve o problema pretendido os erros semânticos são os mais difíceis de corrigir
Análise semântica Conceitos semânticos básicos de uma LP Variáveis: questões semânticas associadas a declaração (escopo, tipo e tempo de vida); Valores e Referência: se o valor associado a variável denota localização na memória ou conteúdo localizado na memória; Expressões: possuem regras para serem escritas envolvendo os tipos de expressões permitidas;
Análise semântica Abstração Processo de identificar apenas as qualidades ou propriedades relevantes do fenômeno que se quer modelar; As LP são as ferramentas com as quais os programadores podem implementar os modelos abstratos; Por outro lado, as próprias LP são abstrações do processador subjacente;
Análise semântica Abstração Sugere a distinção que deve ser feita entre o que o programa faz e como ele é implementado ; Quando um procedimento é chamado, pode-se concentrar apenas no que ele faz; Quando se está escrevendo o procedimento deve-se concentrar em como implementálo; As primeiras abstrações foram o uso de mnemônicos em assembly;
Análise semântica Programas trabalham com entidades Entidades: Variáveis, rotinas e comandos; As entidades dos programas possuem propriedades chamadas atributos; Os valores dos atributos devem ser definidos antes de sua utilização.
Análise semântica A definição do valor de um atributo é conhecida como amarração ou binding;
Análise semântica Amarração estática: A amarração é estabelecida antes do tempo de execução e não pode ser alterada depois; Exemplo: um conjunto de valores é amarrado ao tipo inteiro no tempo de implementação da linguagem, assim, a definição da linguagem específica que o tipo inteiro deve ser suportado e a implementação da linguagem amarra-o à representação da memória.
Análise semântica Amarração dinâmica: A amarração é estabelecida em tempo de execução. Exemplo: as variáveis são amarradas a um valor em tempo de execução;
Exemplo Analise os códigos abaixo e identifique os erros em léxico, sintático e semântico: int I2, A@; I2 = 0; while(i2 <= 0); I = I+1; I2 = a ; int a, b c; a = 2; b := 3; c = 4; media = (a+b+c)/3;
total = num1 + num2 * 50 Analisador Léxico Fases da compilação
Fases da compilação total = num1 + num2 * 50 Analisador Léxico (id,1)(=>(id,2)(+>(id,3)(*>(50>
Fases da compilação total = num1 + num2 * 50 Analisador Léxico (id,1)(=>(id,2)(+>(id,3)(*>(50> Analisador Sintático = (id,1) + (id,2) * (id,3) 50
Fases da compilação total = num1 + num2 * 50 Analisador Léxico (id,1)(=>(id,2)(+>(id,3)(*>(50> Analisador Sintático = (id,1) + (id,2) * (id,3) 50 Analisador Semântico = (id,1) + (id,2) * (id,3) atof(50)
Fases da compilação total = num1 + num2 * 50 Analisador Léxico (id,1)(=>(id,2)(+>(id,3)(*>(50> Analisador Sintático = (id,1) + (id,2) * (id,3) 50 Analisador Semântico = (id,1) + (id,2) * (id,3) atof(50) Gerador de Código Intermediário t1 = atof(50) t2 = id3 * t1 t3 = id2 + t2 id1 = t3
Fases da compilação total = num1 + num2 * 50 Analisador Léxico (id,1)(=>(id,2)(+>(id,3)(*>(50> Analisador Sintático = (id,1) + (id,2) * (id,3) 50 Analisador Semântico = (id,1) + (id,2) * (id,3) atof(50) Gerador de Código Intermediário t1 = atof(50) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 Otimizador de Código t1 = id3 * 50.0 id1 = id2 + t1
Fases da compilação total = num1 + num2 * 50 Analisador Léxico (id,1)(=>(id,2)(+>(id,3)(*>(50> Analisador Sintático = (id,1) + (id,2) * (id,3) 50 Analisador Semântico = (id,1) + (id,2) * (id,3) atof(50) Gerador de Código Intermediário t1 = atof(50) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 Otimizador de Código t1 = id3 * 50.0 id1 = id2 + t1 Gerador de Código LDF R2,id3 MULF R2, R2, #50.0 LDF R1, id2 ADDF R1, R1, R2 STF id1, R1
Referências SEBESTA, Robert W. Conceitos de linguagens de programação. 9ª ed. Porto Alegre: Bookman, 2011. 792 p. ISBN 978-85-7780-791-8. Notas de aula Professora Isabel Harb Manssour