Uso de la clase StringTokenizer para realizar un analizador sintactico de SQL

Uso de la clase StringTokenizer para realizar una analizador sintactico de las operaciones SQL INSERT, DELETE, UPDATE o SELECT. Como he mostrado anteriormente el uso de la clase StringTokenizer es muy sencillo. Asi que ahora quisiera aportar una idea acerca de como se podria implementar el analizador sintactico para alguna de las 4 operaciones SQL. El ejemplo solamente es una clase y solamente da una idea de como iniciar el analisis de la sintaxis de la Operacion INSERT de SQL, SOLAMENTE ES UNA IDEA y es la siguiente:

/*
 *    Instituto Tecnologico de Zacatepec
 *	Descripcion Ejemplo2 de uso de la clase StringTokenizer
 * author Gonzalo Silverio    gonzasilve@hotmail.com
 * version 1.00 
 * Archivo: EjemploTokenizer2.java
 */

import java.util.StringTokenizer;

public class EjemploTokenizer2
{
	//Guarda las tablas validas donde se puede realizar el INSERT, DELETE, UPDATE o un SELECT
	// este arreglo se puede rellenar con info de alguna fuente exterior a este
	//programa; por ejemplo de una B.D.
	static String tablasValidas[] = {"alumnos","profesores","calificaciones","materias","etc"};
    
    //Analiza la sintaxis de la operacion INSERT de SQL
    public static void analizarOperacionInsert(String cadena)
    {
		StringTokenizer tok1 = new StringTokenizer(cadena);
		String finCadena = new String();
    	//Guardara el token actualmente leido
    	String tokenActual;
    	
    	//salta el INSERT (en el main ya se comprobo que si era la palabra INSERT)
		tok1.nextToken();
		//guarda SEGUNDO token (INTO)
		tokenActual = tok1.nextToken();
		
		//Comprueba si realmente es la palabra INTO
		if(! tokenActual.equals ("INTO") )
		{
			System.out.println ("Se esperaba la palabra clave INTO, no '"+tokenActual+"'");
			return;
		}
		
		//guarda SEGUNDO token (Nombre de la tabla donde se desea hacer el INSERT)
		tokenActual = tok1.nextToken();
		
		//Comprueba si es una tabla valida
		if( ! buscar_tabla(tokenActual) )
		{
			System.out.println ("La tabla '"+tokenActual+"' NO EXISTE o NO es una tabla valida.");
			return;
		}
		
		tokenActual = tok1.nextToken(); 	//guarda lo de values y todo lo demas
		
		StringTokenizer tok2 = new StringTokenizer(tokenActual,"(");
		String cadValues;
		cadValues = tok2.nextToken();
		
		//Comprueba si realmente es la palabra VALUES
		if(! cadValues.equals ("VALUES") )
		{
			System.out.println ("Se esperaba la palabra clave VALUES, no '"+cadValues+"'");
			return;
		}
		//Muestra los tokens que estan despues del parentesis
		System.out.println("\n\n"+tok2.nextToken());
		
		//Y asi sucesivamente se seguiria analizando la sintaxis de la Operacion INSERT de SQL
		//bla, bla, bla
		
    }  // Fin de metodo analizarOperacionDelete();
    
    //Analiza la sintaxis de la operacion DELETE de SQL
    public static void analizarOperacionDelete(String cadena)
    {
    	//Aqui se analizaria la sintaxis del DELETE
    }
    
    //Analiza la sintaxis de la operacion UPDATE de SQL
    public static void analizarOperacionUpdate(String cadena)
    {
    	//etc
    }
    
    //Analiza la sintaxis de la operacion SELECT de SQL
    public static void analizarOperacionSelect(String cadena)
    {
    	
    }
    
   //Devuelve true si la cadena que llega esta dentro de un arreglo de Strings,
   //devuelve  false en caso contrario; busca la tabla que llega dentro de las tablas validas
   public static boolean buscar_tabla(String nomTabla)
   {
      for(int i = 0;i< tablasValidas.length;i++)
      {
         if( tablasValidas[i].equals(nomTabla) )
				return true;
      }
      return false;
   }

