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.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Validar com uma máquina: a entrada como autômato.
Os objetivos desta aula. 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.
Veja o essencial, parte por parte.
Ler caractere por caractere através de estados. Validar com autômato é ler a entrada símbolo por símbolo, mudando de estado a cada um.
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.
Aceitação, rejeição e a armadilha. Aceitar um estado intermediário por engano, deixando passar entradas curtas demais.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.
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.