You are on page 1of 8

// Instituto Tecnologico de Zacatepec // En el constructor de esta clase recibe como entrada una cadena SQL y devuelve cada vez

que se // se llama a su metodo obtenerToken( devuelve el siguiente token de la cadena SQL! // "ut#or$ %onzalo Silverio gonzasilve&#otmail!com public class Tokens ' //((( "tributos de la clase (((( private String)u**er tok+ //,ara guardar el le-ema del token private c#ar car+ //"lmacena un caracter de la e-presionSQL public String token+ //,ara que el token este disponible como String y no como String)u**er public int intTipoToken+ //%uarda el tipo de token en *orma numerica public String strTipoToken . ne/ String( + //%uarda el Tipo de token en *orma de cadena public String strInstruccionSQL+ //%uarda la cadena SQL que se esta analizando //Tipos de token en *ormato numerico public *inal int 0I123E2"456I78 public *inal int 1;<E482E1TE48 public *inal int 3ELI<IT"384 public *inal int S"LT823E2LI1E" public *inal int 1I1%;18 public *inal int I3E1TI0I5"384 public *inal int ,"L")4"25L"7E public *inal int 5"3E1" . C+ public *inal int ,"4E1TESIS public *inal int 1;<E4823E5I<"L public *inal int "STE4IS58 public *inal int E4484 public *inal int 8,E4"384

. . . . . . .

9:+ =+ >+ ?+ @+ A+ B+

. D+ . :E+ . ::+ . :=+ . :>+

//indice para recorrer caracter por caracter la e-presionSQL private int inde-E-pSQL+ //"rreglo de palabras clave private static String palabras2claveFG . 'HupdateHIHinsertHIHdeleteHIHselectHIHsetHIH*romHIH/#ereHIHandHIHorHIHnotHIHintoHIHvaluesHIHgroupHIH#av ingHIHbyHIHbet/eenHJ+ // TI,8S 3E T8KE1 // Tipos de token que se reconocen!!! // // 99Tipo de token99 99Incluye99 // 3elimitador Signos de puntuacion punto (! y la coma (I // ,alabras clave ,alabras clave // 5adena 5adenas entre comillas simples // Identi*icador 1ombre de variable (nombres de tablasI camposI etc o nombre de *uncion (de agregacion // 1umero2entero 5onstante numerica entera // 1umero2decimal 5onstante numerica decimal // 8perador 8peradores aritmeticos y relacionales Tokens(String cadSQL",arsear

' strInstruccionSQL . cadSQL",arsearLH+ H+ //"gregamos punto y coma + //Inicializar con por de*ault los atributos car . M M+ inde-E-pSQL . E+ //Iniciar analisis en el primer caracter de la cadena tok . ne/ String)u**er( + token . HH+ leer5aracter( + J //5onstructor vacio Tokens( ' J //<etodo que lee el siguiente token de la cadena SQL public void obtenerToken( ' tok . ne/ String)u**er( + // 4einicializar variable para leer otro token token . ne/ String( + // 4einicializar variable para leer otro token intTipoToken . 1I1%;18+ //,or de*ecto no es ningun tipo de token strTipoToken . HningunoH+ token . HH+ // S"LT"4SE ES,"5I8S E1 )L"158 N T");L"384ES *or(++ leer5aracter( ' i*( (c#ar car .. M M OO (c#ar car .. MPtM continue+ else break+ J //5omprobar si es un operador relacional s/itc#(car ' case MQM$ i*(leer5aracter(MRM ' tok!append(MQM + tok!append(MRM + J else i*( leer5aracter(M.M ' tok!append(MQM + tok!append(M.M + J else tok!append(MQM + break+ case MRM$ i*(leer5aracter(M.M ' tok!append(MRM + tok!append(M.M + J else tok!append(MRM + break+

