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

Construção da AST e da tabela de símbolos

FGA0003 — Compiladores 1 · Semana 6 · Aula prática

Prof. Sergio Antônio Andrade de Freitas
Curso de Engenharia de Software · Universidade de Brasília · 2026
símbolo CEDIS logo UnB
símbolo CEDISCEDIS
2/30

Produto esperado da aula

01

Construir

Gerar nós de AST durante as reduções do Bison.

02

Registrar

Inserir declarações na tabela de símbolos.

03

Imprimir

Visualizar AST e tabela após processar um programa curto.

04

Preparar

Criar base para a análise semântica da próxima sprint.

símbolo CEDISCEDIS
3/30

Roteiro de laboratório

  1. 01Inspecionar o código da Semana 6 no GitHub
  2. 02Compilar e executar a linha de base
  3. 03Melhorar o modelo da AST
  4. 04Atualizar a tabela de símbolos
  5. 05Integrar lexer, parser, AST e tabela
  6. 06Testar, documentar e publicar
seção

Ponto de partida

O que já existe no GitHub

símbolo CEDISCEDIS
5/30

Código existente e limites

Já existe

  • lexer.l e parser.y
  • ast.c e ast.h
  • tabela.c e tabela.h
  • tipos.h e Makefile

Precisa evoluir

  • AST sem tipos explícitos
  • Tabela apenas global
  • Declaração e uso misturados
  • Pouca gestão de memória

Repositório oficial: https://github.com/sergioaafreitas/COMP1

símbolo CEDISCEDIS
6/30

Raio X do compilador

  • Lexer produz tokens.
  • Bison reduz regras.
  • Ações semânticas constroem nós.
  • Declarações alimentam a tabela.
Fluxo código, lexer, parser, AST e tabela
símbolo CEDISCEDIS
7/30

Entrada e saída esperadas

Entrada

int a = 10; int b = 20; int soma = a + b * 2;

Saída

  • AST hierárquica do programa
  • Tabela com a, b e soma
  • Tipos e linhas registrados
  • Precedência preservada
símbolo CEDISCEDIS
8/30

Checkpoint inicial

git

1. Atualizar

git pull

cd

2. Entrar

cd "semana 06/src"

make

3. Compilar

make clean && make

run

4. Executar

printf "a + b - 2\n" | ./parser

seção

Parte 1

Melhorar a AST

símbolo CEDISCEDIS
10/30
Transformação de árvore concreta em AST

Da árvore concreta à AST

  • A árvore concreta reflete a gramática.
  • A AST reflete o significado estrutural.
  • A precedência deve aparecer na hierarquia.
símbolo CEDISCEDIS
11/30

Limitações da AST atual

!

Caracteres mágicos

Usar espaços, i, + ou - como tipo dificulta evolução.

N

Poucas categorias

Expressões funcionam, mas declarações e comandos ficam frágeis.

L

Sem linha de origem

Diagnósticos posteriores ficam menos precisos.

M

Sem liberação

A AST deve ter função de desalocação.

símbolo CEDISCEDIS
12/30

Anatomia de um nó

  • tipo identifica a categoria do nó;
  • texto guarda identificadores;
  • filhos representam a estrutura;
  • proximo encadeia comandos.
Campos de um nó de AST
símbolo CEDISCEDIS
13/30

Tipos explícitos de nós

Enum mínimo

AST_PROGRAMA AST_DECLARACAO AST_NUMERO AST_IDENTIFICADOR

Operações

AST_SOMA AST_SUBTRACAO AST_MULTIPLICACAO AST_DIVISAO

símbolo CEDISCEDIS
14/30

Funções de criação

1

Número

ast_criar_numero(valor, linha)

2

Identificador

ast_criar_identificador(nome, linha)

3

Operação

ast_criar_operacao(tipo, esq, dir, linha)

4

Declaração

ast_criar_declaracao(nome, inicializacao, linha)

símbolo CEDISCEDIS
15/30
Redução no Bison produzindo nó de AST

Redução do Bison criando um nó

  • $1 e $3 são subárvores já reconhecidas.
  • $$ é a subárvore produzida pela regra.
  • A ação semântica roda durante a redução.
