Análisis Léxico En Java
Enviado por VictorSVega • 12 de Octubre de 2013 • 4.431 Palabras (18 Páginas) • 369 Visitas
Introducción
Dentro de la fase de compilación existen tres grandes sub-etapas las cuales se
encargan de analizar el código para dar un resultado positivo si tus expresiones util izadas son
gratamente reconocidas por todas las normas que plantea cierto lenguaje de programación.
En este documento se muestra el desarrollo de una de esas sub-etapas, el análisis
léxico. Dentro de esta sub-etapa se localizan solo las normas que deben de cumplir todas
aquellas palabras (tokens) que estén dentro de un código escrito por el usuario. Dicho de otra
forma se encarga de indicar si dentro de tu código existe alguna palabra no reconocida para el
lenguaje.
Cada uno de los métodos aquí contenidos presentan una breve descripción de su
función, el algoritmo utilizado y el código para lenguaje Java.
Clase AnLexico
La clase AnLexico está diseñada para evaluar una cadena de caracteres basada en un
léxico determinado. Cuenta solo con el constructor default y al crear un objeto de esta clase, al
igual que todos, comienza con valores vacios.
Atributos
Atributos contenidos dentro de la clase AnLexico:
Tabla de símbolos
La tabla de símbolos contendrá las palabras reservadas del lenguaje así como las
variables que se declaren dentro de un programa. Es una instancia de la clase Hashtable
denominada tabaSimbolos.
Código
Hashtable tokens= new Hashtable();
Tabla de tokens
La tabla de tokens tendrá uso al almacenar cada una de las palabras que contenga la
cadena de texto a analizar. Es también una instancia de la clase Hashtable en este caso
nombrada tokens.
Código
Hashtable tablaSimbolos= new Hashtable();
6
Cadena de errores
Este objeto de la clase String contendrá todos aquellos errores resultantes del análisis
léxico. Tendrá un uso importante ya que de el dependerá el veredicto final de análisis; al estar
vacio significara que no se detectaron errores durante todo el proceso.
Código
String error="";
7
Método analiza
Este método analiza cada una de las palabras guardadas dentro de la tabla de tokens,
toma como llegada una cadena que después envía al método encargado de separar en tokens.
Mientras la tabla contenga algún token mas, tomara de uno a uno y los analizara. Cada token
lo compara con una de las posibles opciones; siendo el primer caso que el token sea un tipo de
dato, lo cual indica que el siguiente token deberá ser un nombre para una variable y tendrá
que pasar las normas para ser válido, los casos siguientes simplemente ubican su posible valor
y lo envían para ser validado.
Algoritmo para analizar una cadena dada
contenido es un objeto de la clase String que llega como parámetro
cantidad es variable de tipo entero que toma el valor que regresa el método tokeniza al
enviarle contenido
token y aux son objetos de la clase String
j es variable de tipo entero que inicializa su valor en cero
se llama al método llenaSimbolos
mientras j sea menor que cantidad
token toma el valor de tokens donde la clave sea j
si tablaSimbolos contiene como clave a token
aux toma el valor de tablaSimbolos donde clave sea token
si aux es igual a la cadena “tipo de dato”
j se incrementa en uno
token toma el valor de tokens donde la clave sea j
si el método nomVariablreValido regresa verdadero al evaluar token
se envía token al método guardaVarible
sino
error añade una nueva línea con token y la oración “nombre de
variable invalido”
sino si el método conectorLogico regresa verdadero al enviarle a token
se envía token al método evalConectorLogico
sino si el método opLogicos regresa verdadero al enviarle a token
se envía token al método evalOpLogicos
sino si el método opAsignacion regresa verdadero al enviarle a token
se envía token al método evalOpAsignacion
sino si el método opAritmeticos regresa verdadero al enviarle a token
se envía token al método evalOpAritmeticos
sino
si token es diferente de ‘(’ y ‘)’
error añade una nueva línea con token y la oración “palabra no
reconocida”
j se incrementa en uno
si error esta vacio
regresa verdadero
regresa falso
8
Código
public boolean analiza(String contenido){
int cantidad=tokeniza(contenido);
String token="";
String aux="";
llenaSimbolos();
int j=0;
while(j<cantidad){
token=String.valueOf(tokens.get(j));
if(tablaSimbolos.containsKey(token)){
aux=String.valueOf(tablaSimbolos.get(token));
if(aux.equals("tipo de dato")){
j++;
token=String.valueOf(tokens.get(j));
if(nomVariableValido(token)) guardaVariable(token);
else error+="Error: " +token +" nombre de variable invalido \n";
}
}
else if(conectorLogico(token)){
evalConectorLogico(token);
}
else if(opLogicos(token)){
evalOpLogicos(token);
}
else if(opAsignacion(token)){
evalOpAsignacion(token);
}
else if(opAritmeticos(token)){
evalOpAritmeticos(token);
}
else
if(!token.equals("(") && !token.equals(")")) error+="Error: " +token +" palabra no
reconocida \n";
j++;
}
if(error.isEmpty())
return true;
return false;
}
9
Método llenaSimbolos
Este método se encarga de llenar la tabla de símbolos donde se encuentran todas
aquellas palabras
...