Пример #1
0
        // 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]);
                }
            }
        }
Пример #2
0
        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") + ": ");
        }
Пример #3
0
        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");
        }
Пример #4
0
        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()));
        }
Пример #5
0
        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()));
        }
Пример #6
0
        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") + ": ");
        }