public object Ejecutar(TablaDeSimbolos ts) { try { if (Tipo == Tipo.DIVISION) { return((Double)operadorIzq.Ejecutar(ts) / (Double)operadorDer.Ejecutar(ts)); } else if (Tipo == Tipo.MODULAR) { return((Double)operadorIzq.Ejecutar(ts) % (Double)operadorDer.Ejecutar(ts)); } else if (Tipo == Tipo.POTENCIA) { return((Double)Math.Pow((Double)operadorIzq.Ejecutar(ts), (Double)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.MULTIPLICACION) { return((Double)operadorIzq.Ejecutar(ts) * (Double)operadorDer.Ejecutar(ts)); } else if (Tipo == Tipo.RESTA) { return((Double)operadorIzq.Ejecutar(ts) - (Double)operadorDer.Ejecutar(ts)); } else if (Tipo == Tipo.SUMA) { return((Double)operadorIzq.Ejecutar(ts) + (Double)operadorDer.Ejecutar(ts)); } else if (Tipo == Tipo.NEGATIVO) { return((Double)operadorIzq.Ejecutar(ts) * -1); } else if (Tipo == Tipo.NUMERO) { return(Double.Parse(valor.ToString())); } else if (Tipo == Tipo.VARIABLE) { return(ts.getValor(valor.ToString())); } else if (Tipo == Tipo.CADENA) { return(valor.ToString()); } else if (Tipo == Tipo.INCREMENTO) { Double aux; if (ts.existID(valor.ToString())) { if (ts.getType(valor.ToString()) == Tipo.ENTERO || ts.getType(valor.ToString()) == Tipo.DECIMAL) { aux = (Double)ts.getValor(valor.ToString()); ts.setValor(valor.ToString(), aux + 1); return(aux); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No es un numero.")); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", valor.ToString() + " No existe en el ambito actual")); } return(null); } else if (Tipo == Tipo.DECREMENTO) { Double aux; if (ts.existID(valor.ToString())) { if (ts.getType(valor.ToString()) == Tipo.ENTERO || ts.getType(valor.ToString()) == Tipo.DECIMAL) { aux = (Double)ts.getValor(valor.ToString()); ts.setValor(valor.ToString(), aux - 1); return(aux); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No es un numero.")); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", valor.ToString() + " No existe en el ambito actual")); } return(null); } else if (Tipo == Tipo.MASIGUAL) { //(Double)operadorIzq.Ejecutar(ts); if (ts.existID(valor.ToString())) { if (ts.getType(valor.ToString()) == Tipo.ENTERO || ts.getType(valor.ToString()) == Tipo.DECIMAL) { Double aux = (Double)ts.getValor(valor.ToString()) + (Double)operadorIzq.Ejecutar(ts); ts.setValor(valor.ToString(), aux); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No es un numero.")); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", valor.ToString() + " No existe en el ambito actual")); } return(null); } else if (Tipo == Tipo.MENOSIGUAL) { //(Double)operadorIzq.Ejecutar(ts); if (ts.existID(valor.ToString())) { if (ts.getType(valor.ToString()) == Tipo.ENTERO || ts.getType(valor.ToString()) == Tipo.DECIMAL) { Double aux = (Double)ts.getValor(valor.ToString()) - (Double)operadorIzq.Ejecutar(ts); ts.setValor(valor.ToString(), aux); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No es un numero.")); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", valor.ToString() + " No existe en el ambito actual")); } return(null); } else if (Tipo == Tipo.MULIGUAL) { //(Double)operadorIzq.Ejecutar(ts); if (ts.existID(valor.ToString())) { if (ts.getType(valor.ToString()) == Tipo.ENTERO || ts.getType(valor.ToString()) == Tipo.DECIMAL) { Double aux = (Double)ts.getValor(valor.ToString()) * (Double)operadorIzq.Ejecutar(ts); ts.setValor(valor.ToString(), aux); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No es un numero.")); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", valor.ToString() + " No existe en el ambito actual")); } return(null); } else if (Tipo == Tipo.DIVIGUAL) { //(Double)operadorIzq.Ejecutar(ts); if (ts.existID(valor.ToString())) { if (ts.getType(valor.ToString()) == Tipo.ENTERO || ts.getType(valor.ToString()) == Tipo.DECIMAL) { Double aux = (Double)ts.getValor(valor.ToString()) / (Double)operadorIzq.Ejecutar(ts); ts.setValor(valor.ToString(), aux); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No es un numero.")); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", valor.ToString() + " No existe en el ambito actual")); } return(null); } else if (Tipo == Tipo.MAYOR_QUE) { return(((Double)operadorIzq.Ejecutar(ts)) > ((Double)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.MAYOR_IGUAL) { return(((Double)operadorIzq.Ejecutar(ts)) >= ((Double)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.MENOR_QUE) { return(((Double)operadorIzq.Ejecutar(ts)) < ((Double)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.MENOR_IGUAL) { return(((Double)operadorIzq.Ejecutar(ts)) <= ((Double)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.IGUAL) { return(((Double)operadorIzq.Ejecutar(ts)) == ((Double)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.DIFERENTE) { return(((Double)operadorIzq.Ejecutar(ts)) != ((Double)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.AND) { return(((bool)operadorIzq.Ejecutar(ts)) && ((bool)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.OR) { return(((bool)operadorIzq.Ejecutar(ts)) || ((bool)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.XOR) { return(((bool)operadorIzq.Ejecutar(ts)) ^ ((bool)operadorDer.Ejecutar(ts))); } else if (Tipo == Tipo.NOT) { return(!(bool)operadorIzq.Ejecutar(ts)); } else if (Tipo == Tipo.CONCATENACION) { return(operadorIzq.Ejecutar(ts).ToString() + operadorDer.Ejecutar(ts).ToString()); } else if (Tipo == Tipo.BOOLEANO) { return(Convert.ToBoolean(valor)); } else if (Tipo == Tipo.VARIABLE_METODOS) { Variable var = (Variable)valor; Tipo tipo = ts.getType(var.Id); object aux = Program.getValor(tipo, var.Id, var.Valor, ts); if (aux != null) { return(aux); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", " IndexOutException.")); return(null); } } else { return(null); } } catch { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", " No se puede operar el tipo.")); return(null); } }
public object Ejecutar(TablaDeSimbolos ts) { bool is_ok = true; string salida2 = ""; foreach (Valor item in valores) { if (item.Sub_tipo == Tipo.VARIABLE) { if (ts.existID(item.Val.ToString())) { try { salida2 += ((Operacion)ts.getValor(item.Val.ToString())).Ejecutar(ts); } catch (Exception) { salida2 += ts.getValor(item.Val.ToString()); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "Variable " + item.Val + " no se ha declarado.")); is_ok = false; } if (!is_ok) { break; } } else if (item.Sub_tipo == Tipo.VARIABLE_ATRIBUTOS) { Variable aux_var = (Variable)item.Val; if (ts.existID(aux_var.Id)) { object result = ts.getValorByAttr(aux_var.Id, aux_var.Atributos); if (result != null) { salida2 += result.ToString(); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "NO EXISTE ATRIBUTO")); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "Variable " + item.Val + " no se ha declarado.")); is_ok = false; } if (!is_ok) { break; } } else if (item.Sub_tipo == Tipo.VARIABLE_METODOS) { Variable aux_var = (Variable)item.Val; if (ts.existID(aux_var.Id)) { Tipo tipo = ts.getType(aux_var.Id); object aux = Program.getValor(tipo, aux_var.Id, aux_var.Valor, ts); if (aux != null) { salida2 += aux; } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", " IndexOutException.")); is_ok = false; } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "Variable " + item.Val + " no se ha declarado.")); is_ok = false; } if (!is_ok) { break; } } else { salida2 += item.Val.ToString(); } } if (is_ok) { salida.Add(Program.buildMessage(salida2)); } return(null); }
public object Ejecutar(TablaDeSimbolos ts) { if (ts.existID(new_var.Id)) { bool is_ok = true; foreach (string item in new_var.Lst_variables) { if (!ts.existID(item.ToString())) { is_ok = false; salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", item + " no esta declarada en este ambito.")); } } if (is_ok) { if (new_var.Real_type == Tipo.VARIABLE) { string name = new_var.Valor.GetType().Name; if (name.Equals("Map")) { Map new_map = (Map)new_var.Valor; Map maux = (Map)ts.getValor(new_var.Id); new_map.Clave = maux.Clave; if (new_map.comprobarTipo()) { ts.setValor(new_var.Id, new_map.Mapita); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No todos los atributos coinciden.")); } } if (name.Equals("Lista")) { Lista new_lista = (Lista)new_var.Valor; ts.setValor(new_var.Id, new_lista.Lista_valores); } else if (name.Equals("Variable")) { Variable aux_var = (Variable)new_var.Valor; if (ts.existID(aux_var.Id)) { object valor = ts.getValorByAttr(aux_var.Id, aux_var.Atributos); if (valor == null) { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "NO EXISTE ATRIBUTO")); } else { ts.setValor(new_var.Id, valor); } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "Variable " + aux_var.Valor + " no se ha declarado.")); } } else if (name.Equals("Operacion")) { Tipo type = ts.getType(new_var.Id); Operacion val = (Operacion)new_var.Valor; object valor = val.Ejecutar(ts); salida.AddRange(val.getSalida()); if (valor != null) { if (Program.casteos.comprobarCasteo(type, valor)) { ts.setValor(new_var.Id, valor); } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "No se puede convertir a" + ts.tipoAsignado(new_var.Id))); } } } } else if (new_var.Real_type == Tipo.VARIABLE_ATRIBUTOS) { if (new_var.Instanciada) { try { Operacion val = (Operacion)new_var.Valor; object valor = val.Ejecutar(ts); if (!ts.setValorByAttr(new_var.Id, valor, new_var.Atributos)) { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "NO EXISTE ATRIBUTO")); } } catch { if (!ts.setValorByAttr(new_var.Id, new_var.Valor, new_var.Atributos)) { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", "NO EXISTE ATRIBUTO")); } } } } } } else { salida.Add(Program.buildError(getLine(), getColumn(), "Semantico", new_var.Id + " no esta declarada en este ambito.")); } return(null); }