/** * */ package exercicios.johann; import exercicios.johann.*; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.io.StringReader; import java.io.FileReader; import java.io.FileWriter; /** * Programa Analisador Lexico * * @author carapan * */ public class AnalisadorLexico { public enum TipoEstado { EINICIO, ECOMENTARIO, ERESERVADA, ENUM, EFIM,EOPERADOR } public void executar(InputStream in) throws IOException { Reader reader = new InputStreamReader(in); executar(reader); } private void executar(Reader reader) throws IOException { Gravador saida = new Gravador(); boolean primeiraLeitura = true; int n; TipoEstado estado = TipoEstado.EINICIO; Palavra palavra = new Palavra(); Operador operador = new Operador(); String concatenador = ""; String numero = ""; String op = ""; String atribuicao = ""; while (-1 != (n = reader.read())) { char ch = (char) n; TipoEstado estadoOriginal = estado; switch (estado) { case EINICIO: { if (Character.isLetter(ch)) { estado = TipoEstado.ERESERVADA; if (primeiraLeitura) { concatenador = concatenador + ch; primeiraLeitura = false; } } else if (Character.isDigit(ch)) { estado = TipoEstado.ENUM; numero = numero + ch; } else if ('{' == ch) { estado = TipoEstado.ECOMENTARIO; } else if (';' == ch) estado = TipoEstado.EINICIO; else if (operador.isOperador(op = "" + ch)) { estado = TipoEstado.EOPERADOR; } break; } case ECOMENTARIO: { if (ch == '}') estado = TipoEstado.EINICIO; break; } case ERESERVADA: { //estado = TipoEstado.EFIM; if (ch != ';') concatenador = concatenador + ch; if (palavra.isReservada(concatenador)) { System.out.print("Palavra Reservada: " + concatenador + "\n"); saida.escreve("Palavra Reservada: " + concatenador); concatenador = ""; estado = TipoEstado.EINICIO; primeiraLeitura = true; } if (!Character.isLetter(ch)) { if (ch != ';') { estado = TipoEstado.EINICIO; primeiraLeitura = true; concatenador = ""; } } break; } case ENUM: { if (ch != ';') numero = numero + ch; if (!Character.isDigit(ch)) { estado = TipoEstado.EINICIO; saida.escreve("Numero: " + numero); numero = ""; } break; } case EOPERADOR: { if (!op.equals(":")) { if (":=".equals(atribuicao + op )) { saida.escreve("Operador: " + atribuicao); atribuicao = ""; estado = TipoEstado.EINICIO; } else { saida.escreve("Operador: " + op); estado = TipoEstado.EINICIO; } } else if (op.equals(":")) { atribuicao = atribuicao + op; estado = TipoEstado.EINICIO; } break; } case EFIM: { break; } } if (estado != estadoOriginal) { System.out.print(" * " + estadoOriginal.name() + " -> " + estado.name() + " "); } System.out.println("ch: " + ch); } } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { new AnalisadorLexico().executar(new FileReader("entrada.txt")); } }