    public static void main(String gonza[])
    {
    	//Cadena a ser analizada
    	String cadena = "INSERT INTO alumnos VALUES('s1','intel','cuerna',245)";
    	//String cadena = "Delete FROM alumnos where matricula='00547264'";
    	//String cadena = "UPDATE alumnos SET nombre='Fabian', apellidos='Granados P.' where matricula='00664326'";
    	
    	//Guardara el token actualmente leido
    	String tokenActual;

		StringTokenizer st = new StringTokenizer(cadena);
		
		//Guarda el primer token
		tokenActual = st.nextToken();
		
		//Convertimos toda la cadena a MAYUSCULAS para hacerla case insensitive
		// (NO sensible a las mayusculas/minusculas)
		tokenActual = tokenActual.toUpperCase();
		
		//EMPEZAMOS POR REVISAR EL PRIMER TOKEN, si es una de las 4 Operaciones SQL
		if( tokenActual.equals ("INSERT") || tokenActual.equals ("DELETE")  || tokenActual.equals ("UPDATE") || tokenActual.equals ("SELECT"))
		{
			if (tokenActual.equals ("INSERT"))
				analizarOperacionInsert(cadena);
			else if (tokenActual.equals ("DELETE"))
				analizarOperacionDelete(cadena);
			else	if (tokenActual.equals ("UPDATE"))
				analizarOperacionUpdate(cadena);
			else	if (tokenActual.equals ("SELECT"))
				analizarOperacionSelect(cadena);
		}
		else
			System.out.println("No es una operacion SQL valida, solo se permite INSERT,DELETE,UPDATE o SELECT");
		
		
    }  //Fin del metodo main()
    
    
}

Observa como en el metodo main() se especifica la operacion SQL a analizar (linea 101), obviamente esa cadena se debe obtener de alguna caja de texto donde escribio el usuario o dejar que la teclee el usuario por la consola, yo la he puesto en una variable directamente para fines didacticos y por que solmente quiero mostrar mi idea. Ahora una imagen de la ejecucion y compilacion del ejemplo (sin errores de sintaxis):

Ejecucion1 de ejemplo de analisis sintactico de INSERT de SQL

Ejecucion1 de ejemplo de analisis sintactico de INSERT de SQL

Ahora supongamos que en la cadena escribimos mal la palabra INTO y pusimos INTOO, asi;

String cadena = "INSERT INTOO alumnos VALUES('s1','intel','cuerna',245)";

(esto lo cambias en la linea 101) observa ahora la ejecucion, nos marca error de sintaxis!!!

Ejecucion2 de ejemplo de analisis sintactico de INSERT de SQL

Ejecucion2 de ejemplo de analisis sintactico de INSERT de SQL

Ahora supongamos que escribimos un nombre de tabla que no es ninguna de las tablas validas; escribimos la tabla salarios, asi;

 
String cadena = "INSERT INTO salarios VALUES('s1','intel','cuerna',245)";

(esto lo cambias en la linea 101) observa ahora la ejecucion, nos marca error de sintaxis!!!, la tabla no existe!!

Ejecucion3 de ejemplo de analisis sintactico de INSERT de SQL

Ejecucion3 de ejemplo de analisis sintactico de INSERT de SQL

Ahora supongamos que olvidamos escribir la palabra INTO, asi;

String cadena = "INSERT alumnos VALUES('s1','intel','cuerna',245)";

(esto lo cambias en la linea 101) observa ahora la ejecucion, nos marca error de sintaxis!!!.

Ejecucion4 de ejemplo de analisis sintactico de INSERT de SQL

Ejecucion4 de ejemplo de analisis sintactico de INSERT de SQL

Es todo, y si quieres el .java ya sabes, pidelo en un comentario y te lo envio. hasta pronto.

Acerca de gonzasilve
Freelance Web Developer.

12 Responses to Uso de la clase StringTokenizer para realizar un analizador sintactico de SQL

  1. me podrías pasar el .java por favor lluna14.depad.sj@hotmail.com

  2. Alexander dice:

    Bro, me podrías enviar el codigo por favor :D, alex.molina.cardozo@gmail.com

  3. Dani dice:

    Si me lo puedes pasar te lo agradecería. Un saludo

  4. Lorena Serrano dice:

    Hola!!!! Que interesante! Yo quiero el código! 😀 😀 😀

  5. hola que tal no se si puedas proporcinarme tu script carlos_javlg@hotmail.com esta buenisimo gracias y hasta luego

    • gonzasilve dice:

      Ok, te lo acabo de mandar. Saludos

      • Marvin Gio dice:

        enviame tu script al correo esta buenisimo!

        Saludos!

      • angel dice:

        me puedes mandar el proyecto porfa este es mi correo me estan pidiendo algo similar en una clase mi correo es angel_albe30@hotmail.es porfa mandamelo

  6. Jorge dice:

    Oye que buenisimo esta eso … te molesto si me lo mandas sierra314@hotmail.com

    • gonzasilve dice:

      Jorge te lo mande. Saludos

  7. ivan sernas dice:

    Muy bueno tu aporte, me gustaria obtener tu script java, si pudieras proporcionarmelo .
    Gracias y hasta luego.

    • gonzasilve dice:

      te lo mande. Saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: