CEDIS | Universidade de Brasília (UnB)

Análise semântica: quando um programa válido ainda está errado

Tipos, escopos, contextos e AST anotada

Prof. Dr. Sergio Antônio Andrade de Freitas
FGA0003 - Compiladores 1 | Semana 7 - teoria · 2026
símbolo CEDIS logo UnB
símbolo CEDISCEDIS
2/41

Roteiro da aula

  1. 01O problema: sintaxe correta não basta
  2. 02Regras semânticas da MiniComp
  3. 03Escopos, nomes e tabela de símbolos
  4. 04Propagação de tipos e coerções
  5. 05AST anotada, diagnósticos e projeto
símbolo CEDISCEDIS
3/41

Do parser ao significado

A análise semântica usa a AST e a tabela de símbolos para validar regras que a gramática não consegue expressar sozinha.

  • A sintaxe informa a forma do programa.
  • A semântica verifica declarações, tipos, escopos e contextos.
  • O resultado é uma AST anotada para as próximas fases.
imagem do slide
símbolo CEDISCEDIS
4/41

Objetivos de aprendizagem

Distinguir erros

Separar problemas sintáticos de problemas semânticos.

Resolver nomes

Associar usos de identificadores às declarações visíveis.

Propagar tipos

Determinar tipos de expressões a partir da AST.

Validar contexto

Checar regras como break, chamadas e retornos.

símbolo CEDISCEDIS
5/41
O parser confirmou que a estrutura está correta. O programa também faz sentido?
Pergunta orientadora da análise semântica
símbolo CEDISCEDIS
6/41

Sintaticamente válido, semanticamente inválido

Sintaxe válida

A gramática aceita a estrutura do comando.

Semântica inválida

As regras da linguagem rejeitam o significado produzido.

símbolo CEDISCEDIS
7/41
atividade

Atividade 1 — Sintático ou semântico?

Qual programa é sintaticamente válido, mas contém erro semântico?

  1. int x = ;
  2. int x = "dez";
  3. int = x 10;
  4. int x = 10
QR Code para acesso à atividade
seção

MiniComp: uma linguagem pequena para raciocinar

Regras explícitas evitam respostas ambíguas.

símbolo CEDISCEDIS
9/41

Regras semânticas da MiniComp

Declarações

Não há redeclaração no mesmo escopo.

Resolução

Nomes são buscados do escopo mais interno para o global.

Tipos

int promove para float; float não converte implicitamente para int.

Contexto

if e while exigem bool; break exige laço ativo.

símbolo CEDISCEDIS
10/41
imagem do slide

O inspetor semântico

A análise semântica pode ser vista como um inspetor que percorre a AST fazendo perguntas sobre nomes, tipos, contextos e resultados.

  • Quem é esse nome?
  • Qual é o seu tipo?
  • Ele pode ser usado aqui?
  • O resultado é coerente?
símbolo CEDISCEDIS
11/41

Programa condutor da aula

Exemplo analisado ao longo da aula: função soma, escopos locais, chamada com tipo incorreto, identificador não declarado e break fora de laço.

  • int soma(int a, int b) { return a + b; }
  • int resultado = soma(x, y);
  • if (x) { int x = 20; resultado = x + desconhecido; }
  • break;
imagem do slide
seção

Passagens semânticas

Separar responsabilidades facilita implementação e testes.

símbolo CEDISCEDIS
13/41
imagem do slide

Modelo em três passagens

A implementação pode reunir etapas, mas pensar em passagens ajuda a organizar o compilador.

  • Passagem 1: declarações e escopos.
  • Passagem 2: resolução de nomes e tipos.
  • Passagem 3: regras contextuais e diagnósticos.
símbolo CEDISCEDIS
14/41

Passagem 1 — declarações e escopos

1

Abrir escopo

Criar ambiente para bloco, função ou programa.

2

Inserir símbolos

Registrar variáveis, funções e parâmetros.

