O que você vai aprender
Diferenciar AFD e AFN e seus papéis.
Entender a conversão ER → AFN → AFD → scanner.
Traçar a execução de um autômato sobre uma entrada.
Reconhecer o papel de geradores como Lex/Flex.
Da regra ao programa
Na aula anterior, especificamos tokens com expressões regulares. Mas uma ER é uma descrição, não um programa. Como transformá-la em código que de fato lê caracteres e reconhece tokens?
A resposta são os autômatos finitos: máquinas de estados que executam o reconhecimento. Esta aula mostra a ponte entre a teoria (ER) e a implementação (código do scanner).
O que veremos nesta aula
- O que é um autômato finito e seus componentes.
- A diferença entre versões determinística e não determinística.
- O caminho da ER ao código do scanner.
- Como ferramentas reais automatizam isso.
Autômato finito
Formalmente é uma quíntupla (Q, Σ, δ, q0, F): estados Q, alfabeto Σ, função de transição δ, estado inicial q0 e estados finais F.
Como o autômato reconhece
O autômato começa no estado inicial e, lendo a entrada caractere por caractere, segue a transição correspondente. Ao terminar a entrada, se estiver num estado de aceitação, a cadeia é aceita.
Para um scanner, "aceitar" significa "reconheci um token": o autômato emite o token e recomeça do estado inicial para o próximo lexema.
AFD de identificador
O autômato que reconhece identificadores (letra seguida de letras/dígitos) tem dois estados úteis:
| Estado | Lê letra | Lê dígito | Aceita? |
|---|---|---|---|
| INICIAL | → DENTRO | (erro) | não |
| DENTRO | → DENTRO | → DENTRO | sim |
Começa em INICIAL; a primeira letra leva a DENTRO; daí em diante, letras e dígitos mantêm em DENTRO, que é estado de aceitação.
Passo a passo: reconhecendo "a1"
AFD e AFN
AFN. Autômato finito não determinístico: pode haver zero, uma ou várias transições por símbolo, e transições ε (sem consumir entrada).
Por que existem os dois
O AFN é fácil de construir a partir de uma expressão regular, mas difícil de executar (precisa explorar várias alternativas ao mesmo tempo). O AFD é o contrário: trabalhoso de montar, mas trivial e rápido de executar.
Decidido × indeciso
AFD × AFN
| AFD (determinístico) | AFN (não determinístico) | |
|---|---|---|
| Transição por símbolo | No máximo uma | Zero, uma ou várias (e ε) |
| Transições ε | Não | Sim |
| Execução | Direta e rápida | Explora alternativas |
| Construção a partir da ER | Indireta | Direta (Thompson) |
| Uso típico | Implementação do scanner | Etapa intermediária |
Da expressão regular ao scanner
Thompson→AFD
subconjuntos→AFD mínimo→Código
Cada seta é um algoritmo clássico: Thompson constrói o AFN; a construção de subconjuntos determiniza; a minimização reduz estados.
Os três algoritmos do pipeline
- Thompson (ER → AFN): monta o AFN composicionalmente, com transições ε ligando os pedaços.
- Construção de subconjuntos (AFN → AFD): cada estado do AFD é um conjunto de estados do AFN simultaneamente ativos.
- Minimização (AFD → AFD mínimo): funde estados equivalentes, gerando o menor autômato que reconhece a mesma linguagem.
Verifique você mesmo: AFD ou AFN?
Um autômato em que o estado q0, lendo 'a', pode ir tanto para q1 quanto para q2 é:
Lex e Flex
Ferramentas como Lex e Flex automatizam todo o pipeline desta aula. Você fornece as expressões regulares e ações; elas geram o código C do scanner.
Confusões sobre autômatos
Outro engano: achar que o AFD equivalente sempre tem o mesmo número de estados do AFN. Em geral tem mais (no pior caso, exponencialmente mais).
Implementando o scanner
Reflita: ER e AFD são equivalentes?
Toda expressão regular tem um AFD equivalente, e todo AFD tem uma ER equivalente?
Termos-chave da aula
Onde isto se encaixa no curso
Esta aula fecha o estudo do léxico:
- Vem da aula 3: as ER que especificam os tokens.
- Concretiza a aula 2: autômatos finitos são o reconhecedor do tipo 3 (regular).
- Prepara a aula 5: a sintaxe, tipo 2, precisará de um reconhecedor mais poderoso (autômato com pilha).
Resumo visual
Experimente pensando em estados
Use novamente o playground léxico, agora com olhar de autômato: a cada caractere digitado, pergunte-se em que estado o reconhecedor estaria. Quando ele "aceita" e emite um token? Quando rejeita?
Acompanhar a tokenização caractere a caractere é a melhor forma de internalizar como um AFD percorre o texto.
Atividade em grupo · Desenhando o autômato
Em grupos, desenhem no papel/quadro o AFD que reconhece números reais.
Roteiro
- Padrão alvo: dígito+ ( . dígito+ )? (ex.: 12, 3.14).
- Desenhem os estados e transições; marquem os estados de aceitação.
- Tracem a execução para "3.14" e para a entrada inválida "3." (ponto sem dígito).
- Confiram que o estado de aceitação não é atingido por "3.".
Mini-quiz · Aula 4
20 questões sobre esta aula. Escolha e veja a explicação na hora.
📌 Resumo — leve isto para a prova
- Um autômato finito é (Q, Σ, δ, q0, F): estados, alfabeto, transições, inicial e finais.
- AFD: no máximo uma transição por símbolo, rápido. AFN: várias e ε, fácil de construir.
- Pipeline ER→AFN→AFD→código (Thompson, subconjuntos, minimização).
- ER, AFN e AFD descrevem a mesma classe: as linguagens regulares.
- Lex/Flex automatizam a geração do analisador léxico.