public override ICallable getStaticCallable()
        {
            if (__staticCallable == null)
            {
                ICallable left = Left.getStaticCallable();
                if (left != null)
                {
                    ICallable right = Right.getStaticCallable();
                    if (right != null)
                    {
                        if (left.FormalParameters.Count == right.FormalParameters.Count)
                        {
                            bool match = true;
                            for (int i = 0; i < left.FormalParameters.Count; i++)
                            {
                                Types.Type leftType  = ((Parameter)left.FormalParameters[i]).Type;
                                Types.Type rightType = ((Parameter)right.FormalParameters[i]).Type;
                                if (!leftType.Equals(rightType))
                                {
                                    AddError("Non matching formal parameter type for parameter " + i + " " + leftType + " vs " + rightType);
                                    match = false;
                                }
                            }

                            if (left.ReturnType != right.ReturnType)
                            {
                                AddError("Non matching return types " + left.ReturnType + " vs " + right.ReturnType);
                                match = false;
                            }

                            if (match)
                            {
                                // Create a dummy funciton for type analysis
                                Function function = (Function)Generated.acceptor.getFactory().createFunction();
                                function.Name       = ToString();
                                function.ReturnType = left.ReturnType;
                                foreach (Parameter param in left.FormalParameters)
                                {
                                    Parameter parameter = (Parameter)Generated.acceptor.getFactory().createParameter();
                                    parameter.Name      = param.Name;
                                    parameter.Type      = param.Type;
                                    parameter.Enclosing = function;
                                    function.appendParameters(parameter);
                                }
                                function.Enclosing = Root;
                                __staticCallable   = function;
                            }
                        }
                        else
                        {
                            AddError("Invalid number of parameters, " + Left + " and " + Right + " should have the same number of parameters");
                        }
                    }
                    else
                    {
                        // Left is not null, but right is.
                        // Ensure that right type corresponds to left return type
                        // and return left
                        Types.Type rightType = Right.GetExpressionType();
                        if (rightType.Match(left.ReturnType))
                        {
                            __staticCallable = left;
                        }
                        else
                        {
                            AddError(Left + "(" + left.ReturnType + " ) does not correspond to " + Right + "(" + rightType + ")");
                        }
                    }
                }
                else
                {
                    ICallable right = Right.getStaticCallable();
                    if (right != null)
                    {
                        // Right is not null, but left is.
                        // Ensure that left type corresponds to right return type
                        // and return right
                        Types.Type leftType = Left.GetExpressionType();
                        if ((leftType.Match(right.ReturnType)))
                        {
                            __staticCallable = right;
                        }
                        else
                        {
                            AddError(Left + "(" + leftType + ") does not correspond to " + Right + "(" + right.ReturnType + ")");
                        }
                    }
                }
            }

            return(__staticCallable);
        }