/// <summary> /// Checks the expression and appends errors to the root tree node when inconsistencies are found /// </summary> public override void checkExpression() { base.checkExpression(); Called.checkExpression(); ICallable called = Called.getStaticCallable(); if (called != null) { if (called.FormalParameters.Count != NamedActualParameters.Count + ActualParameters.Count) { AddError("Invalid number of arguments provided for function call " + ToString() + " expected " + called.FormalParameters.Count + " actual " + NamedActualParameters.Count); } else { Dictionary <string, Expression> actuals = new Dictionary <string, Expression>(); int i = 0; foreach (Expression expression in ActualParameters) { Parameter parameter = called.FormalParameters[i] as Parameter; CheckActualAgainstFormal(actuals, expression, parameter); i = i + 1; } foreach (KeyValuePair <string, Expression> pair in NamedActualParameters) { string name = pair.Key; Expression expression = pair.Value; Parameter parameter = called.getFormalParameter(name); if (parameter == null) { AddError("Parameter " + name + " is not defined as formal parameter of function " + called.FullName); } else { if (actuals.ContainsKey(name)) { AddError("Parameter " + name + " isassigned twice in " + ToString()); } else { CheckActualAgainstFormal(actuals, expression, parameter); } } } if (called.FormalParameters.Count > 2) { if (ActualParameters.Count > 0) { AddWarning("Calls where more than two parameters are provided must be performed using named association"); } } called.additionalChecks(Root, actuals); } } else { AddError("Cannot determine callable referenced by " + ToString()); } }