3

Detectar duplicidade

Proibir nomes repetidos no mesmo escopo.

4

Fechar escopo

Remover ambiente ao sair do bloco.

símbolo CEDISCEDIS
15/41

Pilha de escopos

Em escopo léxico, a busca começa no escopo mais interno ativo e sobe até o escopo global.

  • Declaração local pode ocultar declaração externa.
  • Ocultação pode ser permitida ou gerar advertência.
  • Redefinir no mesmo escopo é erro na MiniComp.
imagem do slide
símbolo CEDISCEDIS
16/41

Redefinição e ocultação

Redefinição

Declarar o mesmo nome duas vezes no mesmo escopo: erro.

Ocultação

Declarar nome igual em escopo interno: permitido na MiniComp.

Uso

Sempre se vincula à declaração visível mais próxima.

símbolo CEDISCEDIS
17/41
atividade

Atividade 2 — Resolução de nomes

No bloco interno, a qual declaração o uso de x está associado?

  1. Ao x global de tipo int
  2. Ao x local de tipo float
  3. Às duas declarações simultaneamente
  4. A nenhuma declaração
  • Código: int x = 1; { float x = 2.5; y = x + 1; }
QR Code para acesso à atividade
símbolo CEDISCEDIS
18/41
imagem do slide

Vínculo uso → declaração

A resolução de nomes transforma um texto igual em referências semânticas diferentes.

  • O mesmo nome pode aparecer em escopos distintos.
  • Cada uso deve apontar para uma declaração específica.
  • Esse vínculo é anotado na AST.
seção

Passagem 2 — tipos e coerções

Depois de saber quem é cada nome, podemos descobrir o tipo de cada expressão.

símbolo CEDISCEDIS
20/41

Regras de tipos da MiniComp

Aritmética

Operadores +, -, *, / exigem operandos numéricos.

Promoção

int pode promover para float.

Atribuição

float não atribui implicitamente para int.

Condições

if e while exigem expressão bool.

símbolo CEDISCEDIS
21/41

Propagação de tipos na AST

O tipo de uma expressão é calculado a partir dos tipos dos filhos.

  • Literais possuem tipos próprios.
  • Identificadores recebem o tipo do símbolo resolvido.
  • Operadores sintetizam um tipo resultante.
imagem do slide
símbolo CEDISCEDIS
22/41

Tabela de resultados para +

int + int
1
int + float
2
float + int
2
float + float
2
bool + int
0
símbolo CEDISCEDIS
23/41
atividade

Atividade 3 — Propagação de tipos

Pelas regras da MiniComp, qual é o tipo de 2 + 3.5 * 4?

  1. int
  2. float
  3. bool
  4. TIPO_ERRO
QR Code para acesso à atividade
símbolo CEDISCEDIS
24/41

Atribuições e coerções

Permitido

  • float y = 10;
  • int promove para float
  • sem perda relevante

Erro na MiniComp

  • int x = 3.14;
  • float não converte implicitamente para int
  • exigiria conversão explícita
símbolo CEDISCEDIS
25/41

Chamadas de função

Assinatura

Nome, tipo de retorno e lista de parâmetros.

Quantidade

A chamada deve fornecer o número correto de argumentos.

Tipo

Cada argumento deve ser compatível com o parâmetro.

Resultado

A expressão da chamada recebe o tipo de retorno.

seção

Passagem 3 — regras contextuais

Algumas regras dependem do lugar em que o nó aparece.

símbolo CEDISCEDIS
27/41

Exemplos de validação contextual

break

Só é válido dentro de laço.

return

Deve ser compatível com a função atual.

continue

Só é válido dentro de laço.

condição

if e while exigem tipo bool.

símbolo CEDISCEDIS
28/41

Contexto semântico durante a travessia

Estado mantido

  • escopo atual
  • profundidade de laço
  • função atual
  • tipo de retorno esperado

