public object Ejecutar(TablaDeSimbolos ts) { string opcion = instruccion_switch.Expresion.Ejecutar(ts).ToString(); TablaDeSimbolos tabla_local = new TablaDeSimbolos(); tabla_local.addPadre(ts); bool encontrado = false; foreach (Tipo_Case caso in instruccion_switch.Casos) { if (opcion.ToLower().Equals(caso.Expresion.ToLower()) || encontrado) { encontrado = true; foreach (Instruccion item in caso.Instrucciones) { if (item.getType() == Tipo.BREAK) { return(null); } if (item.getType() == Tipo.USER_TYPES || item.getType() == Tipo.FUNCION || item.getType() == Tipo.METODO || item.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(item.getLine(), item.getColumn(), "Semantico", "No puede venir instruccion del tipo: " + item.getType() + " en un ambito local.")); } else { item.Ejecutar(tabla_local); salida.AddRange(item.getSalida()); } } } } foreach (Instruccion item in instruccion_switch.Instrucciones_default) { if (item.getType() == Tipo.BREAK) { break; } if (item.getType() == Tipo.USER_TYPES || item.getType() == Tipo.FUNCION || item.getType() == Tipo.METODO || item.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(item.getLine(), item.getColumn(), "Semantico", "No puede venir instruccion del tipo: " + item.getType() + " en un ambito local.")); } else { item.Ejecutar(tabla_local); salida.AddRange(item.getSalida()); } } return(null); }
public object Ejecutar(TablaDeSimbolos ts) { int limite = 0; while ((bool)expresion.Ejecutar(ts)) { TablaDeSimbolos tabla_local = new TablaDeSimbolos(); tabla_local.addPadre(ts); foreach (Instruccion item in instruccions) { if (item.getType() == Tipo.BREAK) { return(null); } if (item.getType() == Tipo.USER_TYPES || item.getType() == Tipo.FUNCION || item.getType() == Tipo.METODO || item.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(item.getLine(), item.getColumn(), "Semantico", "No puede venir instruccion del tipo: " + item.getType() + " en un ambito local.")); } else { item.Ejecutar(tabla_local); salida.AddRange(item.getSalida()); item.clearSalida(); } } limite++; if (limite == 500) { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "Se ha superado el limite de iteraciones.")); return(null); } } return(null); }
public object Ejecutar(TablaDeSimbolos ts) { TablaDeSimbolos tabla_local = new TablaDeSimbolos(); tabla_local.addPadre(ts); if (variable.Asignacion) { Tipo type = ts.getType(variable.Id); Operacion val = (Operacion)variable.Valor; object valor = val.Ejecutar(ts); salida.AddRange(val.getSalida()); if (valor != null) { if (Program.casteos.comprobarCasteo(type, valor)) { ts.setValor(variable.Id, valor); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No se puede convertir a" + ts.tipoAsignado(variable.Id))); } } } else { Simbolo new_simbol = new Simbolo(Program.getTipo(variable.Tipo.ToLower()), variable.Id); new_simbol.Sub_tipo = Tipo.VARIABLE; Operacion valor = (Operacion)variable.Valor; try { new_simbol.Valor = valor.Ejecutar(ts); if (new_simbol.Valor == null) { new_simbol.Valor = variable.Valor; } } catch (Exception) { new_simbol.Valor = valor; } tabla_local.AddLast(new_simbol); } while ((bool)expresion.Ejecutar(tabla_local)) { foreach (Instruccion item in instruccions) { if (item.getType() == Tipo.BREAK) { return(null); } if (item.getType() == Tipo.USER_TYPES || item.getType() == Tipo.FUNCION || item.getType() == Tipo.METODO || item.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(item.getLine(), item.getColumn(), "Semantico", "No puede venir instruccion del tipo: " + item.getType() + " en un ambito local.")); } else { item.Ejecutar(tabla_local); salida.AddRange(item.getSalida()); item.clearSalida(); } } actualizacion.Ejecutar(tabla_local); } return(null); }
public object Ejecutar(TablaDeSimbolos ts) { TablaDeSimbolos tabla_local = new TablaDeSimbolos(); tabla_local.addPadre(ts); if ((bool)instruccion_if.Condicion.Ejecutar(ts)) { foreach (Instruccion item in instruccion_if.If_instrucciones) { if (item.getType() == Tipo.BREAK) { break; } if (item.getType() == Tipo.USER_TYPES || item.getType() == Tipo.FUNCION || item.getType() == Tipo.METODO || item.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(item.getLine(), item.getColumn(), "Semantico", "No puede venir instruccion del tipo: " + item.getType() + " en un ambito local.")); } else { item.Ejecutar(tabla_local); salida.AddRange(item.getSalida()); } } return(null); } else { foreach (Tipo_IF item in instruccion_if.Else_if) { if ((bool)item.Condicion.Ejecutar(ts)) { foreach (Instruccion instruccion in item.If_instrucciones) { if (instruccion.getType() == Tipo.BREAK) { break; } if (instruccion.getType() == Tipo.USER_TYPES || instruccion.getType() == Tipo.FUNCION || instruccion.getType() == Tipo.METODO || instruccion.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(instruccion.getLine(), instruccion.getColumn(), "Semantico", "No puede venir instruccion del tipo: " + instruccion.getType() + " en un ambito local.")); } else { instruccion.Ejecutar(tabla_local); salida.AddRange(instruccion.getSalida()); } } return(null); } } foreach (Instruccion instruccion in instruccion_if.Else_instrucciones) { if (instruccion.getType() == Tipo.BREAK) { break; } if (instruccion.getType() == Tipo.USER_TYPES || instruccion.getType() == Tipo.FUNCION || instruccion.getType() == Tipo.METODO || instruccion.getType() == Tipo.PROCEDURE) { salida.Add(Program.buildError(instruccion.getLine(), instruccion.getColumn(), "Semantico", instruccion.getType() + " solo es aceptada en un ambito global.")); } else { instruccion.Ejecutar(tabla_local); salida.AddRange(instruccion.getSalida()); } } return(null); } }