Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação Análise Semântica Disciplina: Compiladores Equipe: Luiz Carlos dos Anjos Filho José Ferreira Júnior Compiladores Um compilador é um programa que traduz um programa escrito numa linguagem fonte para outro equivalente escrito numa linguagem alvo. 2 Compiladores • Podemos dividir o processo de compilação em duas fases: • Análise : Parte o programa fonte em peças constituintes e cria uma representação intermediaria do programa fonte. • Síntese : Constrói o desejado programa alvo (código de máquina) a partir da representação intermediária. O processo de síntese requer técnicas mais especializadas. Compiladores Fases do Processo de Compilação 4 Análise Léxica É o processo de analisar a entrada de linhas de caracteres (código-fonte de um programa de computador) e produzir uma seqüência de símbolos chamados "símbolos léxicos" (lexical tokens), ou somente "símbolos" (tokens). A Análise Léxica é a forma de verificar determinado alfabeto. Quando analisamos uma palavra, podemos definir através da análise léxica se existe ou não algum caracter que não faz parte do nosso alfabeto 5 Análise Sintática Reconhece a estrutura global do programa, descrita através de gramáticas livres de contexto. A análise sintática transforma um texto de entrada em uma estrutura de dados, em geral uma árvore, o que é conveniente para processamento posterior, e captura a hierarquia implícita desta entrada. 6 Analise Semântica Embora a análise sintática consiga verificar se uma expressão obedece às regras de formação de uma dada gramática, seria muito difícil expressar através de gramáticas algumas regras usuais em linguagem de programação, como todas as variáveis devem ser declaradas e situações onde o contexto em que ocorre a expressão ou o tipo da variável deve ser verificado. 7 Analise Semântica O objetivo da análise semântica é trabalhar no nível de interrelacionamento entre partes distintas do programa. As tarefas básicas desempenhadas durante a análise semântica incluem: a verificação de tipos; a verificação do fluxo de controle; atribuição de um literal para outro tipo, como um inteiro em uma string ou vice-versa; e a verificação da unicidade da declaração de variáveis. Dependendo da linguagem de programação, outros tipos de verificações podem ser necessários. 8 Analise Semântica Não é possível representar em uma gramática livre de contexto uma regra como "Todo identificador deve ser declarado antes de ser usado", e a verificação de que essa regra foi aplicada cabe à análise semântica. 9 Analise Semântica - exemplo Considere o seguinte exemplo de código em C: int f1(int a, float b) { return a%b; } A tentativa de compilar esse código irá gerar um erro detectado pelo analisador semântico, mais especificamente pelas regras de verificação de tipos, indicando que o operador módulo % não pode ter um operador real. No compilador gcc, essa mensagem é: In function `f1': ...: invalid operands to binary % 10 Analise Semântica - exemplo Em alguns casos, o compilador realiza a conversão automática de um tipo para outro que seja adequado à aplicação do operador. Por exemplo, na expressão em C a = x - '0'; a constante do tipo caracter '0' é automaticamente convertida para inteiro para compor corretamente a expressão aritmética na qual ela toma parte; todo char em uma expressão é convertido pelo compilador para um int. Esse procedimento de conversão de tipo é denominado coerção (cast). 11 Analise Semântica - exemplo Verificação de fluxo de controle Objetivo: Detectar se comandos que controlam o fluxo da execução são usados de forma correta. Exemplos de situações com erros em C++ Uso inadequado do comando break Uso inadequado do comando continue 12 Analise Semântica - exemplo Verificação de unicidade Objetivo: Detectar se identificadores são únicos dentro de um mesmo escopo. Exemplos de situações com erros em C++ Nome de variável duplicado 13 Analise Semântica 14 Fim 15