Módulo 12 - Máquinas de estado: estados, transições e eventos

Validar com uma máquina: a entrada como autômato

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

O que você vai aprender

  • Validar uma entrada percorrendo estados, símbolo por símbolo.
  • Entender a ligação entre validação e o conceito de autômato.
  • Identificar estados de aceitação e estados de rejeição.
  • Achar bugs em transições que aceitam entradas erradas.

Ler caractere por caractere através de estados

Imagine validar um código simples: ele precisa começar com uma letra e depois ter só dígitos, como A417. Dá para fazer isso com if empilhados, mas fica confuso e cheio de casos de borda. O autômato oferece um caminho mais organizado. Você define estados que descrevem por onde a leitura está: início, letra lida, dígito lido, formato quebrado. Aí lê o texto um caractere de cada vez. Cada caractere é um evento que dispara uma transição para o estado que corresponde ao que foi visto até ali. Quando o texto acaba, a pergunta é uma só: em que estado paramos? Se for um estado de aceitação, o código é válido.

O que torna isso elegante é que a complexidade fica toda nas transições, e não numa cascata de condições. Estando no estado início, se o caractere for uma letra, vá para letra lida; se for qualquer outra coisa, vá para o estado de rejeição. Estando em letra lida ou em dígito lido, se o caractere for um dígito, vá para dígito lido; senão, rejeite. O estado de rejeição é uma armadilha: uma vez nele, qualquer caractere seguinte o mantém ali, porque o formato já quebrou. No final, aceitar só o estado dígito lido garante que houve uma letra seguida de pelo menos um dígito.

Diagrama de autômato com quatro estados em fila: Início, Letra lida, Dígito lido e Rejeição. Uma seta de Início para Letra lida é rotulada 'letra'. Uma seta de Letra lida para Dígito lido é rotulada 'dígito'. Um laço em Dígito lido rotulado 'dígito' indica que mais dígitos mantêm o estado. Setas rotuladas 'outro' levam de Início e de Letra lida para Rejeição, um estado com laço próprio que absorve qualquer caractere. O estado Dígito lido tem contorno duplo, indicando estado de aceitação.
Autômato que valida uma letra seguida de dígitos. O contorno duplo marca o estado de aceitação; Rejeição é uma armadilha.

O código do validador

Traduzir o diagrama em código é quase mecânico, e essa é outra vantagem do autômato: o desenho vira o programa quase linha a linha. Você guarda o estado atual numa variável, começa no estado inicial e percorre o texto com um laço. Dentro do laço, um bloco de decisões consulta o estado atual e o caractere da vez para escolher o próximo estado, exatamente a tabela de transições em forma de código. Depois do laço, uma única comparação decide o veredito: o estado final é de aceitação? Repare que não há retorno no meio do laço; a leitura vai até o fim e a decisão fica para depois, o que deixa a lógica previsível.

// valida: uma letra seguida de um ou mais digitos
estado <- 'inicio'
para cada c em texto faça
  se estado = 'inicio' e ehLetra(c) então
    estado <- 'letra'
  senão se estado = 'letra' e ehDigito(c) então
    estado <- 'digito'
  senão se estado = 'digito' e ehDigito(c) então
    estado <- 'digito'
  senão
    estado <- 'rejeicao'
  fim
fim
// aceita apenas se terminou em 'digito'
valido <- (estado = 'digito')
escreva(valido)

O estado atual e o caractere da vez decidem o próximo estado. No fim, só o estado de aceitação (digito) vale como válido.

🎮 Jogo da aula

O validador que aceita demais

Este autômato deveria exigir uma letra seguida de dígitos, mas aceita entradas que começam com dígito. Toque na linha do bug.

Aceitação, rejeição e a armadilha

Dois detalhes fazem o validador ser correto de verdade. O primeiro é escolher com cuidado o estado de aceitação. No exemplo, aceitar o estado dígito garante que houve uma letra e ao menos um dígito; se aceitássemos também o estado letra, um texto de uma letra só passaria, o que não é o padrão pedido. O segundo é o estado de rejeição funcionar como armadilha: uma vez que o formato quebrou, nenhum caractere seguinte deve consertar. Sem essa armadilha, uma entrada como A4X7 poderia ser salva pelo 7 no final, mesmo tendo um X no meio. Autômato bem feito é aquele em que o erro, uma vez cometido, não tem volta.

Teste rápido

Ao validar um texto com um autômato de estados, como se decide se a entrada é válida?

Perguntas frequentes

O que um autômato tem a ver com máquina de estado?
Um autômato é uma máquina de estado usada para reconhecer padrões numa sequência de símbolos. A ideia é a mesma da catraca e do semáforo: estados, eventos e transições. A diferença é o uso: aqui o evento é ler o próximo caractere, e o objetivo é decidir, pelo estado final, se o texto segue o formato esperado.
O que é um estado de aceitação?
É o estado (ou estados) em que a máquina deve terminar para a entrada ser considerada válida. Depois de ler o texto inteiro, se você parou num estado de aceitação, o texto casa com o padrão. Escolher o estado de aceitação errado é uma fonte comum de bug, porque pode deixar passar entradas incompletas.
Por que o estado de rejeição precisa ser uma armadilha?
Porque, uma vez que o formato quebrou, nenhum caractere seguinte deveria consertar a entrada. Se o estado de rejeição não retém, um símbolo válido no final pode mascarar um erro no meio, como o A4X7 sendo aceito por causa do 7. A armadilha garante que o erro, uma vez cometido, permaneça até o fim da leitura.
Isso substitui as expressões regulares?
As expressões regulares são, por baixo, autômatos como este; elas são uma forma compacta de descrever o mesmo tipo de padrão. Escrever o autômato à mão ajuda a entender o que a expressão regular faz por dentro e é útil quando o padrão é simples ou quando você quer controle total. Para validações complexas do dia a dia, a expressão regular costuma ser mais prática.
Por que não decidir válido no meio do laço?
Porque o veredito depende de ter lido o texto inteiro. Decidir cedo pode aceitar um prefixo válido ignorando lixo que vem depois, ou rejeitar antes da hora. O padrão seguro é percorrer todos os caracteres atualizando o estado e só depois, fora do laço, olhar o estado final. Assim o resultado reflete o texto completo.
Dá para validar formatos maiores com esse método?
Dá, e é justamente para isso que o método brilha. Datas, códigos, números de telefone e vários formatos podem ser descritos como um autômato com mais estados e transições. Quanto mais complexo o formato, mais estados aparecem, mas o esqueleto continua o mesmo: ler símbolo por símbolo e checar o estado final. A clareza compensa o desenho inicial.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.