analizador sintactico

Iniciado por m@o_614, 9 Julio 2014, 04:52 AM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

Saludos

Tengo el siguiente codigo que es un analizador lexicografico al cual le pido al usuario que le ingrese un token, para despues imprimir si se trata de un identificador, palabra reservada, etc..
El codigo funciona bien, el problema es que ahora tengo que hacer el analizador sintactico para lo cual he estado investigando en varios sitios, pero no se si debo hacer un automata de pila o un arbol sintactico, no se bien cual seria el siguiente paso a seguir

import java.util.Scanner;

class AnalizadorLexico {
Estados estadoActual;

    private enum Estados {
    q00, q01, q02, q03, q04, q05, q06, q07, q08, q09, q10,
         q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21, q22
}
   
    private boolean palabraReservada(String token) {
    int i;
    String reservadas[] = {"abstract","assert","boolean","break","byte","case","catch","char","class","const",
        "continue","default","do","double","else","enum","extends","final","finally","float","for","goto","if",
        "implements","import","instanceof","int","interface","long","native","new","package","private","protected",
    "public","return","short","static","super","switch","new","package","private","protected","synchronized","this",
    "throw","throws","transient","try","void","volatile","while"};
   
    for(i = 0;i < reservadas.length;i++) {
        if(reservadas[i].equals(token))
               return true;
        }
    return false;
    }
   
    private boolean esIdentificador(String token) {
    int estadoSiguiente;
    char arregloToken[] = token.toCharArray();
    estadoActual = Estados.q00;
    for(int i = 0;i < arregloToken.length;i++){
    if(esLetra(arregloToken[i]))
       estadoSiguiente = 0;
    else if(esDigito(arregloToken[i]))
       estadoSiguiente = 1;
    else
       estadoSiguiente = 2;
    estadoActual = matrizTransicion(estadoActual,estadoSiguiente);
    }
    if(estadoActual.equals(Estados.q01))
       return true;
    else
       return false;
    }
   
    private boolean esDecimalEntero(String token){
    int estadoSiguiente;
    char arregloToken[] = token.toCharArray();
    estadoActual = Estados.q00;
    for(int i = 0;i < arregloToken.length;i++){
    if(esDigito(arregloToken[i]))
       estadoSiguiente = 0;
    else
       estadoSiguiente = 1;
    estadoActual = matrizTransicion2(estadoActual,estadoSiguiente);
    }
    if(estadoActual.equals(Estados.q01))
       return true;
    else
       return false;
    }
   
    private boolean esDecimalReal(String token){
    int estadoSiguiente;
    char arregloToken[] = token.toCharArray();
    estadoActual = Estados.q00;
    for(int i = 0;i < arregloToken.length;i++){
    if(esDigito(arregloToken[i]))
       estadoSiguiente = 0;
    else if(arregloToken[i] == '.')
       estadoSiguiente = 1;
    else
       estadoSiguiente = 2;
    estadoActual = matrizTransicion3(estadoActual,estadoSiguiente);
    }
    if(estadoActual.equals(Estados.q03))
       return true;
    else
       return false;
    }
   
    public Estados matrizTransicion(Estados estadoActual,int estadoSiguiente){
    int estado;
    Estados posicion,matriz[][] = {{Estados.q01,Estados.q02,Estados.q02},
                           {Estados.q01,Estados.q01,Estados.q02},
                           {Estados.q02,Estados.q02,Estados.q02}};
    estado = estadoActual.ordinal();
    posicion = matriz[estado][estadoSiguiente];
    return posicion;
    }
   
    public Estados matrizTransicion2(Estados estadoActual,int estadoSiguiente){
    int estado;
    Estados posicion,matriz[][] = {{Estados.q01,Estados.q02},
                                       {Estados.q01,Estados.q02},
                                       {Estados.q02,Estados.q02}};
    estado = estadoActual.ordinal();
    posicion = matriz[estado][estadoSiguiente];
    return posicion;
    }
   
    public Estados matrizTransicion3(Estados estadoActual,int estadoSiguiente){
    int estado;
    Estados posicion,matriz[][] = {{Estados.q01,Estados.q05,Estados.q04},
       {Estados.q01,Estados.q02,Estados.q04},
       {Estados.q03,Estados.q04,Estados.q04},
       {Estados.q03,Estados.q04,Estados.q04},
       {Estados.q04,Estados.q04,Estados.q04},
       {Estados.q03,Estados.q04,Estados.q04}};
    estado = estadoActual.ordinal();
    posicion = matriz[estado][estadoSiguiente];
    return posicion;
    }
   
    public boolean esLetra(char caracter) {
    if((caracter >= 'A' && caracter <= 'Z')||(caracter >= 'a' && caracter <= 'z'))
       return true;
    else
       return false;
    }
   
    public boolean esDigito(char caracter) {
    if((caracter >= '0' && caracter <= '9'))
       return true;
    else
       return false;
    }

    public void AutomataFinitoDeterminista(String token) {
    if(palabraReservada(token))
       System.out.println("El token " + token + " es una palabra reservada");
    else if(esDecimalEntero(token))
         System.out.println("El token " + token + " es un numero decimal entero");
    else if(esIdentificador(token))
       System.out.println("El token " + token + " es un identificador");
    else if(esDecimalReal(token))
       System.out.println("El token " + token + " es un numero decimal real");
    }
}

public class AutomataFinito {

public static void main(String[] args) {
String token;
char otroToken;
AnalizadorLexico analizador = new AnalizadorLexico();
Scanner teclado = new Scanner(System.in);
do
{
System.out.print("Dame el token: ");
token = teclado.nextLine();
analizador.AutomataFinitoDeterminista(token);
System.out.print("Desea ingresar otro token?(S/N) ");
otroToken = teclado.nextLine().charAt(0);
}while(otroToken == 'S' || otroToken == 's');
teclado.close();
}
}


gracias

jhoriloro