Centro de Estudos, Desenvolvimento e Inovação em Software — CEDIS | UnB

Estruturas de dados e representação interna do código-fonte

AST e tabela de símbolos · Semana 6 · teoria

Prof. Sergio Antônio Andrade de Freitas
FGA0003 — Compiladores 1 · Curso de Engenharia de Software · 2026
símbolo CEDIS logo UnB
símbolo CEDISCEDIS
2/33

Roteiro da aula

  1. 01Do código-fonte à representação interna
  2. 02Árvore sintática abstrata
  3. 03Tabela de símbolos e escopos
  4. 04Integração com Flex e Bison
  5. 05Erros, memória e aplicação ao projeto
símbolo CEDISCEDIS
3/33

Objetivos de aprendizagem

Distinguir

Árvore concreta, AST e suas finalidades.

Interpretar

Nós, relações, precedência e travessias.

Modelar

Entradas e escopos da tabela de símbolos.

Integrar

Flex, Bison, AST e análise semântica.

Parte 1

Do texto à representação interna

Tokens e regras precisam se transformar em estruturas que o compilador possa percorrer e anotar.

símbolo CEDISCEDIS
5/33

Pipeline até a representação interna

O parser normalmente constrói a AST; o analisador semântico percorre e anota essa árvore enquanto cria e consulta símbolos.

  • Flex reconhece lexemas e retorna tokens.
  • Bison reconhece produções e dispara ações.
  • A AST preserva a estrutura relevante.
  • A tabela registra nomes, tipos e escopos.
Pipeline do código-fonte até AST e tabela de símbolos
símbolo CEDISCEDIS
6/33
Comparação entre árvore concreta e AST

Árvore concreta e AST não são a mesma coisa

A AST elimina detalhes sintáticos que não alteram o significado estrutural do programa.

  • Pontuação pode desaparecer.
  • Categorias intermediárias podem ser condensadas.
  • Operadores e relações relevantes permanecem.
símbolo CEDISCEDIS
7/33
atividade

Atividade 1 — Raiz da expressão

Qual operador ocupa a raiz da AST de a + b * 2?

  1. *
  2. +
  3. =
  4. id
QR Code para acesso à atividade
Parte 2

Árvore sintática abstrata

Uma estrutura hierárquica que representa o significado sintático essencial do programa.

símbolo CEDISCEDIS
9/33

O que uma AST precisa representar?

Expressões

Operadores, operandos e precedência.

Declarações

Tipo, identificador e inicialização.

Comandos

Atribuição, seleção, repetição e retorno.

Estruturas

Blocos, listas, funções e chamadas.

símbolo CEDISCEDIS
10/33

A precedência aparece na forma da AST

A árvore de a + b * 2 evidencia que a multiplicação é agrupada antes da soma.

  • Folhas representam valores ou identificadores.
  • Nós internos representam operações ou construções.
  • A forma da árvore orienta análises e geração de código.
AST da expressão a mais b vezes dois
símbolo CEDISCEDIS
11/33
atividade

Atividade 2 — O que a AST remove?

Qual elemento normalmente não precisa aparecer na AST de uma chamada de função?

  1. Nome da função
  2. Lista de argumentos
  3. Parênteses e vírgulas
  4. Expressões dos argumentos
QR Code para acesso à atividade
símbolo CEDISCEDIS
12/33

AST de uma declaração

Código-fonte

int soma = a + b * 2;

  • Declaração de variável
  • Tipo int
  • Identificador soma
  • Expressão inicializadora

Estrutura abstrata

  • Nó de declaração
  • Filho tipo: int
  • Filho identificador: soma
  • Filho expressão: + com subárvore *
símbolo CEDISCEDIS
13/33

Anatomia de um nó de AST

Categoria

Número, identificador, operação, declaração ou comando.

Dados

Valor, nome, operador, tipo ou posição no código.

Filhos

Referências para operandos, corpo, condição ou lista.

Anotações

Tipo inferido, símbolo resolvido ou informação de geração.

símbolo CEDISCEDIS
14/33

Tipos de nós para uma linguagem pequena

Folhas

NO_NUMERO e NO_IDENTIFICADOR.

Expressões

NO_OPERACAO e NO_CHAMADA.

Declarações

NO_DECLARACAO e NO_PARAMETRO.

Comandos

NO_ATRIBUICAO, NO_IF e NO_WHILE.

símbolo CEDISCEDIS
15/33

Travessias da AST

1

Pré-ordem

Processa o nó antes dos filhos.

2

Em ordem

Útil em árvores binárias de expressões.

3

Pós-ordem

Processa os filhos antes do nó.

4

Aplicação

Tipos, impressão, liberação e geração de código.

Parte 3

Tabela de símbolos

A estrutura que conecta nomes do programa às suas declarações e propriedades.

símbolo CEDISCEDIS
17/33

Por que precisamos de uma tabela de símbolos?

Declaração

Registrar identificadores e impedir redeclarações inválidas.

Uso

Confirmar que um nome foi declarado e está visível.

Tipos

Recuperar o tipo para verificar expressões e atribuições.

Geração

Associar endereços, deslocamentos ou informações de destino.

símbolo CEDISCEDIS
18/33

Informações de uma entrada

Identidade e contexto

  • Nome do símbolo
  • Categoria: variável, função ou parâmetro
  • Escopo de declaração
  • Linha ou posição de origem

