jueves, 22 de noviembre de 2012

Fase 2... Análisis léxico del ensamblador

Pues bien, después de un largo rato de no hacer nada más que jugar League of Legends, decidí empezar con la fase 2 del proyecto que consiste en:

Identificar todos y cada uno de los elementos del programa fuente como elementos validos del lenguaje (pseudoinstrucción, instrucción, registro, símbolo, constante [numérica decimal, numérica hexadecimal, numérica binaria, caracter]). Esta fase del proyecto debe cubrir la característica de desplegar frente a cada elemento de la lista resultado de la fase 1, el tipo de elemento de que se trate. De no identificar a un elemento como válido, se debe desplegar e mensaje "Elemento no identificado" o "Elemento invalido".

Los subconjuntos de doce instrucciones a identificar por cada equipo son los siguientes. Recuerden que es restricción del proyecto el que únicamente identifiquen las instrucciones asignadas y se tomará como símbolos las instrucciones no asignadas.


EquipoInstrucciones a identificar
1AAALAHFPOPFSTOSBINTPUSHCMPTESTJAEJLJOLOOPZ
2AADCMPSBPUSHASTOSWLDSDECMOVXCHGJBJLEJNGJA
3AAMCMPSWLAHFXLATBLEADIVORXORJBEJMPJNGEJP
4AASCWDLODSBPUSHFLESIDIVRCLADCJCJNAJNLJS
5CBWDAALODSWRETDECIMULRORADDJCXZJNAEJNLEJZ
6CLCDASMOVSBSCASWDIVMULSARANDJEJNBJNOLOOP
7CLDHLTMOVSWSTCIDIVNEGADCCMPJGJNBEJNPLOOPE
8CLIINTONOPSTDIMULNOTADDSHLJGEJNCJNSLOOPNE
9CMCIRETPOPASTIINCPOPANDSUBJAJNEJNZLOOPNZ



Pues bien, vamos a suponer que somos el equipo 7, porque dicen que el 7 trae buena suerte.

Esta fase no es nada complicada y sólo tenemos que analizar el elemento que nos ha devuelto la fase 1.

Para esta fase, podemos hacer un HashMap de strings.
Esta clase de java nos permite manejar conjuntos de objetos como si fuera un vector, pero en lugar de índices numéricos, podemos usar palabras.

La idea es hacer una lista como por ejemplo:

CLD:INSTRUCCIÓN
HLT:INSTRUCCIÓN
MOVSW:INSTRUCCIÓN
AX:REGISTRO
BX:REGISTRO
...

Y así, por lo que cuando busquemos por una instrucción válida, nos regresará el string instrucción o registro según corresponda.

Si el mapa no devuelve ninguna de estas cosas, aplicaremos la expresión regular para los símbolos...


if(linea.matches("[a-zA-Z][\\w]*")){


Algo así... donde tamano es el tamaño que queremos aceptar como máximo para nuestros símbolos, no es posible poner variables en las expresiones regulares, por lo tanto o lo hardcodean, o hacen un if con un length del string y una variable int estática...


HashMap<String, Integer> tipoElementos = new HashMap<String, Integer>();
tipoElementos.put("CLD",Identificador.INSTRUCCION);

tipoElementos.put("AX",Identificador.REGISTRO);

Así quedaría el mapa, obviamente con más elementos...


Finalmente reconocer las constantes numéricas y demás, es sencillo, dejo uno para identificar números hexadecimales con o sin signo acá...


private static boolean isHex(String elemento, boolean signo) {
elemento=elemento.replace("h", "");
elemento=elemento.replace("H", "");

try{
if(signo==true){
if( (Integer.parseInt(elemento,16) > -129) && (Integer.parseInt(elemento,16)<128) ){
return true;
}
}
else{
if( (Integer.parseInt(elemento,16) > -1) && (Integer.parseInt(elemento,16)<256) ){
return true;
}
}
}
catch(Exception e){
return false;
}
return false;
}

1 comentario:

  1. Buen día, no tendrás el proyecto o código fuente, me seria muy útil, de ante mano gracias, y buen día

    ResponderEliminar