Uso nas regras

  • validar break
  • validar return
  • abrir e fechar escopos
  • registrar diagnósticos
símbolo CEDISCEDIS
29/41
atividade

Atividade 4 — Regra contextual

Qual construção exige informação sobre o contexto de controle?

  1. Literal inteiro
  2. Soma de dois inteiros
  3. Comando break
  4. Declaração de variável global
QR Code para acesso à atividade
seção

AST anotada e diagnósticos

O produto da análise semântica não é apenas aceitar ou rejeitar.

símbolo CEDISCEDIS
31/41

Antes e depois da anotação

AST antes

  • SOMA
  • ID: x
  • NUM: 2

AST depois

  • SOMA : int
  • ID: x : int → símbolo #14
  • NUM: 2 : int
símbolo CEDISCEDIS
32/41

O que pode ser anotado?

Tipo inferido

Tipo resultante de expressões.

Símbolo resolvido

Entrada da tabela associada ao uso.

Coerção

Conversão inserida ou exigida.

Diagnóstico

Erros e advertências localizados.

símbolo CEDISCEDIS
33/41

TIPO_ERRO evita cascata de diagnósticos

Primeiro erro

Identificador desconhecido não declarado.

Marcação

O nó recebe TIPO_ERRO.

Propagação

Operações superiores propagam o erro.

Benefício

Evita mensagens secundárias enganosas.

símbolo CEDISCEDIS
34/41
atividade

Atividade 5 — Mensagem de erro útil

Analise: int resultado = soma(10); Escreva uma mensagem de erro útil, com causa e localização hipotética.

Resposta aberta · até 250 caracteres
QR Code para acesso à atividade
seção

Integração com Flex e Bison

No projeto, o parser constrói; o analisador semântico valida e anota.

símbolo CEDISCEDIS
36/41

Durante o parsing ou depois?

Durante o parsing

  • Ações do Bison constroem nós
  • Algumas informações podem ser registradas
  • Útil para protótipos simples

Passagem separada

  • Melhor modularidade
  • Mais fácil testar
  • Evita misturar sintaxe e semântica
símbolo CEDISCEDIS
37/41

Exemplo de função semântica

Entrada

NoAST *no e ContextoSemantico *contexto.

Saída

TipoDado inferido, anotações no nó e diagnósticos acumulados.

símbolo CEDISCEDIS
38/41

Aplicação ao projeto

1

Definir tipos

Criar enum para int, float, bool e TIPO_ERRO.

2

Anotar AST

Adicionar tipo inferido e símbolo resolvido.

3

Gerenciar escopos

Implementar pilha ou lista de ambientes.

4

Acumular erros

Guardar diagnósticos com linha e contexto.

símbolo CEDISCEDIS
39/41

Checklist para a próxima prática

Tabela

Inserção, busca e escopo atual.

AST

Campos para tipo e símbolo.

Tipos

Regras de operadores e atribuições.

Testes

Casos positivos e negativos.

Diagnósticos

Mensagem, linha e causa.

Projeto

Commit e README atualizados.

símbolo CEDISCEDIS
40/41

Referências

  1. AHO, A. V.; LAM, M. S.; SETHI, R.; ULLMAN, J. D. Compilers: Principles, Techniques, and Tools. 2. ed. Pearson, 2006.
  2. COOPER, K. D.; TORCZON, L. Engineering a Compiler. 2. ed. Morgan Kaufmann, 2011.
  3. WIRTH, N. Compiler Construction. Addison-Wesley, 1996.
  4. GNU Bison Manual. Seções sobre ações semânticas, valores semânticos e recuperação de erros.
  5. Repositório da disciplina: https://github.com/sergioaafreitas/COMP1
símbolo CEDISCEDIS
41/41

Encerramento

A análise semântica transforma uma AST estrutural em uma representação validada, anotada e pronta para as próximas fases do compilador.

→ avançar · ← voltar · deslize (touch) · n notas · f tela cheia · p imprimir