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".
Equipo | Instrucciones a identificar | |||||||||||
1 | AAA | LAHF | POPF | STOSB | INT | PUSH | CMP | TEST | JAE | JL | JO | LOOPZ |
2 | AAD | CMPSB | PUSHA | STOSW | LDS | DEC | MOV | XCHG | JB | JLE | JNG | JA |
3 | AAM | CMPSW | LAHF | XLATB | LEA | DIV | OR | XOR | JBE | JMP | JNGE | JP |
4 | AAS | CWD | LODSB | PUSHF | LES | IDIV | RCL | ADC | JC | JNA | JNL | JS |
5 | CBW | DAA | LODSW | RET | DEC | IMUL | ROR | ADD | JCXZ | JNAE | JNLE | JZ |
6 | CLC | DAS | MOVSB | SCASW | DIV | MUL | SAR | AND | JE | JNB | JNO | LOOP |
7 | CLD | HLT | MOVSW | STC | IDIV | NEG | ADC | CMP | JG | JNBE | JNP | LOOPE |
8 | CLI | INTO | NOP | STD | IMUL | NOT | ADD | SHL | JGE | JNC | JNS | LOOPNE |
9 | CMC | IRET | POPA | STI | INC | POP | AND | SUB | JA | JNE | JNZ | LOOPNZ |
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
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...
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;
}
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