public override void CheckSemantics(TigerScope scope, Report report) { ContainingScope = scope; //Checking children IdNode.CheckSemantics(scope, report); Arguments.ToList().ForEach(e => e.CheckSemantics(scope, report)); if (!IdNode.IsOK || Arguments.Any(e => !e.IsOK)) { return; } //Checking existence of function FunctionInfo = scope.FindFunction(IdNode.Name); if (FunctionInfo == null) { report.AddError(SemanticErrors.NonExistentFunctionReference(IdNode, IdNode.Name)); } else { TigerType = FunctionInfo.ReturnType; //Checking parameters if (Arguments.Length != FunctionInfo.ParameterNumber) { report.AddError(SemanticErrors.WrongNumberOfParameters(IdNode, FunctionInfo.Name, FunctionInfo.ParameterNumber, Arguments.Length)); } else { for (int i = 0; i < Arguments.Length; i++) { if (!FunctionInfo.Parameters[i].Assignable(Arguments[i].TigerType)) { report.AddError(SemanticErrors.InvalidArgumentType(Arguments[i], Arguments[i].TigerType, FunctionInfo.Parameters[i])); } } } } }