/*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!!");
}
}
}