rendered paste body/**
*
*/
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"));
}
}