Exemple #1
0
        double evalua(CppWINRT.ast p)
        {
            switch ((tipos_nodo)p.Tipo)
            {
            case tipos_nodo.indice_strings: //una variable numerica
                return(var[(int)p.Numero]);

            case tipos_nodo.un_numero:
                return(p.Numero);     //un numero constante

            case tipos_nodo.resta:

                return(evalua(p.Nodo1) - evalua(p.Nodo2));

            case tipos_nodo.suma:
                return(evalua(p.Nodo1) + evalua(p.Nodo2));

            case tipos_nodo.multiplica:
                return(evalua(p.Nodo1) * evalua(p.Nodo2));

            case tipos_nodo.divide:
                if (evalua(p.Nodo2) == 0)
                {
                    return(0);
                }

                return(evalua(p.Nodo1) / evalua(p.Nodo2));

            case tipos_nodo.mayorque:
                if (evalua(p.Nodo1) > evalua(p.Nodo2))
                {
                    return(1);
                }
                else
                {
                    return(0);
                }

            case tipos_nodo.mayorigualque:
                if (evalua(p.Nodo1) >= evalua(p.Nodo2))
                {
                    return(1);
                }
                else
                {
                    return(0);
                }

            case tipos_nodo.noigualque:
                if (evalua(p.Nodo1) != evalua(p.Nodo2))
                {
                    return(1);
                }
                else
                {
                    return(0);
                }

            case tipos_nodo.menorque:
                if (evalua(p.Nodo1) < evalua(p.Nodo2))
                {
                    return(1);
                }
                else
                {
                    return(0);
                }

            case tipos_nodo.igualque:
                if (evalua(p.Nodo1) == evalua(p.Nodo2))
                {
                    return(1);
                }
                else
                {
                    return(0);
                }

            case tipos_nodo.menorigualque:
                if (evalua(p.Nodo1) <= evalua(p.Nodo2))
                {
                    return(1);
                }
                else
                {
                    return(0);
                }

            case tipos_nodo.negativo:
                return(evalua(p.Nodo1) * (-1));

            case tipos_nodo.comparaliteral:

            {
                if (constantes[(int)var[(int)p.Nodo1.Numero]] == constantes [(int)p.Nodo2.Numero])
                {
                    return(1);
                }
                else
                {
                    return(0);
                }
            }

            default:

                break;
            }
            return(0);
        }
Exemple #2
0
        string execut(CppWINRT.ast a)
        {
            CppWINRT.ast p;
//p = nuevonodo();

            tipos_nodo t;

            t = (tipos_nodo)a.Tipo;


            p = a;
            switch (t)
            {
            case tipos_nodo.decimales:

                nro_decimales = ((int)p.Nodo1.Numero);
                break;



            case tipos_nodo.secuencia:

                execut(p.Nodo1);

                execut(p.Nodo2);
                break;

            case tipos_nodo.imprimir_literal:
                sw.WriteLine(constantes [(int)p.Nodo1.Numero]);

                break;

            case tipos_nodo.imprimir_var_alfa:

                sw.WriteLine(constantes [(int)var  [(int)p.Nodo1.Numero]]);
                break;

            case tipos_nodo.imprimir_expresion:


                switch (nro_decimales)
                {
                case 0:
                    sw.WriteLine(evalua(p.Nodo1));
                    break;


                default:
                    sw.WriteLine(evalua(p.Nodo1));
                    break;
                }
                ;

                break;



            case tipos_nodo.imprimir_varios:

                execut(p.Nodo1);
                sw.WriteLine("\n");
                break;


            case tipos_nodo.llamar:
                //fprintf("\nllamar un procedimiento\n");
                //if (procedimientos[(int)p->nodo1->num] == NULL)
                //   {
                //       fprintf(fichero, "procedimiento no encontrado en linea: \n");
                //       getchar();
                //exit (1);
                //}

                //execut ( procedimientos[ (int) (p->nodo1->num) ]  );
                //fprintf("volvemos del procedimiento\n\n");
                sw.WriteLine("orden llamar\n");
                break;

            case tipos_nodo.asigna_num:

                var [(int)p.Nodo1.Numero] = evalua(p.Nodo2);
                break;

            case tipos_nodo.asigna_alfa:

                var[(int)p.Nodo1.Numero] = p.Nodo2.Numero;
                break;

            case tipos_nodo.mientras:

                while (evalua(p.Nodo1) == (double)1)
                {
                    execut(p.Nodo2);
                }


                break;

            case tipos_nodo.leer:

            {
                // elnodo *pp;
                // int inum = 0;
                //double fnum;
                //pp = p;
                //inum = (int)p->nodo1->num;

                //scanf("%lf", &fnum );
                //var[inum] = fnum;
            }
            break;

            case tipos_nodo.leertexto:

            {
                //int indice;
                //elnodo * pp ;

                //char texto[255]  ;
                ////pp = p;
                // getstring(texto);
                // if (error_getstring )
                //     getstring (texto);

                //indice = (int)p->nodo1->num;
                //strcpy ( constantes [(int)var[indice]], texto);
            }
            break;

            case tipos_nodo.si:

                if (evalua(p.Nodo1) > 0)
                {
                    execut(p.Nodo2);
                }
                else
                if (p.Subnodos == 3)
                {
                    execut(p.Nodo3);
                }
                ;


                break;

            case tipos_nodo.desde:

            {
                int x = (int)p.Nodo1.Numero;

                indice_ctr++;
                var[x] = (int)evalua(p.Nodo2);
                counter1[indice_ctr] = (int)var[x];

                for (counter1[indice_ctr] = counter1[indice_ctr]; counter1[indice_ctr] <= (int)evalua(p.Nodo3); counter1[indice_ctr]++)
                {
                    var[x] = counter1[indice_ctr];
                    execut(p.Nodo4);
                }

                indice_ctr--;
            }

            break;


            default:
                break;
            }
            return(sw.ToString());
        }