/// <summary> /// Transforma una asignación /// </summary> private void TransformLet(SentenceLet sentence) { string result = sentence.VariableName + " = "; // Añade las expresiones result += TransformExpressions(sentence.Expressions); // Añade la sentencia al script AddSentence(result); }
/// <summary> /// Carga una sentencia de asignación /// </summary> private SentenceBase LoadSentenceLet(MLNode rootML) { SentenceLet sentence = new SentenceLet(); // Asigna las propiedades sentence.Type = rootML.Attributes[TagType].Value.GetEnum(VariableModel.VariableType.Unknown); sentence.Variable = rootML.Attributes[TagName].Value; sentence.Expression = rootML.Value; // Devuelve la sentencia return(sentence); }
/// <summary> /// Ejecuta una sentencia de asignación /// </summary> private async Task ExecuteLetAsync(SentenceLet sentence, CancellationToken cancellationToken) { if (string.IsNullOrWhiteSpace(sentence.VariableName)) { AddError("Cant find the variable name"); } else { VariableModel variable = Context.Actual.VariablesTable.Get(sentence.VariableName); // Si no se ha definido la variable, añade un errorDeclara la variable si no existía if (variable == null) { AddError($"Undefined variable {sentence.VariableName}"); } else { variable.Value = (await ExecuteExpressionAsync(sentence.Expressions, cancellationToken)).Value; } } }
/// <summary> /// Ejecuta una sentencia de asignación /// </summary> private void ExecuteLet(SentenceLet sentence) { if (string.IsNullOrWhiteSpace(sentence.Variable)) { AddError("Cant find the variable name"); } else { VariableModel variable = Context.Actual.VariablesTable.Get(sentence.Variable); // Depuración AddDebug($"Let {sentence.Variable} = {sentence.Expression}"); // Declara la variable si no existía if (variable == null && sentence.Type != VariableModel.VariableType.Unknown) { // Añade una variable con el valor predeterminado Context.Actual.VariablesTable.Add(sentence.Variable, sentence.Type); // Obtiene la variable variable = Context.Actual.VariablesTable.Get(sentence.Variable); } // Ejecuta la sentencia if (variable == null) { AddError($"Variable {sentence.Variable} not declared"); } else { VariableModel result = new Compiler.Interpreter().EvaluateExpression(Context, sentence.Expression, out string error); if (!string.IsNullOrWhiteSpace(error)) { AddError($"Error when evaluate expression {sentence.Expression}. {error}"); } else { variable.Value = result.Value; } } } }