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); }
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()); }