case MSM$ i*(leer5aracter(M.M ' tok!append(MSM + tok!append(M.M + J else tok!append(MSM + break+ J //0in comprobbar si es operador relacional

//8perador 1o

//Si la variable tiene algo se leyo un operador relacional i*(tok!lengt#( RE ' intTipoToken . 8,E4"384+ strTipoToken . HoperadorH+ token . tok!toString( !toLo/er5ase( + leer5aracter( + return+ J //5omprobar si es un operador aritmetico String delims . ne/ String(HL9.H + int d . delims!inde-8*(car + i*( d R. E ' tok!append(car + intTipoToken . 8,E4"384+ //Es un 8,E4"384 (aritmetico strTipoToken . HoperadorH+ token . tok!toString( !toLo/er5ase( + leer5aracter( + return+ J //comprobar si es un delimitador delims . ne/ String(HI!+H + d . delims!inde-8*(car + i*( d R. E ' tok!append(car + intTipoToken . 3ELI<IT"384+ //Es un delimitador punto o coma strTipoToken . HdelimitadorH+ token . tok!toString( !toLo/er5ase( + leer5aracter( + return+ J //5omprobar si son parentesis String parentesis . ne/ String(H( H + int p . parentesis!inde-8*(car + i*( p R. E ' tok!append(car +

intTipoToken . ,"4E1TESIS+ //Es un parentesis strTipoToken. HparentesisH+ token . tok!toString( !toLo/er5ase( + leer5aracter( + return+ J // 5omprobar si es una cadena // La cadenaI se guarda sin comillas i*( (c#ar car .. MPMM ' leer5aracter( + // Saltarse la comilla de apertura /#ile((c#ar car S. MPMM ' tok!append(car + leer5aracter( + J leer5aracter( + // Saltarse la comilla de cierre intTipoToken . 5"3E1"+ strTipoToken. Hc#arH+ token . tok!toString( !toLo/er5ase( + return+ J //5omprobar Si es una identi*icador de usuario o una palabra clave de SQL i*(5#aracter!isLetter((c#ar car ' do ' tok!append(car + leer5aracter( + J /#ile(5#aracter!isLetter8r3igit( (c#ar car OO (c#ar car .. M9M OO (c#ar car .. M2M OO (c#ar car .. M!M + i*( contar,untos(tok R: ' mensaTe2error(HEl identi*icador PMH Ltok!toString( L HPM tiene demasiados puntosH + intTipoToken . E4484+ strTipoToken . HerrorH+ token . tok!toString( !toLo/er5ase( + return+ J //comprobar si es una palabra claveI sinoI entonces es un identi*icador i*( buscar2key/ord( tok!toString( !toLo/er5ase( ' intTipoToken . ,"L")4"25L"7E+ strTipoToken . Hkey/ordH+ token . tok!toString( !toLo/er5ase( + J else ' intTipoToken . I3E1TI0I5"384+ strTipoToken . Hidenti*icadorH+

token . tok!toString( !toLo/er5ase( + J return+ J //Si es un numero (entero o decimal i*(5#aracter!is3igit((c#ar car ' do ' tok!append(car + leer5aracter( + J /#ile(5#aracter!is3igit( (c#ar car OO (c#ar car .. M!M + //5omprobar si es un entero i*(contar,untos(tok .. E ' i*(esEntero(tok!toString( ' intTipoToken . 1;<E482E1TE48+ strTipoToken . HintH+ token . tok!toString( !toLo/er5ase( + J J //5omprobar si es un decimal else i*(contar,untos(tok .. : ' i*(es3ecimal(tok!toString( ' intTipoToken . 1;<E4823E5I<"L+ strTipoToken . HdecimalH+ token . tok!toString( !toLo/er5ase( + J else ' //In*ormar al usuario del error de sinta-is en el decimal mensaTe2error(HEl token PMH Ltok!toString( L HPM parece un decimal pero tiene un error de sinta-isH + intTipoToken . E4484+ strTipoToken . HerrorH+ token . tok!toString( !toLo/er5ase( + J J else i*(contar,untos(tok R : //Si tiene mas de un punto ' //In*ormar a usuario que un decimal no puede tener mas de : caracter punto mensaTe2error(HEl token PMH Ltok!toString( L HPM tiene mas de un puntoH + intTipoToken . E4484+ strTipoToken . HerrorH+ token . tok!toString( !toLo/er5ase( + J return+ J //0in de validar si es un numero //5omprobar si es asterisco i*((c#ar car .. MUM

' tok!append(car + intTipoToken . "STE4IS58+ strTipoToken . HasteriscoH+ token . tok!toString( !toLo/er5ase( + leer5aracter( + return+ J J //0in del metodo obtenerToken

//3evuelve true si en una cadena que llega todos son numerosI *alse en caso contrario public boolean esEntero(String cad ' *or(int i . E+ i i*( S5#aracter!is3igit(cad!c#ar"t(i return *alse+ return true+ J //3evuelve true si la cadena que llega tiene la sinta-is de un decimal public boolean es3ecimal(String cad ' boolean #ay,unto.*alse+ String)u**er parteEntera . ne/ String)u**er( + String)u**er parte3ecimal . ne/ String)u**er( + int i.EI posicion3el,unto+ *or( i.E+i i* ( cad!c#ar"t(i .. M!M //3etectar si #ay un punto decimal en la cadena #ay,unto.true+ i*(#ay,unto //Si #ay punto guardar la posicion donde se encuentra el carater punto posicion3el,unto.cad!inde-8*(M!M + //(si la cadena tiene varios puntosI detecta donde esta el primero ! else return *alse+ //Si no #ay punto+ no es decimal i*( posicion3el,unto .. E OO posicion3el,unto .. cad!lengt#( 9: principio o al *inal no es un decimal return *alse+ *or( i.E+i parteEntera!append(cad!c#ar"t(i + *or(i . E+ i i*( S 5#aracter!is3igit(parteEntera!c#ar"t(i entera return *alse+ digitos no es decimal *or( i.posicion3el,untoL:+i parte3ecimal!append(cad!c#ar"t(i + //Si el punto esta al

//%uardar la parte entera en una variable

//Si alguno de los caracteres de la parte //no son

//%uardar la parte decimal en una variable

*or(i . E+ i i*( S 5#aracter!is3igit(parte3ecimal!c#ar"t(i //Si alguno de los caracteres de la parte decimal no es un digito no es decimal return *alse+ //Incluye el caso en el que la cadena tenga dos o mas puntos return true+ 1umero decimal J //Si paso todas las pruebas anteriorI la cadena es un

//Lee un caracter de la cadenaSQL void leer5aracter( t#ro/s StringInde-8ut8*)oundsE-ception ' car . strInstruccionSQL!c#ar"t(inde-E-pSQL + /U leer siguiente caracter U/

//7eri*icar si se a sobrepasado el indice ma-imo de caracteres en la e-presion SQL i*( inde-E-pSQL Q strInstruccionSQL!lengt#( inde-E-pSQLLL+ else inde-E-pSQL . strInstruccionSQL!lengt#( 9:+ J // lee un caracter - adelantado de la cadena SQLI el caracter que llega lo compara con //el caracter leido y si son iguales devuelve trueI si son di*erentes devuelve *alse boolean leer5aracter(c#ar c ' leer5aracter( + i*( (c#ar car S. (c#ar c ' inde-E-pSQL99+ return *alse+ J car . M M+ return true+ J //5uenta el numero de caracteres punto que tiene una cadena especi*icada public int contar,untos(String)u**er cad ' int contador . E+ *or(int i.E+i ' i*(cad!c#ar"t(i ..M!M contadorLL+ J return contador+ J //3evuelve true si la cadena que llega es una palabra claveI *alse en caso contrario //busca en la tabla de palabras clave la cadena que llega static boolean buscar2key/ord(String identi*icador

' *or(int i . E+iQ palabras2clave!lengt#+iLL ' i*( palabras2claveFiG!equals(identi*icador return true+ J return *alse+ J // <uestra un msg de error en el area de msgs del parser public void mensaTe2error(String str<sg ' System!out!print(HPnH L str<sg + J J //0in de la clase Tokens!Tava

You might also like