private void instrIf(string linea) { string condicion = getIfCond(linea); //int etiquetaInicioIf; int etiquetaSalto; int etiquetaFinIf; write("; if " + condicion); //etiquetaInicioIf = cont_etiq; //cont_etiq++; //write("e" + (etiquetaInicioIf).ToString("000") + ": "); var postExpr = new PreprocesadorExpresiones(condicion); string posfija = Posfija.preexpr_aPosfija(postExpr.imp_pilaexpr()); int[] constantes = postExpr.get_const(); write("; condicion"); posfija_asm(posfija, constantes); write_tab("pop ax"); write_tab("cmp ax,0"); etiquetaSalto = cont_etiq; cont_etiq++; write_tab("jz e" + (etiquetaSalto).ToString("000")); etiquetaFinIf = cont_etiq; pilaFinIf.Add("e" + (etiquetaFinIf).ToString("000") + ": "); cont_etiq++; // guardar la etiqueta de salto en la pila pilaCiclos.Add("e" + (etiquetaSalto).ToString("000") + ": "); }
private void asign(string linea) { // Explicación del valor del string posfija: // getExprAsign(linea) Primero se obtiene la parte de la expresión de la asignación // new PreprocesadorExpresiones(<expr>) Luego se convierte a post-expresión // <expr>.imp_pilaexpr() Y se procede a extraer la post-expresión // Posfija.preexpr_aPosfija(<pexpr>) Como se verificó previamente que la expresión estuviera // bien escrita se procede a convertirla a posfija char var = getAsignVar(linea); var pexpr = new PreprocesadorExpresiones(getAsignExpr(linea)); string posfija = Posfija.preexpr_aPosfija(pexpr.imp_pilaexpr()); int[] constantes = pexpr.get_const(); write("; ASIGNACION"); posfija_asm(posfija, constantes); // el resultado final en el ensamblado se guarda al final de la pila // el valor se recupera en AX // y se procede a copiarlo a <var> //write("; Resultado final"); write_tab("pop ax"); write_tab("mov " + var + ",ax"); //write("; FIN ASIGNACION"); }
private void instrWhile(string linea) { // se extrae la condición de la primera linea string condicion = getWhileCond(linea); int etiquetaInicioWhile; int etiquetaSalto; write("; while " + condicion); etiquetaInicioWhile = cont_etiq; write("e" + (etiquetaInicioWhile).ToString("000") + ": "); cont_etiq++; // la condición se converte a expresión, luego a postfija // y se almacena la postfija y la cadena de constantes // como ya se verificó que la condición está bien escrita // ya no se valida la expresión var postExpr = new PreprocesadorExpresiones(condicion); string posfija = Posfija.preexpr_aPosfija(postExpr.imp_pilaexpr()); int[] constantes = postExpr.get_const(); // la condición se convierte a ensamblado write("; condicion"); posfija_asm(posfija, constantes); // verificación de condición para continuar el ciclo while write_tab("pop ax"); write_tab("cmp ax,0"); etiquetaSalto = cont_etiq; write_tab("jz e" + (etiquetaSalto).ToString("000")); cont_etiq++; // salto hacia el inicio del while para validar la condicion pilaCiclos.Add( " jmp e" + (etiquetaInicioWhile).ToString("000") + "\ne" + (etiquetaSalto).ToString("000") + ": "); }