/// <summary> /// Perform additional checks based on the parameter types /// </summary> /// <param name="root">The element on which the errors should be reported</param> /// <param name="context">The evaluation context</param> /// <param name="actualParameters">The parameters applied to this function call</param> public override void AdditionalChecks(ModelElement root, InterpretationContext context, Dictionary <string, Expression> actualParameters) { CheckFunctionalParameter(root, context, actualParameters[First.Name], 2); CheckFunctionalParameter(root, context, actualParameters[Second.Name], 0); Function function1 = actualParameters[First.Name].GetExpressionType() as Function; Function function2 = actualParameters[Second.Name].GetExpressionType() as Function; if (function1 != null && function2 != null) { if (function1.FormalParameters.Count == 2 && function2.FormalParameters.Count == 0) { Parameter p1 = (Parameter)function1.FormalParameters[0]; Parameter p2 = (Parameter)function1.FormalParameters[1]; if (p1.Type != EFSSystem.DoubleType || p2.Type != EFSSystem.DoubleType) { root.AddError("The formal parameters for the first function are not double"); } } if (function1.ReturnType != function2.ReturnType && function1.ReturnType != EFSSystem.DoubleType && function2.ReturnType != EFSSystem.DoubleType) { root.AddError("The return values for the functions provided as parameter are not the same"); } } }
/// <summary> /// Provides the surface of this function if it has been statically defined /// </summary> /// <param name="context">the context used to create the surface</param> /// <param name="explain"></param> /// <returns></returns> public override Surface CreateSurface(InterpretationContext context, ExplanationPart explain) { Surface retVal = null; IValue firstValue = context.FindOnStack(First).Value; IValue secondValue = context.FindOnStack(Second).Value; Surface firstSurface = createSurfaceForValue(context, firstValue, explain); if (firstSurface != null) { Surface secondSurface = createSurfaceForValue(context, secondValue, explain); if (secondSurface != null) { retVal = firstSurface.Min(secondSurface); } else { Second.AddError("Cannot create surface for " + Second); } } else { First.AddError("Cannot create surface for " + First); } return(retVal); }
/// <summary> /// Provides the value of the function /// </summary> /// <param name="context"></param> /// <param name="actuals">the actual parameters values</param> /// <param name="explain"></param> /// <returns>The value for the function application</returns> public override IValue Evaluate(InterpretationContext context, Dictionary <Actual, IValue> actuals, ExplanationPart explain) { IValue retVal; int token = context.LocalScope.PushContext(); AssignParameters(context, actuals); Function function = (Function)acceptor.getFactory().createFunction(); function.Name = "MINSURFACE (" + getName(First) + ", " + getName(Second) + ")"; function.Enclosing = EFSSystem; function.Surface = CreateSurface(context, explain); Parameter parameterX = (Parameter)acceptor.getFactory().createParameter(); parameterX.Name = "X"; parameterX.Type = EFSSystem.DoubleType; function.appendParameters(parameterX); Parameter parameterY = (Parameter)acceptor.getFactory().createParameter(); parameterY.Name = "Y"; parameterY.Type = EFSSystem.DoubleType; function.appendParameters(parameterY); function.ReturnType = EFSSystem.DoubleType; retVal = function; context.LocalScope.PopContext(token); return(retVal); }
/// <summary> /// Applies a rule defined in a procedure /// </summary> /// <param name="rule"></param> /// <param name="changes"></param> /// <param name="ctxt"></param> /// <param name="explanation"></param> /// <param name="runner"></param> private void ApplyRule(Rule rule, ChangeList changes, InterpretationContext ctxt, ExplanationPart explanation, Runner runner) { foreach (RuleCondition condition in rule.RuleConditions) { ExplanationPart conditionExplanation = ExplanationPart.CreateSubExplanation(explanation, condition); if (condition.EvaluatePreConditions(ctxt, conditionExplanation, runner)) { ExplanationPart.SetNamable(conditionExplanation, EfsSystem.Instance.BoolType.True); foreach (Action action in condition.Actions) { action.GetChanges(ctxt, changes, conditionExplanation, true, runner); } foreach (Rule subRule in condition.SubRules) { ApplyRule(subRule, changes, ctxt, conditionExplanation, runner); } break; } else { ExplanationPart.SetNamable(conditionExplanation, EfsSystem.Instance.BoolType.False); } } }
/// <summary> /// Provides the graph of this function if it has been statically defined /// </summary> /// <param name="context">the context used to create the graph</param> /// <param name="parameter"></param> /// <param name="explain"></param> /// <returns></returns> public override Graph CreateGraph(InterpretationContext context, Parameter parameter, ExplanationPart explain) { Graph retVal = null; Graph graph = createGraphForValue(context, context.FindOnStack(Function).Value, explain, parameter); if (graph != null) { double speed = GetDoubleValue(context.FindOnStack(Speed).Value); double solutionX = graph.SolutionX(speed); if (solutionX == double.MaxValue) { // No value found, return Unknown Range distanceType = (Range)EFSSystem.FindByFullName("Default.BaseTypes.Distance"); EnumValue unknownDistance = distanceType.findEnumValue("Unknown"); retVal = Graph.createGraph(distanceType.getValueAsDouble(unknownDistance)); } else { // Create the graph for this solution retVal = Graph.createGraph(solutionX); } } else { Function.AddError("Cannot create graph for " + Function); } return(retVal); }
/// <summary> /// Provides the surface of this function if it has been statically defined /// </summary> /// <param name="context">the context used to create the surface</param> /// <param name="explain"></param> /// <returns></returns> public override Surface CreateSurface(InterpretationContext context, ExplanationPart explain) { Surface retVal = null; Surface defaultSurface = createSurfaceForValue(context, context.FindOnStack(DefaultFunction).Value, explain); if (defaultSurface != null) { Surface overrideSurface = createSurfaceForValue(context, context.FindOnStack(OverrideFunction).Value, explain); if (overrideSurface != null) { retVal = defaultSurface.Override(overrideSurface); } else { OverrideFunction.AddError("Cannot create graph for OVERRIDE argument"); } } else { DefaultFunction.AddError("Cannot create graph for DEFAULT argument"); } return(retVal); }
/// <summary> /// Provides the value of the function /// </summary> /// <param name="context"></param> /// <param name="actuals">the actual parameters values</param> /// <param name="explain"></param> /// <returns>The value for the function application</returns> public override IValue Evaluate(InterpretationContext context, Dictionary <Actual, IValue> actuals, ExplanationPart explain) { IValue retVal = null; int token = context.LocalScope.PushContext(); AssignParameters(context, actuals); ListValue value = context.FindOnStack(Collection) as ListValue; if (value != null) { Collection collectionType = value.Type as Collection; if (collectionType != null && collectionType.Type != null) { Type elementType = collectionType.Type; if (value.Val.Count >= collectionType.getMaxSize()) { AddError("Cannot allocate element in list : list full"); } else { retVal = elementType.DefaultValue; value.Val.Add(retVal); } } } context.LocalScope.PopContext(token); return(retVal); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { int count = 0; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { count += 1; } } NextIteration(); } EndIteration(context, token); } return(new Values.IntValue(EFSSystem.IntegerType, count));; }
/// <summary> /// Perform additional checks based on the parameter types /// </summary> /// <param name="root">The element on which the errors should be reported</param> /// <param name="context">The evaluation context</param> /// <param name="actualParameters">The parameters applied to this function call</param> public override void AdditionalChecks(ModelElement root, InterpretationContext context, Dictionary <string, Expression> actualParameters) { CheckFunctionalParameter(root, context, actualParameters[Target.Name], 1); CheckFunctionalParameter(root, context, actualParameters[DecelerationFactor.Name], 2); CheckFunctionalParameter(root, context, actualParameters[EndSpeed.Name], 3); }
/// <summary> /// Provides the value of the function /// </summary> /// <param name="context"></param> /// <param name="actuals">the actual parameters values</param> /// <param name="explain"></param> /// <returns>The value for the function application</returns> public override IValue Evaluate(InterpretationContext context, Dictionary <Actual, IValue> actuals, ExplanationPart explain) { IValue retVal = null; int token = context.LocalScope.PushContext(); AssignParameters(context, actuals); Collection collectionType = (Collection) EFSSystem.FindType( OverallNameSpaceFinder.INSTANCE.findByName(EFSSystem.Dictionaries[0], "Default"), "TargetsCol"); ListValue collection = new ListValue(collectionType, new List <IValue>()); Function function = context.FindOnStack(Targets).Value as Function; if (function != null && !function.Name.Equals("EMPTY")) { Graph graph1 = createGraphForValue(context, function, explain); ComputeTargets(graph1.Function, collection); } context.LocalScope.PopContext(token); retVal = collection; return(retVal); }
/// <summary> /// Provides the value of the function /// </summary> /// <param name="context"></param> /// <param name="actuals">the actual parameters values</param> /// <param name="explain"></param> /// <returns>The value for the function application</returns> public override IValue Evaluate(InterpretationContext context, Dictionary <Actual, IValue> actuals, ExplanationPart explain) { IValue retVal = null; int token = context.LocalScope.PushContext(); AssignParameters(context, actuals); StructureValue startDate = context.FindOnStack(StartDate).Value as StructureValue; if (startDate != null) { int year = GetIntValue(startDate, "Year"); int month = GetIntValue(startDate, "Month"); int day = GetIntValue(startDate, "Day"); int hour = GetIntValue(startDate, "Hour"); int minute = GetIntValue(startDate, "Minute"); int second = GetIntValue(startDate, "Second"); int tts = GetIntValue(startDate, "TTS"); DoubleValue addedTime = context.FindOnStack(Increment).Value as DoubleValue; if (addedTime != null) { DateTime start = new DateTime(year, month, day, hour, minute, second, tts); DateTime currentTime = start.AddSeconds(addedTime.Val); retVal = GetEfsDate(currentTime, startDate.Type as Structure); } } context.LocalScope.PopContext(token); return(retVal); }
/// <summary> /// Provides the graph of this function if it has been statically defined /// </summary> /// <param name="context">the context used to create the graph</param> /// <param name="parameter"></param> /// <param name="explain"></param> /// <returns></returns> public override Graph CreateGraph(InterpretationContext context, Parameter parameter, ExplanationPart explain) { Graph retVal = null; Graph firstGraph = createGraphForValue(context, context.FindOnStack(First).Value, explain); if (firstGraph != null) { Graph secondGraph = createGraphForValue(context, context.FindOnStack(Second).Value, explain); if (secondGraph != null) { retVal = firstGraph.Min(secondGraph) as Graph; } else { Second.AddError("Cannot create graph for " + Second); } } else { First.AddError("Cannot create graph for " + First); } return(retVal); }
public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { Change change = new Change(Variable, Variable.Value, Value); changes.Add(change, apply, runner); }
IComparable /*?*/[] ConvertTermArgumentsToMethodArguments(InterpretationContext c, Sequence <Term> termArguments, out IComparable thisArg) { int nMethodArgs = this.method.parameterInfos.Length; IComparable /*?*/[] methodArgs = new IComparable[nMethodArgs]; thisArg = null; int k = 0; int nParametersUsed = this.inputArgumentIndices.Length; foreach (Term arg in termArguments) { if (k >= nParametersUsed) { break; } int methodArgIndex = this.inputArgumentIndices[k++]; IComparable argInterpretation = c.InterpretTerm(arg); // convert from term to .NET runtime object if (-1 == methodArgIndex) { thisArg = argInterpretation; } else if (methodArgIndex >= 0) { methodArgs[methodArgIndex] = argInterpretation; } } return(methodArgs); }
/// <summary> /// Creates a list of changes to be applied on the system /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list of changes to be updated</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> /// <returns>The list to fill with the changes</returns> public virtual void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { if (!DeActivated) { long start = Environment.TickCount; try { if (Statement != null) { Statement.GetChanges(context, changes, explanation, apply, runner); } else { AddError("Invalid actions statement"); } } catch (Exception e) { AddException(e); } long stop = Environment.TickCount; long span = (stop - start); if (RuleCondition != null && RuleCondition.EnclosingRule != null) { // Rule execution execution time (as opposed to guard evaluation) RuleCondition.EnclosingRule.ExecutionTimeInMilli += span; RuleCondition.EnclosingRule.ExecutionCount += 1; } } }
/// <summary> /// Expression of the case /// </summary> /// <param name="context"></param> /// <param name="explain"></param> public bool EvaluatePreConditions(InterpretationContext context, ExplanationPart explain) { bool retVal = true; foreach (PreCondition preCondition in PreConditions) { Expression expression = preCondition.Expression; BoolValue value = expression.GetValue(context, explain) as BoolValue; if (value != null) { retVal = retVal && value.Val; } else { retVal = false; } if (!retVal) { break; } } return(retVal); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.IValue retVal = EFSSystem.EmptyValue; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); for (int i = value.Val.Count - 1; i >= 0; i--) { Values.IValue v = value.Val[i]; if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { retVal = IteratorVariable.Value; break; } } NextIteration(); } EndIteration(context, token); } return(retVal); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.ListValue retVal = null; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); retVal = new Values.ListValue((Types.Collection)GetExpressionType(), new List <Values.IValue>()); foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { retVal.Val.Add(IteratorExpression.GetValue(context)); } } NextIteration(); } EndIteration(context, token); } return(retVal); }
/// <summary> /// Constructor /// </summary> /// <param name="context"></param> /// <param name="statement"></param> /// <param name="variable"></param> /// <param name="explanation"></param> public InsertInListChange(InterpretationContext context, InsertStatement statement, IVariable variable, ExplanationPart explanation) : base(variable, null, null) { Context = context; Statement = statement; Explanation = explanation; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.IValue retVal = EFSSystem.BoolType.True; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); if (Condition != null) { foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (!conditionSatisfied(context)) { retVal = EFSSystem.BoolType.False; break; } } NextIteration(); } } EndIteration(context, token); } return retVal; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.IValue retVal = EFSSystem.EmptyValue; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); for (int i = value.Val.Count - 1; i >= 0; i--) { Values.IValue v = value.Val[i]; if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { retVal = IteratorVariable.Value; break; } } NextIteration(); } EndIteration(context, token); } return retVal; }
/// <summary> /// Expression of the case /// </summary> public bool EvaluatePreConditions(InterpretationContext context) { bool retVal = true; foreach (DataDictionary.Rules.PreCondition preCondition in PreConditions) { Interpreter.Expression expression = preCondition.ExpressionTree; Values.BoolValue value = expression.GetValue(context) as Values.BoolValue; if (value != null) { retVal = retVal && value.Val; } else { retVal = false; } if (!retVal) { break; } } return(retVal); }
internal override IEnumerable <string> GetEnablingConditionDescriptions(InterpretationContext c, Sequence <Term> args, bool returnFailures) { IComparable /*?*/ thisArg = null; IComparable[] methodArgs = ConvertTermArgumentsToMethodArguments(c, args, out thisArg); return(this.method.GetEnablingConditionDescriptions(c, thisArg, methodArgs, returnFailures)); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> protected internal override IValue GetValue(InterpretationContext context, ExplanationPart explain) { int count = 0; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); foreach (IValue v in value.Val) { if (v != EfsSystem.Instance.EmptyValue) { // All elements should always be != from EmptyValue ElementFound = true; IteratorVariable.Value = v; if (ConditionSatisfied(context, explain)) { MatchingElementFound = true; count += 1; } } NextIteration(); } EndIteration(context, explain, token); } return(new IntValue(EfsSystem.Instance.IntegerType, count)); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> protected internal override IValue GetValue(InterpretationContext context, ExplanationPart explain) { IValue retVal = EfsSystem.Instance.BoolType.True; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); if (Condition != null) { foreach (IValue v in value.Val) { if (v != EfsSystem.Instance.EmptyValue) { // All elements should always be != from EmptyValue ElementFound = true; IteratorVariable.Value = v; if (!ConditionSatisfied(context, explain)) { MatchingElementFound = true; retVal = EfsSystem.Instance.BoolType.False; break; } } NextIteration(); } } EndIteration(context, explain, token); } return(retVal); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.IValue retVal = EFSSystem.BoolType.True; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); if (Condition != null) { foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (!conditionSatisfied(context)) { retVal = EFSSystem.BoolType.False; break; } } NextIteration(); } } EndIteration(context, token); } return(retVal); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> protected internal override IValue GetValue(InterpretationContext context, ExplanationPart explain) { ListValue retVal = null; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); retVal = new ListValue((Collection)GetExpressionType(), new List <IValue>()); foreach (IValue v in value.Val) { if (v != EfsSystem.Instance.EmptyValue) { // All elements should always be != from EmptyValue ElementFound = true; IteratorVariable.Value = v; if (ConditionSatisfied(context, explain)) { MatchingElementFound = true; retVal.Val.Add(v); } } NextIteration(); } EndIteration(context, explain, token); } return(retVal); }
/// <summary> /// Provides the value of the function /// </summary> /// <param name="context"></param> /// <param name="actuals">the actual parameters values</param> /// <param name="explain"></param> /// <returns>The value for the function application</returns> public override IValue Evaluate(InterpretationContext context, Dictionary <Actual, IValue> actuals, ExplanationPart explain) { IValue retVal; int token = context.LocalScope.PushContext(); AssignParameters(context, actuals); Function function = (Function)acceptor.getFactory().createFunction(); function.Name = "AddIncrement ( Function => " + getName(Function) + ", Value => " + getName(Increment) + ")"; function.Enclosing = EFSSystem; Parameter parameter = (Parameter)acceptor.getFactory().createParameter(); parameter.Name = "X"; parameter.Type = EFSSystem.DoubleType; function.appendParameters(parameter); function.ReturnType = EFSSystem.DoubleType; function.Graph = CreateGraph(context, parameter, explain); retVal = function; context.LocalScope.PopContext(token); return(retVal); }
/// <summary> /// Edits a value expression and provides the edited expression after user has performed his changes /// </summary> /// <param name="expression"></param> /// <returns></returns> private Expression EditExpression(Expression expression) { Expression retVal = expression; if (expression != null) { ModelElement.DontRaiseError(() => { InterpretationContext context = new InterpretationContext(Model) { UseDefaultValue = false }; IValue value = expression.GetExpressionValue(context, null); if (value != null) { StructureEditor.Window window = new StructureEditor.Window(); window.SetModel(value); window.ShowDialog(); string newExpression = value.ToExpressionWithDefault(); const bool doSemanticalAnalysis = true; const bool silent = true; retVal = new Parser().Expression(expression.Root, newExpression, AllMatches.INSTANCE, doSemanticalAnalysis, null, silent); } }); } return(retVal); }
/// <summary> /// Provides the graph of this function if it has been statically defined /// </summary> /// <param name="context">the context used to create the graph</param> /// <param name="parameter"></param> /// <param name="explain"></param> /// <returns></returns> public override Graph CreateGraph(InterpretationContext context, Parameter parameter, ExplanationPart explain) { Graph retVal = null; Graph graph = null; Function function = context.FindOnStack(Function).Value as Function; if (function != null) { int token = context.LocalScope.PushContext(); Parameter p = (Parameter)function.FormalParameters[0]; context.LocalScope.SetGraphParameter(p); graph = createGraphForValue(context, function, explain, p); context.LocalScope.PopContext(token); } if (graph != null) { Function increment = context.FindOnStack(Increment).Value as Function; retVal = graph.AddIncrement(context, increment, explain); } else { Function.AddError("Cannot create graph for " + Function); } return(retVal); }
/// <summary> /// Provides the value of the function /// </summary> /// <param name="context"></param> /// <param name="actuals">the actual parameters values</param> /// <param name="explain"></param> /// <returns>The value for the function application</returns> public override IValue Evaluate(InterpretationContext context, Dictionary <Actual, IValue> actuals, ExplanationPart explain) { ListValue retVal = null; int token = context.LocalScope.PushContext(); AssignParameters(context, actuals); StringValue value = context.FindOnStack(Value).Value as StringValue; if (value != null) { retVal = new ListValue(EfsSystem.Instance.StringCollection, new List <IValue>()); foreach (char c in value.Val) { StringValue character = new StringValue(EfsSystem.Instance.StringType, c.ToString(CultureInfo.InvariantCulture)); retVal.Val.Add(character); } } context.LocalScope.PopContext(token); return(retVal); }
/// <summary> /// Adds a new function to this graph /// </summary> /// <param name="function"></param> private void AddFunction(Function function) { if (function != null) { InterpretationContext context = new InterpretationContext(function); if (function.FormalParameters.Count == 1) { Parameter parameter = (Parameter)function.FormalParameters[0]; Graph graph = function.createGraph(context, parameter); if (graph != null) { Functions.Add(function); Refresh(); } } else if (function.FormalParameters.Count == 2) { Surface surface = function.createSurface(context); if (surface != null) { Functions.Add(function); Refresh(); } else { MessageBox.Show("Cannot add this function to the display view", "Cannot display function", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } }
/// <summary> /// Indicates whether the condition is satisfied with the value provided /// Hyp : the value of the iterator variable has been assigned before /// </summary> /// <returns></returns> public bool conditionSatisfied(InterpretationContext context) { bool retVal = true; if (Condition != null) { Values.BoolValue b = Condition.GetValue(context) as Values.BoolValue; if (b == null) { retVal = false; } else { retVal = b.Val; } } return retVal; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { int count = 0; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { count += 1; } } NextIteration(); } EndIteration(context, token); } return new Values.IntValue(EFSSystem.IntegerType, count); ; }
protected void Initialize() { string home = System.IO.Path.GetFullPath("../../../../"); context = InterpretationContext.StartInterpretation(home, null, null); }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { int index = context.LocalScope.PushContext(); context.LocalScope.setVariable(IteratorVariable); IVariable variable = ListExpression.GetVariable(context); if (variable != null) { // HacK : ensure that the value is a correct rigth side // and keep the result of the right side operation ListValue listValue = variable.Value.RightSide(variable, false, false) as ListValue; variable.Value = listValue; if (listValue != null) { ListValue newListValue = new ListValue(listValue); int i = 0; foreach (IValue current in newListValue.Val) { IteratorVariable.Value = current; if (conditionSatisfied(context, explanation)) { break; } i += 1; } if (i < newListValue.Val.Count) { IValue value = Value.GetValue(context, explanation); if (value != null) { newListValue.Val[i] = value; Change change = new Change(variable, variable.Value, newListValue); changes.Add(change, apply, runner); ExplanationPart.CreateSubExplanation(explanation, Root, change); } else { Root.AddError("Cannot find value for " + Value.ToString()); } } else { Root.AddError("Cannot find value in " + ListExpression.ToString() + " which satisfies " + Condition.ToString()); } } else { Root.AddError("Variable " + ListExpression.ToString() + " does not contain a list value"); } } else { Root.AddError("Cannot find variable for " + ListExpression.ToString()); } context.LocalScope.PopContext(index); }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.IValue retVal = null; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); context.LocalScope.setVariable(AccumulatorVariable); Types.Type resultType = GetExpressionType(); if (resultType != null) { AccumulatorVariable.Value = resultType.getValue("0"); foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { AccumulatorVariable.Value = Accumulator.GetValue(context); } } NextIteration(); } } EndIteration(context, token); retVal = AccumulatorVariable.Value; } return retVal; }
/// <summary> /// Provides the context on which function evaluation should be performed /// </summary> /// <param name="context"></param> /// <param name="explain"></param> /// <returns></returns> private InterpretationContext getContext(InterpretationContext context, ExplanationPart explain) { InterpretationContext retVal = context; DerefExpression deref = Call.Called as DerefExpression; if (deref != null) { IValue value = deref.GetPrefixValue(context, deref.Arguments.Count - 1, explain) as IValue; if (value != null) { retVal = new InterpretationContext(context, value); } } return retVal; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> protected internal override IValue GetValue(InterpretationContext context, ExplanationPart explain) { ListValue retVal = null; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); retVal = new ListValue((Collection) GetExpressionType(), new List<IValue>()); List<IValue> range = new List<IValue>(value.Val); foreach (IValue v in range) { if (v != EfsSystem.Instance.EmptyValue) { // All elements should always be != from EmptyValue ElementFound = true; IteratorVariable.Value = v; if (ConditionSatisfied(context, explain)) { MatchingElementFound = true; retVal.Val.Add(IteratorExpression.GetValue(context, explain)); } } NextIteration(); } EndIteration(context, explain, token); } return retVal; }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { // Explain what happens in this statement explanation = ExplanationPart.CreateSubExplanation(explanation, this); IVariable variable = ListExpression.GetVariable(context); if (variable != null) { if (variable.Value != EfsSystem.Instance.EmptyValue) { // HacK : ensure that the value is a correct rigth side // and keep the result of the right side operation ListValue listValue = variable.Value.RightSide(variable, false, false) as ListValue; variable.Value = listValue; ExplanationPart.CreateSubExplanation(explanation, "Input data = ", listValue); if (listValue != null) { int token = context.LocalScope.PushContext(); context.LocalScope.SetVariable(IteratorVariable); bool elementFound = false; bool matchingElementFound = false; foreach (IValue value in listValue.Val) { if (value != EfsSystem.Instance.EmptyValue) { elementFound = true; IteratorVariable.Value = value; if (ConditionSatisfied(context, explanation)) { matchingElementFound = true; AppliedStatement.GetChanges(context, changes, explanation, apply, runner); } } } if (!elementFound) { ExplanationPart.CreateSubExplanation(explanation, "Empty collection"); } else if (!matchingElementFound) { ExplanationPart.CreateSubExplanation(explanation, "No matching element found"); } context.LocalScope.PopContext(token); } else { Root.AddError("List expression does not evaluate to a list value"); } } } else { Root.AddError("Cannot find variable for " + ListExpression); } }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply) { Variables.IVariable variable = ListExpression.GetVariable(context); if (variable != null) { // HacK : ensure that the value is a correct rigth side // and keep the result of the right side operation Values.ListValue listValue = variable.Value.RightSide(variable, false) as Values.ListValue; variable.Value = listValue; if (listValue != null) { int token = context.LocalScope.PushContext(); context.LocalScope.setVariable(IteratorVariable); foreach (Values.IValue value in listValue.Val) { if (value != EFSSystem.EmptyValue) { IteratorVariable.Value = value; if (conditionSatisfied(context)) { Call.GetChanges(context, changes, explanation, apply); } } } context.LocalScope.PopContext(token); } else { Root.AddError("List expression does not evaluate to a list value"); } } else { Root.AddError("Cannot find variable for " + ListExpression.ToString()); } }
/// <summary> /// Creates the graph associated to this expression, when the given parameter ranges over the X axis /// </summary> /// <param name="context">The interpretation context</param> /// <param name="parameter">The parameters of *the enclosing function* for which the graph should be created</param> /// <returns></returns> public override Functions.Graph createGraph(InterpretationContext context, Parameter parameter) { Functions.Graph retVal = base.createGraph(context, parameter); Functions.Graph graph = InitialValue.createGraph(context, parameter); if (graph != null) { Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); AccumulatorVariable.Value = graph.Function; foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { AccumulatorVariable.Value = IteratorExpression.GetValue(context); } } NextIteration(); } Functions.Function function = AccumulatorVariable.Value as Functions.Function; if (function != null) { retVal = function.Graph; } else { retVal = Functions.Function.createGraphForValue(AccumulatorVariable.Value); } EndIteration(context, token); } } else { throw new Exception("Cannot create graph for initial value " + InitialValue.ToString()); } return retVal; }
/// <summary> /// Provides the callable that is called by this expression /// </summary> /// <param name="namable"></param> /// <returns></returns> public override ICallable getCalled(InterpretationContext context) { ICallable retVal = null; Functions.Function function = InitialValue.Ref as Functions.Function; if (function == null) { function = InitialValue.getCalled(context) as Functions.Function; } if (function != null) { if (function.FormalParameters.Count == 1) { int token = context.LocalScope.PushContext(); context.LocalScope.setGraphParameter((Parameter)function.FormalParameters[0]); Functions.Graph graph = createGraph(context, (Parameter)function.FormalParameters[0]); context.LocalScope.PopContext(token); if (graph != null) { retVal = graph.Function; } } else if (function.FormalParameters.Count == 2) { int token = context.LocalScope.PushContext(); context.LocalScope.setSurfaceParameters((Parameter)function.FormalParameters[0], (Parameter)function.FormalParameters[1]); Functions.Surface surface = createSurface(context, (Parameter)function.FormalParameters[0], (Parameter)function.FormalParameters[1]); context.LocalScope.PopContext(token); if (surface != null) { retVal = surface.Function; } } else { AddError("Cannot evaluate REDUCE expression to a function"); } } else { AddError("Cannot evaluate REDUCE expression to a function"); } return retVal; }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The changes performed by this statement</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> public abstract void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner);
/// <summary> /// Checks the statement for semantical errors /// </summary> public override void CheckStatement() { InterpretationContext context = new InterpretationContext(Root); Types.Collection listExpressionType = ListExpression.GetExpressionType() as Types.Collection; if (listExpressionType == null) { Root.AddError("Target does not references a list variable"); } context.LocalScope.setVariable(IteratorVariable); Call.CheckStatement(context); }
/// <summary> /// Indicates whether the condition is satisfied with the value provided /// Hyp : the value of the iterator variable has been assigned before /// </summary> /// <param name="context"></param> /// <param name="explain"></param> /// <returns></returns> public bool ConditionSatisfied(InterpretationContext context, ExplanationPart explain) { bool retVal = true; if (Condition != null) { BoolValue b = Condition.GetExpressionValue(context, explain) as BoolValue; ExplanationPart.CreateSubExplanation(explain, Condition, b); if (b == null) { retVal = false; } else { retVal = b.Val; } } return retVal; }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply) { Variables.IVariable variable = ListExpression.GetVariable(context); if (variable != null) { // HacK : ensure that the value is a correct rigth side // and keep the result of the right side operation Values.ListValue listValue = variable.Value.RightSide(variable, false) as Values.ListValue; variable.Value = listValue; if (listValue != null) { Values.ListValue newListValue = new Values.ListValue(listValue); int i = 0; foreach (Values.IValue current in newListValue.Val) { IteratorVariable.Value = current; if (conditionSatisfied(context)) { break; } i += 1; } if (i < newListValue.Val.Count) { Values.IValue value = Value.GetValue(context); if (value != null) { newListValue.Val[i] = value; Rules.Change change = new Rules.Change(variable, variable.Value, newListValue); changes.Add(change, apply); explanation.SubExplanations.Add(new ExplanationPart(Root, change)); } else { Root.AddError("Cannot find value for " + Value.ToString()); } } else { Root.AddError("Cannot find value in " + ListExpression.ToString() + " which satisfies " + Condition.ToString()); } } else { Root.AddError("Variable " + ListExpression.ToString() + " does not contain a list value"); } } else { Root.AddError("Cannot find variable for " + ListExpression.ToString()); } }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { if (Call != null) { InterpretationContext ctxt = getContext(context, explanation); Procedure procedure = Call.getProcedure(ctxt, explanation); if (procedure != null) { ctxt.HasSideEffects = true; // If the procedure has been defined in a structure, // ensure that it is applied to an instance of that structure Structure structure = procedure.Enclosing as Structure; if (structure != null) { ITypedElement current = ctxt.Instance as ITypedElement; while (current != null) { if (current.Type != structure) { IEnclosed enclosed = current as IEnclosed; if (enclosed != null) { current = enclosed.Enclosing as ITypedElement; } else { current = null; } } else { ctxt.Instance = current; current = null; } } } ExplanationPart part = ExplanationPart.CreateSubExplanation(explanation, procedure); if (ctxt.Instance is IVariable) { ExplanationPart.SetNamable(part, ctxt.Instance); ExplanationPart instanceExplanation = ExplanationPart.CreateSubExplanation(part, "instance = "); ExplanationPart.SetNamable(instanceExplanation, ctxt.Instance); } int token = ctxt.LocalScope.PushContext(); foreach ( KeyValuePair<Actual, IValue> pair in Call.AssignParameterValues(context, procedure, true, part)) { ctxt.LocalScope.setVariable(pair.Key, pair.Value); } foreach (Rule rule in procedure.Rules) { ApplyRule(rule, changes, ctxt, part, runner); } ctxt.LocalScope.PopContext(token); } else { AddError("Cannot determine the called procedure for " + ToString()); } } else { AddError("Expression " + ToString() + " is not a valid procedure call"); } }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> protected internal override IValue GetValue(InterpretationContext context, ExplanationPart explain) { IValue retVal = null; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); context.LocalScope.SetVariable(AccumulatorVariable); Type resultType = GetExpressionType(); if (resultType != null) { AccumulatorVariable.Value = resultType.getValue("0"); foreach (IValue v in value.Val) { if (v != EfsSystem.Instance.EmptyValue) { // All elements should always be != from EmptyValue ElementFound = true; IteratorVariable.Value = v; if (ConditionSatisfied(context, explain)) { MatchingElementFound = true; AccumulatorVariable.Value = Accumulator.GetValue(context, explain); } } NextIteration(); } } EndIteration(context, explain, token); retVal = AccumulatorVariable.Value; } return retVal; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.IValue retVal = null; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); context.LocalScope.setVariable(AccumulatorVariable); AccumulatorVariable.Value = InitialValue.GetValue(context); foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { AccumulatorVariable.Value = IteratorExpression.GetValue(context); } } NextIteration(); } EndIteration(context, token); retVal = AccumulatorVariable.Value; } else { AddError("Cannot evaluate list value " + ListExpression.ToString()); } return retVal; }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { // Explain what happens in this statement explanation = ExplanationPart.CreateSubExplanation(explanation, this); IVariable variable = ListExpression.GetVariable(context); if (variable != null) { // HacK : ensure that the value is a correct rigth side // and keep the result of the right side operation ListValue listValue = variable.Value.RightSide(variable, false, false) as ListValue; variable.Value = listValue; if (listValue != null) { ExplanationPart.CreateSubExplanation(explanation, "Input data = ", listValue); IValue value = Value.GetExpressionValue(context, explanation); if (value != null) { if (!listValue.Val.Contains(value)) { ListValue newListValue = new ListValue(listValue); int index = newListValue.Val.IndexOf(EfsSystem.Instance.EmptyValue); if (index >= 0) { ExplanationPart.CreateSubExplanation(explanation, "Inserting", value); newListValue.Val[index] = value; } else { // List is full, try to remove an element before inserting the new element if (ReplaceElement != null) { IValue removeValue = ReplaceElement.GetExpressionValue(context, explanation); ExplanationPart.CreateSubExplanation(explanation, "Replaced element", removeValue); index = newListValue.Val.IndexOf(removeValue); if (index >= 0) { ExplanationPart.CreateSubExplanation(explanation, "Replacing", value); newListValue.Val[index] = value.RightSide(variable, true, true); } else { Root.AddError("Cannot remove replacing element " + removeValue.Name); } } else { Root.AddError("Cannot add new element in list value : list is full"); } } Change change = new Change(variable, variable.Value, newListValue); changes.Add(change, apply, runner); ExplanationPart.CreateSubExplanation(explanation, Root, change); } else { ExplanationPart.CreateSubExplanation(explanation, "NOT added : Already present in collection", value); } } else { Root.AddError("Cannot find value for " + Value); } } else { Root.AddError("Variable " + ListExpression + " does not contain a list value"); } } else { Root.AddError("Cannot find variable for " + ListExpression); } }
/// <summary> /// Prepares the iteration on the context provided /// </summary> /// <param name="context"></param> protected override int PrepareIteration(InterpretationContext context) { int retVal = base.PrepareIteration(context); context.LocalScope.setVariable(AccumulatorVariable); return retVal; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> public override IValue GetValue(InterpretationContext context, ExplanationPart explain) { IValue retVal = null; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); retVal = EFSSystem.BoolType.False; foreach (IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { ElementFound = true; IteratorVariable.Value = v; if (Condition != null) { BoolValue b = Condition.GetValue(context, explain) as BoolValue; if (b != null && b.Val) { MatchingElementFound = true; retVal = EFSSystem.BoolType.True; break; } } else { retVal = EFSSystem.BoolType.True; break; } } NextIteration(); } EndIteration(context, explain, token); } return retVal; }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { IVariable var = VariableIdentification.GetVariable(context); if (var != null) { IValue value = Expression.GetExpressionValue(context, explanation); if (value != null) { value = value.RightSide(var, true, true); } Range range = var.Type as Range; if (range != null && range.convert(value) == null) { AddError("Value " + value + " is outside range"); } else { Change change = new Change(var, var.Value, value); changes.Add(change, apply, runner); ExplanationPart.CreateSubExplanation(explanation, Root, change); } } else { AddError("Cannot find variable " + VariableIdentification); } }
/// <summary> /// Indicates whether the condition is satisfied with the value provided /// Hyp : the value of the iterator variable has been assigned before /// </summary> /// <param name="context"></param> /// <param name="explain"></param> /// <returns></returns> public bool conditionSatisfied(InterpretationContext context, ExplanationPart explain) { bool retVal = true; if (Condition != null) { BoolValue b = Condition.GetValue(context, explain) as BoolValue; if (b == null) { retVal = false; } else { retVal = b.Val; } } return retVal; }
/// <summary> /// Applies a rule defined in a procedure /// </summary> /// <param name="rule"></param> /// <param name="changes"></param> /// <param name="ctxt"></param> /// <param name="explanation"></param> /// <param name="runner"></param> private void ApplyRule(Rule rule, ChangeList changes, InterpretationContext ctxt, ExplanationPart explanation, Runner runner) { foreach (RuleCondition condition in rule.RuleConditions) { ExplanationPart conditionExplanation = ExplanationPart.CreateSubExplanation(explanation, condition); if (condition.EvaluatePreConditions(ctxt, conditionExplanation, runner)) { ExplanationPart.SetNamable(conditionExplanation, EFSSystem.BoolType.True); foreach (Action action in condition.Actions) { action.GetChanges(ctxt, changes, conditionExplanation, true, runner); } foreach (Rule subRule in condition.SubRules) { ApplyRule(subRule, changes, ctxt, conditionExplanation, runner); } break; } else { ExplanationPart.SetNamable(conditionExplanation, EFSSystem.BoolType.False); } } }
/// <summary> /// Provides the changes performed by this statement /// </summary> /// <param name="context">The context on which the changes should be computed</param> /// <param name="changes">The list to fill with the changes</param> /// <param name="explanation">The explanatino to fill, if any</param> /// <param name="apply">Indicates that the changes should be applied immediately</param> /// <param name="runner"></param> public override void GetChanges(InterpretationContext context, ChangeList changes, ExplanationPart explanation, bool apply, Runner runner) { // Explain what happens in this statement explanation = ExplanationPart.CreateSubExplanation(explanation, this); IVariable variable = ListExpression.GetVariable(context); if (variable != null) { // HacK : ensure that the value is a correct rigth side // and keep the result of the right side operation ListValue listValue = variable.Value.RightSide(variable, false, false) as ListValue; variable.Value = listValue; if (listValue != null) { // Provide the state of the list before removing elements from it ExplanationPart.CreateSubExplanation(explanation, "Input data = ", listValue); ListValue newListValue = new ListValue(listValue.CollectionType, new List<IValue>()); int token = context.LocalScope.PushContext(); context.LocalScope.SetVariable(IteratorVariable); int index = 0; if (Position == PositionEnum.Last) { index = listValue.Val.Count - 1; } // Remove the element while required to do so while (index >= 0 && index < listValue.Val.Count) { IValue value = listValue.Val[index]; index = NextIndex(index); IteratorVariable.Value = value; if (ConditionSatisfied(context, explanation)) { if (Position != PositionEnum.All) { break; } } else { InsertInResult(newListValue, value); } } // Complete the list while (index >= 0 && index < listValue.Val.Count) { IValue value = listValue.Val[index]; InsertInResult(newListValue, value); index = NextIndex(index); } Change change = new Change(variable, variable.Value, newListValue); changes.Add(change, apply, runner); ExplanationPart.CreateSubExplanation(explanation, Root, change); context.LocalScope.PopContext(token); } } }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <returns></returns> public override Values.IValue GetValue(InterpretationContext context) { Values.ListValue retVal = null; Values.ListValue value = ListExpression.GetValue(context) as Values.ListValue; if (value != null) { int token = PrepareIteration(context); retVal = new Values.ListValue((Types.Collection)GetExpressionType(), new List<Values.IValue>()); foreach (Values.IValue v in value.Val) { if (v != EFSSystem.EmptyValue) { IteratorVariable.Value = v; if (conditionSatisfied(context)) { retVal.Val.Add(IteratorExpression.GetValue(context)); } } NextIteration(); } EndIteration(context, token); } return retVal; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> protected internal override IValue GetValue(InterpretationContext context, ExplanationPart explain) { IValue retVal = EfsSystem.Instance.BoolType.False; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); retVal = EfsSystem.Instance.BoolType.False; foreach (IValue v in value.Val) { if (v != EfsSystem.Instance.EmptyValue) { // All elements should always be != from EmptyValue ElementFound = true; IteratorVariable.Value = v; if (Condition != null) { BoolValue b = Condition.GetValue(context, explain) as BoolValue; if (b != null && b.Val) { MatchingElementFound = true; retVal = EfsSystem.Instance.BoolType.True; break; } } else { retVal = EfsSystem.Instance.BoolType.True; break; } } NextIteration(); } EndIteration(context, explain, token); } return retVal; }
/// <summary> /// Provides the value associated to this Expression /// </summary> /// <param name="context">The context on which the value must be found</param> /// <param name="explain">The explanation to fill, if any</param> /// <returns></returns> protected internal override IValue GetValue(InterpretationContext context, ExplanationPart explain) { IValue retVal = EfsSystem.Instance.EmptyValue; ListValue value = ListExpression.GetValue(context, explain) as ListValue; if (value != null) { int token = PrepareIteration(context); foreach (IValue v in value.Val) { if (v != EfsSystem.Instance.EmptyValue) { ElementFound = true; IteratorVariable.Value = v; if (ConditionSatisfied(context, explain)) { MatchingElementFound = true; retVal = v; break; } } NextIteration(); } EndIteration(context, explain, token); } return retVal; }