Análisis Léxico En Java
VictorSVega12 de Octubre de 2013
4.431 Palabras (18 Páginas)401 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 propias del lenguaje, aquí se declararan entonces los tipos de datos y
palabras reservadas a utiliza. Por ejemplo, tipo de dato “entero” que sería parecido a “int” o
“Integer”, “mientras” similar a “while”, etc. Es importante mencionar que lo complejo que
resulte dependerá de las estructuras de datos donde se almacenen las palabras; en algunos
lenguajes de programación ya se incluye una estructura de datos conocida como tabla hash,
mapeo hash o tabla de dispersión la cual asocia llaves o claves con valores.
Algoritmo para llenar la tabla de símbolos
ingresa en tablaSimbolos las palabras reservadas como clave con valor de “palabra reservada”
ingresa en tablaSimbolos los tipos de dato como clave con el valor de “tipo de dato”
Código
public void llenaSimbolos(){
tablaSimbolos.put("si", "palabra reservada");
tablaSimbolos.put("entero", "tipo de dato");
}
Método tokeniza
Este método recibe una cadena principal la cual descompone enviando a tabl a de
tokens cada una de sus palabras. Reconoce como palabras o tokens aquellas palabras que
dentro de la cadena estén separadas por espacio, punto y coma y coma. Este método
considera entonces un número que cumpla esas condiciones como token, cabe mencionar que
este método no guarda las palabras, solo las identifica, de tal forma que al reconocer una
palabra llama al método diseñado para guardar tokens enviándole dicha palabra. Al llamar
este método regresa una variable de tipo entero la cual indica el número de palabras
guardadas en la tabla de tokens.
Algoritmo para tokenizar
Contenido es un objeto de la clase String que llega como parámetro
Token es un objeto de la clase String
hay es una variable de tipo booleano que inicia con valor falso
j es una variable de tipo entero que se inicializa en 0 10
i es una variable de tipo entero
desde i igual a 0 hasta i menor que la longitud de contenido, con i incrementándose en uno
si contenido en la posición i es diferente de ‘ ’, ‘;’ y de ‘,’
token añade a el carácter de contenido en la posición i
hay toma el valor de verdadero
sino
si hay es verdadero
se envía j y token al método guardaToken
j se incrementa en uno
token toma valor vacio
hay toma valor falso
si hay es verdadero
se envía j y token al método guardaToken
j se incrementa en uno
regresa j
Código
public int tokeniza(String contenido){
String token="";
...