public Resultado ejecutar(Contexto ctx, int nivel) { var _Si = instruccion.ChildNodes[0]; var _Sino = instruccion.ChildNodes[1]; Resultado cond = new Expresion(_Si.ChildNodes[0].ChildNodes[0]).resolver(ctx); if (cond.Tipo != Constantes.T_BOOL) { ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "Error de tipo", Interprete.archivo); return(FabricarResultado.creaFail()); } Resultado res = FabricarResultado.creaOk(); bool cond_b = cond.Boleano; if (cond_b) { Cuerpo cp = new Cuerpo(_Si.ChildNodes[1], permiteInterrupciones); res = cp.ejecutar(ctx, nivel + 1); } else { if (_Sino.ChildNodes.Count > 0) { Cuerpo cp = new Cuerpo(_Sino.ChildNodes[0], permiteInterrupciones); res = cp.ejecutar(ctx, nivel + 1); } } ctx.limpiarContexto(nivel); return(res); }
public override Resultado ejecutar(Contexto ctx, int nivel) { Resultado exec = null; while (true) { Resultado condicion = new Expresion(instruccion.ChildNodes[0].ChildNodes[0]).resolver(ctx); if (condicion.Tipo != Constantes.T_BOOL) { ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "La condicion no retorna un valor booleando", Interprete.archivo); return(FabricarResultado.creaFail()); } bool cond = condicion.Boleano; if (!cond) { exec = FabricarResultado.creaOk(); break; } Cuerpo cuerpo = new Cuerpo(instruccion.ChildNodes[1], true); exec = cuerpo.ejecutar(ctx, nivel); if (exec.esContinuar()) { continue; } if (exec.esDetener()) { exec = FabricarResultado.creaOk(); break; } if (exec.esRetorno()) { break; } ctx.limpiarContexto(nivel); } ctx.limpiarContexto(nivel); return(exec); }
public override Resultado ejecutar(Contexto ctx, int nivel) { //Obiene nombre de la variable, el valor, si es incremento o decremento y el cuerpo de la funcion String nombreVar = instruccion.ChildNodes[0].Token.Text; String tipoVar = Constantes.T_NUM; Resultado ValorVar = new Expresion(instruccion.ChildNodes[1].ChildNodes[0]).resolver(ctx); ParseTreeNode NodoCuerpo = instruccion.ChildNodes[4]; String inc_dec = instruccion.ChildNodes[3].ToString(); //si el valor de la variable no es el mismo a number se sale String castValue = ""; switch (tipoVar) { case Constantes.T_BOOL: castValue = "" + Convert.ToInt32(Convert.ToBoolean(ValorVar.Valor)); break; case Constantes.T_NUM: castValue = ValorVar.Valor; break; default: return(FabricarResultado.creaFail()); } // Creo variablew Variable var = new Variable(nombreVar, castValue, tipoVar, nivel); //si existe, es error entonces if (ctx.existeVariable(nombreVar)) { return(FabricarResultado.creaFail()); } ctx.setVariable(var); Resultado exec = null; while (true) { Resultado condicionPara = new Expresion(instruccion.ChildNodes[2].ChildNodes[0]).resolver(ctx); if (condicionPara.Tipo != Constantes.T_BOOL) { ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "La condicion no retorna un valor booleando", Interprete.archivo); return(FabricarResultado.creaFail()); } bool cond = condicionPara.Boleano; if (!cond) { exec = FabricarResultado.creaOk(); break; } Cuerpo cuerpo = new Cuerpo(NodoCuerpo, true); exec = cuerpo.ejecutar(ctx, nivel + 1); if (exec.esContinuar()) { continue; } if (exec.esDetener()) { exec = FabricarResultado.creaOk(); break; } if (exec.esRetorno()) { break; } Variable asigTemp = ctx.getVariable(nombreVar); if (asigTemp != null) { if (asigTemp.Tipo == Constantes.T_NUM) { double valor = Convert.ToDouble(asigTemp.Valor); if (inc_dec == Constantes.INCREMENTO) { valor++; } else { valor--; } asigTemp.Valor = valor.ToString(); } ctx.ActualizarValor(nombreVar, asigTemp); } ctx.limpiarContexto(nivel + 1); } ctx.limpiarContexto(nivel + 1); ctx.limpiarContexto(nivel); return(exec); }
public override Resultado ejecutar(Contexto ctx, int nivel) { bool cumplio = false; Resultado res = FabricarResultado.creaOk(); Resultado cond = new Expresion(instruccion.ChildNodes[0].ChildNodes[0]).resolver(ctx); ParseTreeNode CuerpoSelecciona = instruccion.ChildNodes[1].ChildNodes[0]; String val = cond.Valor; String tipo = cond.Tipo; if (tipo == Constantes.T_BOOL || tipo == Constantes.T_ERROR) { ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "Error de tipo", Interprete.archivo); return(FabricarResultado.creaFail()); } foreach (var ValorN in CuerpoSelecciona.ChildNodes) { String valN = ValorN.ChildNodes[0].Token.Text; String tipoN = ValorN.ChildNodes[0].Term.ToString(); if (tipoN == Constantes.T_STR) { valN = valN.Substring(1, valN.Length - 2); } if (tipo != tipoN) { ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "los tipos no coinciden", Interprete.archivo); res = FabricarResultado.creaFail(); break; } if (cumplio == true || val.CompareTo(valN) != 0) { continue; } cumplio = true; Cuerpo cuerpo = new Cuerpo(ValorN.ChildNodes[1], true); res = cuerpo.ejecutar(ctx, nivel); if (res.esRetorno()) { break; } if (res.esDetener()) { res = FabricarResultado.creaOk(); break; } ctx.limpiarContexto(nivel); } if (instruccion.ChildNodes[1].ChildNodes.Count > 1) { if (cumplio == false) { var defecto = instruccion.ChildNodes[1].ChildNodes[1]; Cuerpo cuerpo = new Cuerpo(defecto.ChildNodes[0], true); res = cuerpo.ejecutar(ctx, nivel); if (res.esDetener()) { res = FabricarResultado.creaOk(); } } } return(res); }