CEDIS | UnB

Construção de analisadores léxicos simples

Aula prática · Expressões regulares, Flex e primeiro scanner

Prof. Dr. Sergio Antônio Andrade de Freitas
FGA0003 - Compiladores 1 · Semana 02 · 2025/2
símbolo CEDIS logo UnB
símbolo CEDISCEDIS
2/29
Hoje, a teoria vira ferramenta: padrões regulares serão convertidos em um scanner que reconhece tokens.
FGA0003 - Compiladores 1
símbolo CEDISCEDIS
3/29

Objetivos da aula prática

  • Aplicar expressões regulares para identificar tokens.
  • Implementar um scanner simples em Flex.
  • Compilar e executar o analisador léxico.
  • Validar entradas corretas e caracteres inválidos.
  • Relacionar o scanner à etapa seguinte com Bison.
símbolo CEDISCEDIS
4/29

Roteiro da prática

  1. 01Retomar expressões regulares e tokens
  2. 02Construir o arquivo scanner.l
  3. 03Gerar e compilar o analisador léxico
  4. 04Testar entradas e tratar erros
  5. 05Preparar a integração com o parser
Parte 1

Da teoria à prática

Expressões regulares passam a reconhecer lexemas concretos

símbolo CEDISCEDIS
6/29
Fluxo de entrada, padrões, tokens e erros no scanner

Fluxo de um analisador léxico

  • Lê a entrada como sequência de caracteres.
  • Agrupa caracteres em lexemas.
  • Classifica lexemas como tokens.
  • Sinaliza símbolos inesperados.
símbolo CEDISCEDIS
7/29

Do padrão ao token

Uma expressão regular descreve o padrão; o lexema é o trecho encontrado; o token é a categoria enviada ao parser.

Expressão regular de identificador ligada ao lexema x1 e ao token ID
símbolo CEDISCEDIS
8/29
atividade

Expressão regular de identificador

Qual cadeia é reconhecida por [a-zA-Z_][a-zA-Z0-9_]* como identificador?

  1. valor_2
  2. 2valor
  3. valor-final
  4. valor final
QR Code para acesso à atividade
Parte 2

Construindo o scanner.l

A especificação léxica será escrita de forma incremental

símbolo CEDISCEDIS
10/29
Arquivo scanner.l dividido em definições, regras e código auxiliar

Estrutura do arquivo Flex

  • Definições: código C e macros.
  • Regras: padrão e ação.
  • Código auxiliar: funções complementares.
símbolo CEDISCEDIS
11/29

Cabeçalho recomendado no código

  • /* FGA0003 - Compiladores 1 */
  • /* Curso de Engenharia de Software */
  • /* Universidade de Brasília (UnB) */
  • /* Aula prática: analisador léxico simples com Flex */
símbolo CEDISCEDIS
12/29

Primeiros tokens do scanner

Identificadores

nomes de variáveis e símbolos definidos pelo programador

Números inteiros

sequências de dígitos como 10, 42 e 2025

Operadores

símbolos como +, -, *, / e =

Espaços

caracteres ignorados pelo scanner

Inválidos

qualquer caractere que não pertença às regras esperadas

símbolo CEDISCEDIS
13/29

Regra léxica: padrão e ação

Padrão

  • [0-9]+
  • [a-zA-Z_][a-zA-Z0-9_]*
  • [ ]+
  • .

Ação

  • return NUM;
  • return ID;
  • ignorar espaços
  • reportar caractere inválido
símbolo CEDISCEDIS
14/29
atividade

Padrão e ação no Flex

Em uma regra do Flex, o que fica à esquerda e o que fica entre chaves?

  1. À esquerda fica o padrão; entre chaves fica a ação executada.
  2. À esquerda fica o token; entre chaves fica a expressão regular.
  3. À esquerda fica o código C principal; entre chaves fica o Makefile.
  4. À esquerda fica o parser; entre chaves fica o arquivo de entrada.
QR Code para acesso à atividade
Parte 3

Gerar, compilar e executar

A especificação agora vira um programa executável

símbolo CEDISCEDIS
16/29

Pipeline de construção

  • flex scanner.l gera lex.yy.c.
  • gcc compila o C gerado.
  • -lfl liga a biblioteca do Flex.
  • ./scanner executa o reconhecedor.
