Sei sulla pagina 1di 11

/*

* To change this template, choose Tools | Templates


* and open the template in the editor.
*/
import java.io.*; // Mandamos a llamar los paquetes que se ocuparan durante el programa
import java.util.*;
import javax.swing.*;
public class LexyLutor {

/*variables usadas en toda la clase*/


public static int ind=0,next=0,inicio=0,token=0;
public static char texto[];
public static String palabra="";
public static String CompLex="";
/*****************

***TABLA DE TRANSICIONES*******************************/

public static int tabla[][]=


5
11
17
23

/*0
6
12
18
24

1
7
13
19
25

2
8
14
20
26*/

3
9
15
21

4
10
16
22

{/*0*/{ 1,
5,
2,
116,117,50,
50,
0},
{1, 1,
100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100
,100,100,1,
100},
3,
4,
107,122,50,
111,112,113,11,
118,119,125,123,124,120,121,0,
0,
0,

{102,102,102,102,101,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102,1
02,102,102,102,102},
{104,104,104,104,103,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,1
04,104,104,104,104},
{106,106,106,106,105,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,106,1
06,106,106,106,106},
{108,5,
108,108,108,108,6,
8,
108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108,108},
{51, 7,
51,
51,
51,
51,
51,
8,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51},

{109,7,
109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109,109
,109,109,109,109},
{51, 10,
51,
51,
51,
51,
51,
51,
9,
9,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51},
{51, 10,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51,
51},
{110,10,
110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110
,110,110,110,110},//[fila][columna]
{115,115,114,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,1
15,115,115,115,115}};
//Arreglo Matriz que contiene todas las transiciones
/* Fin TABLA DE TRANSICIONES */

/* Metodo Principal */
public static void main(String[] args){
//
Declaramos una variabe que manejara la ruta del cdigo a analizar
String archivo=JOptionPane.showInputDialog("Introduce la ruta del archivo");
A_archivo(archivo);
A_Lexico();
}
/* Fin Metodo Principal */

/* Lector del archivo */


public static void A_archivo(String archivo){
String txt="",linea;
String var= archivo;
int a= var.length();
if(a==0)
archivo=JOptionPane.showInputDialog("No se introdujo un arhivo ...");
else
try{
FileReader fr = new FileReader(archivo);
BufferedReader br = new BufferedReader(fr);

txt="";
linea ="";
while ((linea = br.readLine()) != null)
txt+= linea + "\n";
br.close();
fr.close();
System.out.println(txt);
}catch(Exception e){}
texto=new char[txt.length()];
ind=txt.length();
for(int i=0;i<ind;i++)
texto[i]=(txt.charAt(i));
}
/* Fin Lector */

/* Analizador Lexico */
public static void A_Lexico(){
char c=' ';
int col=0;
System.out.println("TOKEN
COMPONENTE LEXICO PALABRA");
do{
int edo=0;
inicio=next;
do{
c=texto[next];
if(c=='*'){
do{
c=texto[next];
next++;
palabra=palabra+c;
}while(c!='>');
edo=115;
}
else{
next++;
col=VerificarC(c);
edo=tabla[edo][col];
}
}while(edo>=0 && edo<=10 && c!=26 && next<ind);
if(edo>=100 && edo<=123)
EdoAceptacion(edo);
if(edo>=50 && edo<=51)
EdoError(edo);

if(palabra!="")
System.out.println(token+"
palabra="";
CompLex="";
}while(next<ind);

"+CompLex+" "+palabra);

}
/* Fin Analizador Lexico */

Comparacin de caracteres
El cdigo que a continuacin se muestra realiza la comparacin de cada uno de los caracteres
que conforman el archivo fuente a analizar, su funcin es importante ya que determina en que
clasificacin entran los smbolos que se hayan encontrado en el cdigo.
/* Verificador de Caracteres*/
public static int VerificarC(char c){
if((c>='A'&& c<='Z')||(c>='a' && c<='z'))
return 0;
if(c>='0'&& c<='9')
return 1;
if(c=='"')
return 2;
if(c=='>')
return 3;
if(c=='<')
return 4;
if(c=='=')
return 5;
if(c=='.')
return 6;
if(c=='^')
return 7;
if(c=='+')
return 8;
if(c=='-')
return 9;
if(c=='/')
return 10;
if(c=='*')
return 11;
if(c=='(')
return 12;
if(c==')')

return 13;
if(c=='{')
return 15;
if(c=='}')
return 16;
if(c==':')
return 17;
if(c==',')
return 18;
if(c==';')
return 19;
if(c=='[')
return 20;
if(c==']')
return 21;
if(c=='$')
return 22;
if(c==10)
return 23;
if(c==26)
return 24;
if(c=='_')
return 25;
if(c==32)
return 26;
else
return 14;
}
/* Fin Verificador de Caracteres */

/* Generador de Palabras */
public static void FormarPalabra(){
do{
if(texto[inicio]!=32 && texto[inicio]!=26 && texto[inicio]!=9 &&
texto[inicio]!=10){
palabra=palabra+texto[inicio];
}
inicio++;
}while(inicio<next);
}
/* Fin Generador De Palabras */

/* Generador De Errores */

public static void FormarError(){


do{
palabra=palabra+texto[inicio];
inicio++;
}while(inicio<next);
}
/* Fin Generador De Errores */

Estados de Aceptacin
En esta parte del cdigo se encuentran los estados de aceptacin que validan las palabras que se
encuentran en el cdigo fuente con el fin de saber cuales son validas y cuales no.
/* Estados De Aceptacin */
public static void EdoAceptacion(int edo){
switch(edo){ //dependiendo del estado se determinara que funcion tiene la palabra encontrada
case 100:
next--;
FormarPalabra();
token=100;
CompLex="Identificador
";
BuscarPR();
BuscarTD();
break;
case 101:
token=101;
FormarPalabra();
break;
case 102:
next--;
token=102;
FormarPalabra();
break;
case 103:
token=103;
FormarPalabra();
break;
case 104:
next--;
token=104;
FormarPalabra();
break;
case 105:
token=105;
FormarPalabra();

break;
case 106:
next--;
token=106;
FormarPalabra();
break;
case 107:
token=107;
FormarPalabra();
break;
case 108:
next--;
token=108;
FormarPalabra();
break;
case 109:
next--;
token=109;
FormarPalabra();
break;
case 110:
next--;
token=110;
FormarPalabra();
break;
case 111:
token=111;
FormarPalabra();
break;
case 112:
token=112;
FormarPalabra();
break;
case 113:
token=113;
FormarPalabra();
break;
case 114:
token=114;
FormarPalabra();
break;
case 115:
next--;
token=115;
break;
case 116:
token=116;
FormarPalabra();

break;
case 117:
token=117;
FormarPalabra();
break;
case 118:
token=118;
FormarPalabra();
break;
case 119:
token=119;
FormarPalabra();
break;
case 120:
token=120;
FormarPalabra();
break;
case 121:
token=121;
FormarPalabra();
break;
case 122:
token=122;
FormarPalabra();
break;
case 123:
token=123;
FormarPalabra();
break;
case 124:
token=124;
FormarPalabra();
break;
case 125:
token=125;
FormarPalabra();
break;}

if(token==102) // Si el estado no entra en los casos anteriores se determina si es


CompLex="Mensaje
"; // alguno de los siguientes elementos
if(token>=103 && token<=107)
CompLex="Operador Relacional
";
if(token==108)
CompLex="Numero Entero
";
if(token==109)
CompLex="Numero Decimal ";
if(token==110)

CompLex="Numero Exponencial";
if(token>=111 && token<=113)
CompLex="Operador Aritmetico";
if(token>=116 && token<=125)
CompLex="Operador Especial";
if(token>=126 && token<=137)
CompLex="Palabra Reservada";
if(token>=138 && token<=142)
CompLex="Tipo de Dato";
}
/* Fin Estados De Aceptacion */

/* Estados De Error */
public static void EdoError(int edo){
switch(edo){
case 50:
token=50;
CompLex="Error50:caracter no valido en componente lexico";
FormarError();
break;
case 51:
token=51;
CompLex="Error51:caracter no valido en constante numerica, se
esperaba un digito";
FormarError();
break;
}
}
/* Fin Estados De Error */

Palabras Reservadas
En esta parte del cdigo definimos las palabras claves o reservadas que tiene nuestro
lenguaje, esto con el fin de al programar tengamos una estructura definida, podemos ver que solo
incluimos los factores bsicos dentro de la estructura de un programa, como son: sentencias,
ciclos, operaciones de lectura e impresin y las palabras que definen el principio y el fin del
programa.
/* Verificador De Palabras Reservadas */
public static void BuscarPR(){
if(palabra.equals("INICIOCLASE"))
token=126;
if(palabra.equals("FINCLASE"))

token=127;
if(palabra.equals("IMPRIMIR"))
token=128;
if(palabra.equals("IF"))
token=129;
if(palabra.equals("ELSE"))
token=130;
if(palabra.equals("SWITCH"))
token=131;
if(palabra.equals("CASE"))
token=132;
if(palabra.equals("FOR"))
token=133;
if(palabra.equals("LEER"))
token=134;
if(palabra.equals("BREAK"))
token=135;
if(palabra.equals("CONST"))
token=136;
if(palabra.equals("WHILE"))
token=137;
}
/* Fin Verificador De Palabras Reservadas */

Tipos de Datos
Los tipos de datos son importantes al manejar operaciones dentro de un programa, as como para
identificar las variables que se manejaran a lo largo de el. En esta porcin de cdigo verificamos
que tipos de datos se encuentran en el cdigo fuente.

/* Verificador De Tipos De Datos */


public static void BuscarTD(){
if(palabra.equals("ENT"))
token=138;
if(palabra.equals("DEC"))
token=139;
if(palabra.equals("CAD"))
token=140;
if(palabra.equals("BOOLEAN"))
token=141;
if(palabra.equals("CARACT"))
token=142;

//public static void BuscarMSG(){


//
while(c.equals('"')&&
// token
//}
/* Fin Verificador De Tipos De Datos */
}//Cierre Clase Principal

Potrebbero piacerti anche