símbolo CEDISCEDIS
16/30

Impressão e liberação da AST

AST

Imprimir

ast_imprimir(raiz, nivel) deve mostrar a hierarquia.

Identar

Use o nível para gerar uma saída legível.

free

Liberar

ast_liberar(raiz) deve percorrer filhos e lista.

ok

Testar

Compare a saída com a árvore esperada.

seção

Parte 2

Construir a tabela de símbolos

símbolo CEDISCEDIS
18/30

Tabela de símbolos

  • Declarações inserem símbolos.
  • Usos de identificadores consultam símbolos.
  • Aula de hoje usa apenas escopo global.
Tabela de símbolos com nome, categoria, tipo, escopo e linha
símbolo CEDISCEDIS
19/30

Limitações da tabela atual

Atual

  • nome
  • tipo
  • lista global
  • duplicidade ignorada

Melhorar para

  • categoria
  • tipo enumerado
  • escopo
  • linha de declaração
  • retorno de erro
símbolo CEDISCEDIS
20/30

Operações da tabela

find

Buscar

tabela_buscar(nome, escopo)

add

Inserir

tabela_inserir(nome, categoria, tipo, escopo, linha)

print

Imprimir

tabela_imprimir() para verificar o resultado.

free

Liberar

tabela_liberar() antes de encerrar.

seção

Parte 3

Integrar lexer, parser, AST e tabela

símbolo CEDISCEDIS
22/30

Alterações no lexer

Novos tokens

  • "int" → INT
  • "=" → ASSIGN
  • ";" → SEMICOLON
  • operadores e parênteses

Valores semânticos

  • NUM preenche valor_inteiro
  • ID preenche texto
  • %option yylineno
  • "int" antes de ID
símbolo CEDISCEDIS
23/30

Alterações no parser

Declarações Bison

  • %union com int, char* e NoAST*
  • %token <valor_inteiro> NUM
  • %token <texto> ID
  • %type <no> expr e declaracao

Regras novas

  • programa
  • lista_comandos
  • declaracao
  • expr
  • precedência de +, -, *, /
símbolo CEDISCEDIS
24/30

Construção durante as reduções

1

Reduz NUM

cria nó AST_NUMERO.

2

Reduz ID

cria nó AST_IDENTIFICADOR.

3

Reduz operação

combina subárvores esquerda e direita.

4

Reduz declaração

insere símbolo e cria nó AST_DECLARACAO.

símbolo CEDISCEDIS
25/30

Compilação e testes

01

Compilar

make clean && make

02

Expressões

./parser < tests/01-expressoes.comp1

03

Declarações

./parser < tests/02-declaracoes.comp1

04

Precedência

./parser < tests/03-precedencia.comp1

símbolo CEDISCEDIS
26/30

Níveis de conclusão

1

Essencial

AST de números, identificadores e operações, com impressão hierárquica.

2

Esperado

Declarações, tabela de símbolos e testes versionados.

3

Avançado

Duplicidade, linha de origem, liberação completa e preparação para escopos.

símbolo CEDISCEDIS
27/30

Checklist de entrega

A

AST

Nós tipados e impressão hierárquica.

T

Tabela

Nome, categoria, tipo, escopo e linha.

B

Integração

Bison construindo AST e inserindo símbolos.

Q

Qualidade

-Wall -Wextra, testes, README e commit.

seção

Próxima etapa

Da representação interna à validação semântica

símbolo CEDISCEDIS
29/30

Materiais e referências

  1. Repositório da disciplina: https://github.com/sergioaafreitas/COMP1
  2. Código da Semana 6: lexer.l, parser.y, ast.c, ast.h, tabela.c, tabela.h e tipos.h.
  3. WIRTH, N. Compiler Construction. Capítulos sobre parsing, árvores e análise semântica.
  4. TREMBLAY, J. P.; SORENSON, P. G. Theory and Practice of Compiler Writing. Seções sobre árvores e tabelas de símbolos.
símbolo CEDISCEDIS
30/30

Encerramento

Ao final da prática, o compilador da equipe deve começar a enxergar por dentro: AST para estrutura e tabela de símbolos para nomes declarados. Repositório: https://github.com/sergioaafreitas/COMP1

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