Semântica e geração

  • Tipo declarado
  • Parâmetros e retorno
  • Estado de inicialização
  • Endereço ou deslocamento
símbolo CEDISCEDIS
19/33

Operações essenciais

1

Entrar no escopo

Criar ou ativar um novo contexto.

2

Inserir

Registrar a declaração no escopo atual.

3

Buscar

Consultar do escopo interno para o externo.

4

Sair do escopo

Descartar ou desativar o contexto local.

símbolo CEDISCEDIS
20/33

Estruturas de implementação

Tabela hash

Busca média rápida e implementação comum.

Pilha de tabelas

Uma tabela por escopo ativo.

Árvore de escopos

Preserva relações pai–filho.

Lista encadeada

Simples, mas menos eficiente em tabelas grandes.

símbolo CEDISCEDIS
21/33
Escopos global e local na tabela de símbolos

Escopos aninhados e ocultação

Uma declaração local pode ocultar temporariamente outra declaração com o mesmo nome em um escopo externo.

  • Busca começa no escopo atual.
  • Se não encontrar, sobe ao escopo pai.
  • Redeclaração deve ser avaliada no escopo correto.
símbolo CEDISCEDIS
22/33
atividade

Atividade 3 — Informação indispensável

Qual informação é indispensável para validar o uso de um identificador?

  1. Cor no editor
  2. Escopo da declaração
  3. Quantidade de espaços
  4. Extensão do arquivo
QR Code para acesso à atividade
símbolo CEDISCEDIS
23/33
atividade

Atividade 4 — Ordem da busca

Ao buscar um identificador, qual escopo deve ser consultado primeiro?

  1. Escopo global
  2. Primeiro escopo criado
  3. Escopo mais interno ativo
  4. Todos simultaneamente
QR Code para acesso à atividade
Parte 4

Integração no front-end

Ações do Bison constroem a AST; a análise semântica resolve símbolos e anota os nós.

símbolo CEDISCEDIS
25/33

Fluxo integrado do projeto

Os valores semânticos atravessam o parser e se transformam em nós conectados da AST.

  • Flex retorna tokens e yylval.
  • Bison reduz produções.
  • Ações criam nós da AST.
  • A análise semântica consulta símbolos.
Fluxo integrado entre Flex Bison AST e símbolos
símbolo CEDISCEDIS
26/33

%union, %token e %type

Valores dos tokens

  • NUM pode carregar um inteiro.
  • ID pode carregar uma string.
  • Flex atribui valores em yylval.

Valores dos não terminais

  • expr pode carregar NoAST*.
  • decl pode carregar NoAST*.
  • %type associa o campo correto da union.
símbolo CEDISCEDIS
27/33
Código Bison construindo nós da AST

Construção da AST em ações do Bison

Cada redução pode produzir um nó e devolver seu endereço como valor semântico da produção.

  • $$ representa o lado esquerdo.
  • $1, $2 e $3 representam símbolos do lado direito.
  • Os filhos formam a nova subárvore.
símbolo CEDISCEDIS
28/33
atividade

Atividade 5 — Valor de $$

Em uma ação do Bison, o que representa $$?

  1. Token produzido pelo Flex
  2. Valor semântico do lado esquerdo
  3. Primeiro símbolo da produção
  4. Tabela global de símbolos
QR Code para acesso à atividade
símbolo CEDISCEDIS
29/33

Erros identificados com essas estruturas

Não declarado

Uso de identificador ausente nos escopos visíveis.

Redeclaração

Novo símbolo incompatível no mesmo escopo.

Tipos incompatíveis

Operação ou atribuição entre tipos inválidos.

Uso prematuro

Leitura antes de inicialização ou definição.

símbolo CEDISCEDIS
30/33

Memória e ciclo de vida

Criar

Alocar nós e verificar falhas de malloc.

Possuir

Definir quem é responsável por cada string e nó.

Percorrer

Usar funções recursivas defensivas.

Liberar

Desalocar AST, símbolos e estruturas auxiliares.

símbolo CEDISCEDIS
31/33

Conexão com o projeto da equipe

Próximo incremento

  • Definir tipos mínimos de nós.
  • Criar funções construtoras.
  • Fazer o parser devolver a raiz.
  • Implementar tabela e escopos.

Materiais

  • GitHub: https://github.com/sergioaafreitas/COMP1
  • Vídeos: youtu.be/wINY109MG10
  • youtu.be/Dd3DWRpqI40
  • youtu.be/knV86FlSXJ8
símbolo CEDISCEDIS
32/33

Referências e materiais

  1. TREMBLAY, J. P.; SORENSON, P. G. Theory and Practice of Compiler Writing. Seções sobre árvores e tabelas de símbolos.
  2. WIRTH, N. Compiler Construction. Capítulos sobre parsing, símbolos e escopos.
  3. GNU Bison Manual. Semantic Values and Semantic Actions.
  4. Repositório da disciplina: https://github.com/sergioaafreitas/COMP1
  5. Material-base: Estruturas de dados e representação interna de código-fonte — Semana 6.
símbolo CEDISCEDIS
33/33

Síntese

A AST organiza o significado estrutural do programa; a tabela de símbolos resolve nomes, tipos e escopos. Juntas, sustentam a análise semântica e as etapas posteriores.

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