Pipeline de construção do scanner com Flex e GCC
símbolo CEDISCEDIS
17/29

Comandos mínimos da prática

1

Gerar C

flex scanner.l

2

Compilar

gcc -o scanner lex.yy.c -lfl

3

Executar

./scanner

4

Testar entrada

digite x1 = 10 + 2

5

Encerrar entrada

Ctrl+D no Linux/WSL

símbolo CEDISCEDIS
18/29
atividade

Ordem de construção

Qual sequência descreve corretamente a construção do scanner?

  1. scanner.l → flex → lex.yy.c → gcc → executável
  2. scanner.l → gcc → flex → executável → lex.yy.c
  3. lex.yy.c → scanner.l → ./scanner → flex
  4. parser.y → bison → lex.yy.c → scanner.l
QR Code para acesso à atividade
Parte 4

Testar e ajustar

Um scanner só é confiável quando reconhece casos válidos e rejeita casos inválidos

símbolo CEDISCEDIS
20/29
Ciclo de escrever regra, compilar, testar, ajustar e versionar

Ciclo de validação do scanner

  • Teste entradas válidas e inválidas.
  • Faça incrementos pequenos.
  • Documente o comportamento observado.
  • Versione cada avanço funcional.
símbolo CEDISCEDIS
21/29

Tratamento de erros léxicos

Regra final

. captura qualquer caractere não reconhecido.

Mensagem

deve indicar o lexema inesperado.

Diagnóstico

linha e coluna podem ser incluídas em versões futuras.

Continuação

o scanner pode continuar após sinalizar o erro.

símbolo CEDISCEDIS
22/29
atividade

Caractere inválido

Qual é o papel típico da regra . { ... } no final de um scanner Flex?

  1. Capturar caracteres não reconhecidos pelas regras anteriores.
  2. Reconhecer apenas números inteiros positivos.
  3. Ignorar todos os identificadores válidos.
  4. Substituir a necessidade de expressões regulares.
QR Code para acesso à atividade
Parte 5

Conexão com o parser

O scanner será a entrada da análise sintática nas próximas aulas

símbolo CEDISCEDIS
24/29

Flex hoje, Bison em seguida

Scanner com Flex

  • lê caracteres
  • reconhece lexemas
  • retorna tokens
  • implementa yylex()

Parser com Bison

  • recebe tokens
  • aplica a gramática
  • detecta erros sintáticos
  • constrói estruturas internas
símbolo CEDISCEDIS
25/29
atividade

Integração com Bison

Na integração Flex+Bison, qual função gerada pelo Flex fornece tokens ao parser?

  1. yylex()
  2. yyparse()
  3. main()
  4. printf()
QR Code para acesso à atividade
símbolo CEDISCEDIS
26/29

Tarefa prática da aula

1

1. Criar

scanner.l com cabeçalho institucional e regras mínimas.

2

2. Compilar

gerar lex.yy.c e produzir o executável scanner.

3

3. Testar

validar identificadores, números, operadores e inválidos.

4

4. Documentar

atualizar README com comandos e exemplos.

5

5. Versionar

fazer commit e push no repositório da equipe.

símbolo CEDISCEDIS
27/29

Evidências esperadas ao final

Código

scanner.l versionado no repositório.

Execução

comandos para gerar e rodar o scanner.

Testes

entradas válidas e inválidas registradas.

README

instruções claras para outro integrante reproduzir.

símbolo CEDISCEDIS
28/29

Referências

  1. Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2007). Compilers: Principles, Techniques, and Tools (2nd ed.). Pearson.
  2. Free Software Foundation. (2024). flex: The fast lexical analyser. GNU documentation.
  3. Free Software Foundation. (2025). GNU Bison manual. GNU documentation.
  4. Tremblay, J. P., & Sorenson, P. G. (2008). The theory and practice of compiler writing. BS Publications.
  5. Wirth, N. (2005). Compiler construction. ETH Zürich.
símbolo CEDISCEDIS
29/29

Próximo passo

Na próxima prática, o scanner será conectado ao parser para reconhecer estruturas sintáticas da linguagem do projeto.

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