private void rutinaReturn(Cuadruplo cuad) { int tipo = 0; if (cuad.resultado != null) { valueReturn = getValue(cuad.resultado.ToString(), ref tipo); contadorProg = pilaDeLLamadas[0]; pilaDeLLamadas.RemoveAt(0); if (pilaDeLLamadas.Count != 0) { if (tablaDeCuadruplos[contadorProg].resultado.ToString().Equals("") == false) { setValue(tablaDeCuadruplos[contadorProg].resultado.ToString(), valueReturn); tipo = int.Parse(tablaDeCuadruplos[contadorProg].argumento2.ToString()); for (int i = 0; i < tipo; i++) { listaParametroLocales.RemoveAt(0); } } contadorProg++; } else { contadorProg = tablaDeCuadruplos.Count - 1; } } else { } }
private void rutinaAritmetica(Cuadruplo cuad) { int tipo = 0, tipo2 = 0; object val2 = getValue(cuad.argumento2.ToString(), ref tipo2), val1 = getValue(cuad.argumento1.ToString(), ref tipo); double resultado = 0; string ar1 = cuad.argumento1.ToString(), ar2 = cuad.argumento2.ToString(); if (ar1[0] == '$') // si corresponde a un parametro { ar1 = ar1.Replace("$", ""); tipo = int.Parse(ar1); // Regresa el apuntador a la lista de parametros val1 = listaParametroLocales[tipo - 1].valor; } if (ar2[0] == '$') //si corresponde a un parametro { ar2 = ar2.Replace("$", ""); tipo2 = int.Parse(ar2); val2 = listaParametroLocales[tipo2 - 1].valor; } /* typear las variables */ if (val1 != null && val2 != null) { switch (cuad.operador.ToString()) { case "+": resultado = double.Parse(val1.ToString()) + double.Parse(val2.ToString()); break; case "-": resultado = double.Parse(val1.ToString()) - double.Parse(val2.ToString()); break; case "*": resultado = double.Parse(val1.ToString()) * double.Parse(val2.ToString()); break; case "/": resultado = double.Parse(val1.ToString()) / double.Parse(val2.ToString()); break; } setValue(cuad.resultado.ToString(), resultado); } else { if (val1 != null && val2 == null) { if (cuad.operador.ToString().Equals("-")) { resultado = double.Parse(val1.ToString()) * -1; setValue(cuad.resultado.ToString(), resultado); } } } }
private void Read(Cuadruplo cuad) { io.Close(); io = new EntradaSalida(ListaDeCadenas); io.update(ListaDeCadenas); io.ShowDialog(); setValue(cuad.resultado.ToString(), io.getVal); ListaDeCadenas.Add(io.getVal.ToString()); io = new EntradaSalida(ListaDeCadenas); io.update(ListaDeCadenas); io.Show(); }
private void imprimir(Cuadruplo cuad) { int t = 0; object obj = getValue(cuad.argumento1.ToString(), ref t); if (obj != null) { this.ListaDeCadenas.Add(obj.ToString()); io.update(ListaDeCadenas); } else { error = true; errorSemantico = "No existe el argumento " + cuad.argumento1.ToString(); } }
private void rutinaGoto(Cuadruplo cuad) { int tipo = 0, tipo2 = 0; object val2 = getValue(cuad.argumento2.ToString(), ref tipo2), val1 = getValue(cuad.argumento1.ToString(), ref tipo); bool band = false; double v1 = 0, v2 = 0; if (cuad.operador.Equals("goto") == false) { v1 = double.Parse(val1.ToString()); v2 = double.Parse(val2.ToString()); } switch (cuad.operador.ToString()) { case "goto": band = true; break; case "if <": if (v1 < v2) { band = true; } break; case "if <=": if (v1 <= v2) { band = true; } break; case "if >": if (v1 > v2) { band = true; } break; case "if >=": if (v1 >= v2) { band = true; } break; case "if ==": if (v1 == v2) { band = true; } break; case "if !=": if (v1 != v2) { band = true; } break; } if (band == true) { contadorProg = int.Parse(cuad.resultado.ToString()); } else { contadorProg++; } }
private void rutinaAsignacion(Cuadruplo cuad) { string res = cuad.resultado.ToString(); string arg1 = cuad.argumento1.ToString(); string arg2 = cuad.argumento2.ToString(); string[] separador = { "[", "]", " " }; string[] arreglo; // nombre del arreglo y desplazamiento int desp; string despArray; object value = null; int tipo = 0; double number; List <object> arr; if (res.Contains('[') == true) // si se le asigna a un arreglo a[i] = x { arreglo = res.Replace(" ", "").Split(separador, StringSplitOptions.RemoveEmptyEntries); res = arreglo[0]; // nombre del arreglo despArray = arreglo[1]; desp = this.getDesplazamientoArray(res, despArray); if (desp != -1) { try { value = getValue(res, ref tipo); arr = value as List <object>; value = getValue(arg1, ref tipo); arr[desp] = value; value = arr; setValue(res, value); } catch { error = true; errorSemantico = "Error en acceso del arreglo " + res; } } } else { if (arg1.Contains('[') == true) { arreglo = arg1.Replace(" ", "").Split(separador, StringSplitOptions.RemoveEmptyEntries); arg1 = arreglo[0]; // nombre despArray = arreglo[1]; desp = this.getDesplazamientoArray(arg1, despArray); if (desp != -1) { try { value = getValue(arg1, ref tipo); arr = value as List <object>; value = getValue(res, ref tipo); value = arr[desp]; setValue(res, value); } catch { error = true; errorSemantico = "Error en acceso del arreglo " + res; } } } else { bool result = double.TryParse(arg1, out number); if (result) { value = number; } else { value = getValue(arg1, ref tipo); } if (value != null) { setValue(res, value); } } } }
public void procesaCuadruplos(Cuadruplo cuad) { string operador = cuad.operador.ToString(); if (operador.Equals("*") || operador.Equals("/") || operador.Equals("+") || operador.Equals("-")) { this.rutinaAritmetica(cuad); contadorProg++; } else { if (operador.Equals("=")) { this.rutinaAsignacion(cuad); contadorProg++; } else { if (operador.Equals("goto") || operador.Equals("if <") || operador.Equals("if <=") || operador.Equals("if ==") || operador.Equals("if !=") || operador.Equals("if >") || operador.Equals("if >=")) { this.rutinaGoto(cuad); } else { if (operador.Equals("param")) { int i = buscaSimbolo(cuad.resultado.ToString()); if (i != -1) { Simbolo s = tablaDeSimbolos[i]; parametrosGenerales.Insert(0, new Simbolo(s.nombre, s.valor, s.tipo, s.arreglo)); contadorProg++; } else { error = true; errorSemantico = "No existe el simbolo " + cuad.resultado.ToString(); } } else { if (operador.Equals("call f") || operador.Equals("call p")) { int i = buscaSimbolo(cuad.argumento1.ToString()); if (i != -1 && (tablaDeSimbolos[i].tipo.ToString().Equals("func") || tablaDeSimbolos[i].tipo.ToString().Equals("proc"))) { pilaDeLLamadas.Insert(0, contadorProg); Simbolo s = tablaDeSimbolos[i]; contadorProg = (int)s.valor; // listaParametroLocales.Clear(); for (i = 0; i < int.Parse(cuad.argumento2.ToString()); i++) { listaParametroLocales.Insert(0, parametrosGenerales[0]); parametrosGenerales.RemoveAt(0); } //listaParametroLocales.Reverse(); } else { error = true; errorSemantico = "No existe el simbolo " + cuad.resultado.ToString(); } } else { if (operador.Equals("return")) { this.rutinaReturn(tablaDeCuadruplos[contadorProg]); } else { if (operador.Equals("print")) { imprimir(tablaDeCuadruplos[contadorProg]); contadorProg++; } else { if (operador.Equals("read")) { Read(tablaDeCuadruplos[contadorProg]); contadorProg++; } else { contadorProg++; } } } } } } } } }