/// <summary> /// Auto incrementa o decrementa una variable /// </summary> /// <param name="name"></param> /// <param name="value"></param> internal void AutoSum(string name, double val) { ScopeMember member = GetVar(name); if (member != null && member.IsVar) { member.Value = Calc.Add(member.Value, val); } }
/// <summary> /// Corre una funcion y retorna su valor /// </summary> /// <param name="fnct"></param> /// <returns></returns> internal object Raise(ParseTreeNode fnct, Scope param_scope) { object result = null; //func_name( param_list ) ; if (fnct.ChildNodes.Count == 2) { String func_name = fnct.ChildNodes[0].FindTokenAndGetText(); ParseTreeNode pars = fnct.ChildNodes[1]; int parSize = pars.ChildNodes.Count; if (func_name.Equals("DibujarAST") && parSize == 1 && ProgramBuiltIns.DrawAST(pars)) { return(null); } if (func_name.Equals("DibujarEXP") && parSize == 1 && ProgramBuiltIns.DrawEXP(pars)) { return(null); } List <Parameter> parameters = CreateParams(pars); if (func_name.Equals("Mostrar") && parSize >= 1 && parameters[0].Type == ParameterType.String) { ProgramBuiltIns.Log(pars, param_scope, fnct); } else { //Si se encuentra la funcion, los parametros son agregados a ella adentro de la funcion ScopeMember funct = GetFunction(func_name, parameters); if (funct != null) { Program.Uncertainty = funct.Uncertainty; Program.ImagePath = funct.ImagePath; result = funct.Raise(); //check result validity if (result == null && funct.Type != "Vacio") { Logger.AddError(fnct, "No se devolvio ningun valor de la funcion [" + funct.Name + "] de tipo [" + funct.Type + "]."); } } else { Logger.AddError(fnct, string.Format("No se encontró la función [{0}].", func_name)); } } } return(result); }
/// <summary> /// Agregar variable /// </summary> /// <param name="type"></param> /// <param name="name"></param> /// <param name="value"></param> public void AddVar(string type, string name, object value) { if (!ExistInCurrentScope(name)) { ScopeMember var = new ScopeMember(type, name, value); Vars.Add(var); } else { Logger.AddWarning(string.Format("Variable [{0} {1} = {2}] declarada anteriormente. No se modifico el valor inicial.", type, name, value)); } }
/// <summary> /// Obtiene la variable, buscándola en todos los ambitos que hay /// </summary> /// <param name="var_name"></param> /// <returns></returns> internal ScopeMember GetVar(string var_name) { var scope = this; do { ScopeMember val = scope.GetVarInCurrentScope(var_name); if (val != null) { return(val); } scope = scope.Parent; }while (scope != null); return(Program.Global.GetVarInCurrentScope(var_name)); }
/// <summary> /// Asigna un valor a una variable ya existente /// </summary> /// <param name="node"></param> internal void AsignVar(ParseTreeNode node) { if (node.ChildNodes.Count == 2) { string name = node.ChildNodes[0].FindTokenAndGetText(); ScopeMember member = GetVar(name); if (member != null && member.IsVar) { member.Value = Solve(node.ChildNodes[1]); } } else { Logger.AddError(node, "Variable no encontrada. ¿Esta seguro que la inicializó?"); } }
/// <summary> /// Agrega una funcion al scope /// </summary> /// <param name="funct"></param> internal void AddFunct(ScopeMember funct) { Functions.Add(funct); }