// convertir de expresión posfija a ensamblado private void posfija_asm(string posfija, int[] constantes) { //Console.WriteLine("Posfija: {0}",posfija); //Console.ReadLine(); for (int i = 0; i < posfija.Length; i++) { if (PreprocesadorExpresiones.esVar(posfija[i])) { var(posfija[i]); } else if (char.IsDigit(posfija[i])) { constnt(posfija[i], constantes); } else if (PreprocesadorExpresiones.esOperAritm(posfija[i])) { operAritm(posfija[i]); } else if (PreprocesadorExpresiones.esOperRelac(posfija[i])) { operRelac(posfija[i]); } else if (PreprocesadorExpresiones.esOperLog(posfija[i])) { operLog(posfija[i]); } } }
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 bool esWhile(string linea) { // while <condicion> if (!Regex.IsMatch(linea, @"^\s*while\s+[\s\S]+\s*$")) { return(false); } // .esValida(<expr>) var postexpr = new PreprocesadorExpresiones(getWhileCond(linea)); return(PreprocesadorExpresiones.esValida(postexpr.imp_pilaexpr())); }
private bool esAsign(string linea) { // <var> = <expr> if (!Regex.IsMatch(linea, @"^\s*[a-z]\s*\=\s*[\s\S]+\s*$")) { return(false); } // .esValida(<expr>) var postexpr = new PreprocesadorExpresiones(getAsignExpr(linea)); return(PreprocesadorExpresiones.esValida(postexpr.imp_pilaexpr())); }
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") + ": "); }