/// <summary> /// Performs the semantic analysis of the expression /// </summary> /// <param name="instance">the reference instance on which this element should analysed</param> /// <paraparam name="expectation">Indicates the kind of element we are looking for</paraparam> /// <returns>True if semantic analysis should be continued</returns> public override bool SemanticAnalysis(Utils.INamable instance, Filter.AcceptableChoice expectation) { bool retVal = base.SemanticAnalysis(instance, expectation); if (retVal) { Value = Type.getValue(Image); if (Value == null) { AddError("Cannot evaluate " + ToString() + " as a number"); } } return(retVal); }
/// <summary> /// Checks the statement for semantical errors /// </summary> public override void CheckStatement() { Types.Type targetType = VariableIdentification.GetExpressionType(); if (targetType == null) { Root.AddError("Cannot determine type of target " + VariableIdentification.ToString()); } else if (Expression != null) { Expression.checkExpression(); Types.Type type = Expression.GetExpressionType(); if (type != null) { if (targetType != null) { if (!targetType.Match(type)) { UnaryExpression unaryExpression = Expression as UnaryExpression; if (unaryExpression != null && unaryExpression.Term.LiteralValue != null) { if (targetType.getValue(unaryExpression.ToString()) == null) { Root.AddError("Expression " + Expression.ToString() + " does not fit in variable " + VariableIdentification.ToString()); } } else { Root.AddError("Expression [" + Expression.ToString() + "] type (" + type.FullName + ") does not match variable [" + VariableIdentification.ToString() + "] type (" + targetType.FullName + ")"); } } } else { Root.AddError("Cannot determine variable type"); } } else { Root.AddError("Cannot determine expression type (3) for " + Expression.ToString()); } } else { Root.AddError("Invalid expression in assignment"); } }
/// <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); }