/*Esse programa implementa um autômato que reconhece uma série de caracteres que representam os números reais. *Sintaxe: * números aceitos: 0 - 9; * Símbolos aceitos: "-", ".", "E"; * *O Autômato reconhece números iniciados ou terminados por "." *O sinal de "+" é implícito. *O Expoente do número reconhecido pelo autômato pode ser negativo e/ou decimal. */ import javax.swing.JOptionPane; public class AutomatoReais { public static void main(String[] args) { int estado, indice; String input; char simbol; /* Agora a declaração do array. * Abaixo, estão os valores da tabela de transição para o autômato descrito. * O valor -99 é o inteiro que refere ao estado de erro. * O valor 0 é o inteiro que refere ao Estado Final. */ int tabEstados[][] = { {-99, -99, -99, -99, -99}, { 3, 2, 4, -99, -99}, {-99, 2, 5, 6, 0}, {-99, 2, 4, -99, -99}, {-99, 5, -99, -99, -99}, {-99, 5, -99, 6, 0}, { 7, 8, 9, -99, -99}, {-99, 8, 9, -99, -99}, {-99, 8, 10, -99, 0}, {-99, 10, -99, -99, -99}, {-99, 10, -99, -99, 0} }; /* A primeira linha do Array tabEstados está preenchida com "estados de erro * para que os indices das linhas coincidam com os indices dos estados: linha 1, estado 1. * O estado 1 (linha 1) é o estado inicial. */ JOptionPane.showMessageDialog(null, "Esse Automato reconhece numeros reais.\n\nSua sintaxe é:\n Digito: 0 - 9\n Operadores: -, E, . (pt decimal)\n\nO reconhecimento de um numero positivo está implícito, sem necessidade de acréscimo de sinal."); input = JOptionPane.showInputDialog("Informe a sequencia de digitos que compoe seu numero real."); input += "%"; indice = 0; //essa variável é para auxiliar a leitura da cadeia de entrada. JOptionPane.showMessageDialog (null, "Essa foi é a string informada, com o marcador de final de cadeia: " + "'" + input + "'" ); simbol = input.charAt(indice); System.out.println(simbol); estado = 1; /*A partir daqui temos os testes para validar a entrada * Note que na tabela anterior, temos: * Linhas = estados (linha 1, estado Q1; linha 2, estado Q2 etc). * Colunas = símbolos: * 0 = hífen * 1 = dígito * 2 = ponto * 3 = E * 4 = Final de Cadeia. */ while (simbol !='%') { switch (simbol) { case '-' : estado = tabEstados[estado][0]; case '.' : estado = tabEstados[estado][2]; case 'E' : estado = tabEstados[estado][3]; case '0' : estado = tabEstados[estado][1]; case '1' : estado = tabEstados[estado][1]; case '2' : estado = tabEstados[estado][1]; case '3' : estado = tabEstados[estado][1]; case '4' : estado = tabEstados[estado][1]; case '5' : estado = tabEstados[estado][1]; case '6' : estado = tabEstados[estado][1]; case '7' : estado = tabEstados[estado][1]; case '8' : estado = tabEstados[estado][1]; case '9' : estado = tabEstados[estado][1]; System.out.println (estado); } if (estado == -99) break; if (estado == 0) break; indice++; simbol = input.charAt(indice); } if (simbol == '%') { if (tabEstados[estado][4] == -99) System.out.println ("Fudeu"); if (tabEstados[estado][4] == 0) System.out.println ("Deu!!"); } } }