CEDIS | Universidade de Brasília (UnB)

Projeto inicial do compilador: fase léxica

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

Prof. Dr. Sergio Antônio Andrade de Freitas
Curso de Engenharia de Software · 2026
símbolo CEDIS logo UnB
símbolo CEDISCEDIS
2/20

Objetivos e entrega esperada

01

Definir

Selecionar os tokens essenciais da linguagem da equipe.

02

Implementar

Criar ou adaptar o arquivo scanner.l usando Flex.

03

Testar

Executar entradas válidas, inválidas e casos-limite.

04

Documentar

Atualizar README, testes e histórico do repositório.

símbolo CEDISCEDIS
3/20

Roteiro de laboratório

  1. 01Preparar o repositório e confirmar as ferramentas
  2. 02Definir o catálogo mínimo de tokens
  3. 03Implementar as regras no scanner.l
  4. 04Gerar, compilar e executar o scanner
  5. 05Testar, corrigir e ampliar as regras
  6. 06Documentar, versionar e demonstrar
Etapa 1

Preparação do laboratório

Abra o repositório, confirme o ambiente e organize o projeto antes de editar o scanner.

símbolo CEDISCEDIS
5/20

Acesse o código-base da disciplina

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

  • Localize a pasta correspondente à Semana 03.
  • Copie ou adapte o exemplo scanner.l ao repositório da equipe.
  • Preserve a autoria e registre as alterações realizadas.
Estrutura mínima do projeto e acesso ao GitHub da disciplina
símbolo CEDISCEDIS
6/20

Confirme as ferramentas e a estrutura

Verificação do ambiente

  • flex --version
  • gcc --version
  • git --version
  • Todos os comandos devem responder sem erro.

Estrutura recomendada

  • src/scanner.l
  • tests/exemplo.txt
  • README.md
  • Makefile opcional nesta etapa.

Se alguma ferramenta não estiver disponível, corrija o ambiente antes de prosseguir.

Etapa 2

Definição dos tokens

Antes de escrever expressões regulares, determine o que a linguagem precisa reconhecer.

símbolo CEDISCEDIS
8/20

Catálogo mínimo de tokens

ID

Identificadores

Nomes de variáveis, funções e outros elementos nomeados.

10

Literais

Números inteiros e outros valores previstos pela linguagem.

KW

Palavras-chave

Exemplos: if, while, return e tipos primitivos.

+

Operadores

Aritméticos, relacionais e de atribuição.

{}

Delimitadores

Parênteses, chaves, vírgulas e ponto e vírgula.

!

Ignorados e erros

Espaços, comentários e caracteres não reconhecidos.

símbolo CEDISCEDIS
9/20
Fluxo do código-fonte pelo Flex até a sequência de tokens

Da entrada aos tokens

  • O Flex reconhece padrões descritos por expressões regulares.
  • Cada padrão executa uma ação associada.
  • A saída deve ser consistente com o parser que será construído com Bison.
Etapa 3

Implementação em Flex

Crie regras pequenas, compile com frequência e mantenha uma entrada de teste reproduzível.

símbolo CEDISCEDIS
11/20

Organize corretamente o scanner.l

  • Declarações C e cabeçalhos ficam entre %{ e %}.
  • As regras léxicas ficam entre os dois separadores %%.
  • Funções auxiliares ficam após o segundo separador.
Três seções do arquivo scanner.l
símbolo CEDISCEDIS
12/20
Exemplo inicial de scanner em Flex com cabeçalho institucional

Use um ponto de partida pequeno

  • Comece com poucas regras e confirme cada saída.
  • Coloque operadores mais específicos antes dos mais gerais.
  • Mantenha uma regra final para caracteres inválidos.
símbolo CEDISCEDIS
13/20

Gerar, compilar e executar

1

Gerar

flex src/scanner.l

2

Compilar

gcc -Wall -Wextra -o scanner lex.yy.c -lfl

3

Executar

./scanner

4

Usar arquivo

./scanner < tests/exemplo.txt

símbolo CEDISCEDIS
14/20

Trabalhe em ciclos curtos

  • Altere uma categoria de token por vez.
  • Regere e recompile após cada mudança relevante.
  • Quando um teste falhar, isole a regra responsável.
Ciclo editar, executar Flex, compilar e testar
Etapa 4

Testes e refinamento

Valide tokens isolados, pequenos comandos, comentários e entradas inválidas.

símbolo CEDISCEDIS
16/20

Execute testes progressivos

A

1. Identificadores

x · contador · _flag · x1

B

2. Números

0 · 10 · 2048

C

3. Expressões

x = 10 · x1 = x1 + 2

D

4. Programa curto

Use if, while, chaves e operadores da linguagem.

E

5. Entrada inválida

Inclua @ ou outro símbolo não previsto.

símbolo CEDISCEDIS
17/20

Trate comentários e erros léxicos

Comentários

  • Implemente primeiro // até o fim da linha.
  • Adicione comentários de bloco apenas após o mínimo funcionar.
  • Confirme que o conteúdo comentado não gera tokens.

Caracteres inválidos

  • Mantenha a regra . como última alternativa.
  • Mostre o lexema problemático com yytext.
  • Registre linha ou contexto se a equipe já tiver esse controle.

Evite regras genéricas que silenciem entradas incorretas.

símbolo CEDISCEDIS
18/20

Documentar, versionar e demonstrar

1

README

Explique dependências, comandos, tokens e decisões.

2

Revisar

Execute git status e confirme arquivos gerados que não devem ser versionados.

3

Publicar

git add . · git commit · git push

4

Demonstrar

Mostre uma entrada válida e uma inválida funcionando.

símbolo CEDISCEDIS
19/20

Referências e recursos da aula

  1. Freitas, S. A. A. Projeto inicial do compilador: fase léxica. Material da Semana 3, FGA0003 — Compiladores 1, Universidade de Brasília.
  2. Repositório da disciplina e códigos das aulas práticas: https://github.com/sergioaafreitas/COMP1
  3. GNU Project. Flex — The Fast Lexical Analyzer. Documentação técnica.
  4. Wirth, N. Compiler Construction. Seção sobre scanner e análise léxica.
  5. Tremblay, J. P., & Sorenson, P. G. Theory and Practice of Compiler Writing.
símbolo CEDISCEDIS
20/20

Entrega da aula: scanner funcional

Conclua com código versionado, testes reproduzíveis, README atualizado e demonstração do reconhecimento de tokens. Códigos da disciplina: https://github.com/sergioaafreitas/COMP1

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