public override object VisitFunctionVariableDeclarationStatement([NotNull] ClepsParser.FunctionVariableDeclarationStatementContext context)
        {
            IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);

            ClepsType variableType = Visit(context.typename()) as ClepsType;
            string    variableName = Visit(context.variable()) as string;

            VariableManager variableManager = VariableManagers.Last();

            if (!variableManager.IsVariableNameAvailable(variableName))
            {
                string errorMessage = String.Format("Variable {0} is already defined", variableName);
                Status.AddError(new CompilerError(FileName, context.Start.Line, context.Start.Column, errorMessage));
                //Use a different variable name to avoid stopping the compilation
                variableName = variableManager.GetAvailableVariableName(variableName);
            }

            ClepsVariable variable = new ClepsVariable(variableName, variableType);
            IValue        value    = null;

            if (context.rightHandExpression() != null)
            {
                value = Visit(context.rightHandExpression()) as IValue;
                if (variable.VariableType != value.ExpressionType)
                {
                    throw new NotImplementedException("Assignment for non identical types not supported yet");
                }
            }

            IValueRegister variableRegister = methodRegister.CreateNewVariable(variable, value);

            variableManager.AddLocalVariable(variable, variableRegister);

            return(variable);
        }
        public override object VisitFunctionAssignment_Ex([NotNull] ClepsParser.FunctionAssignmentContext context)
        {
            VariableManager variableManager = new VariableManager();

            VariableManagers.Add(variableManager);

            ClepsType returnType = VoidType.GetVoidType();

            if (context.FunctionReturnType != null)
            {
                returnType = Visit(context.FunctionReturnType) as ClepsType;
            }

            List <ClepsType>  parameterTypes = context._FunctionParameterTypes.Select(t => Visit(context.FunctionReturnType) as ClepsType).ToList();
            FunctionClepsType functionType   = new FunctionClepsType(parameterTypes, returnType);

            IMethodRegister methodRegister       = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);
            var             formalParameterNames = context._FormalParameters.Select(p => Visit(p) as string).ToList();

            methodRegister.SetFormalParameterNames(formalParameterNames);

            formalParameterNames.Zip(parameterTypes, (name, clepsType) => new ClepsVariable(name, clepsType))
            .ToList().ForEach(variable =>
            {
                variableManager.AddLocalVariable(variable, methodRegister.GetFormalParameterRegister(variable.VariableName));
            });

            Visit(context.statementBlock());
            VariableManagers.RemoveAt(VariableManagers.Count - 1);
            return(functionType);
        }
        public override object VisitNativeStatement([NotNull] ClepsParser.NativeStatementContext context)
        {
            IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);
            var             startIndex     = context.NativeOpen.StopIndex + 1;
            var             endIndex       = context.NativeClose.StartIndex - 1;
            var             length         = endIndex - startIndex + 1;
            var             nativeCode     = System.IO.File.ReadAllText(FileName).Substring(startIndex, length) + "\n";

            methodRegister.AddNativeCode(nativeCode);
            return(true);
        }
        public override object VisitFunctionCallStatement([NotNull] ClepsParser.FunctionCallStatementContext context)
        {
            IValue expressionValue     = Visit(context.rightHandExpression()) as IValue;
            bool   isMembersAccessible = !expressionValue.ExpressionType.IsStaticType;

            IValue          ret            = doFunctionCall(context.functionCall(), expressionValue.ExpressionType, isMembersAccessible, true /* allowVoidReturn */);
            IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);

            methodRegister.CreateFunctionCallStatement(ret);

            return(ret);
        }
        public override object VisitIfStatement([NotNull] ClepsParser.IfStatementContext context)
        {
            IValue          conditionValue = Visit(context.rightHandExpression()) as IValue;
            IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);

            methodRegister.CreateIfStatementBlock(conditionValue);

            Visit(context.statementBlock());

            methodRegister.CloseBlock();

            return(conditionValue);
        }
        private void CreateAssignment(IValueRegister register, ClepsParser.RightHandExpressionContext rightHandExpression)
        {
            IValue value = Visit(rightHandExpression) as IValue;

            if (register.ExpressionType == value.ExpressionType && register.ExpressionType == CompilerConstants.ClepsByteType)
            {
                IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);
                methodRegister.CreateAssignment(register, value);
            }
            else
            {
                throw new NotImplementedException("assignment for non byte types not supported yet");
            }
        }
        public override object VisitFunctionReturnStatement_Ex([NotNull] ClepsParser.FunctionReturnStatementContext context)
        {
            IValue returnValue = null;

            if (context.rightHandExpression() != null)
            {
                returnValue = Visit(context.rightHandExpression()) as IValue;
            }

            var currFunctionType = CurrMemberType as FunctionClepsType;

            if (currFunctionType.ReturnType != returnValue.ExpressionType)
            {
                string errorMessage = String.Format("Expected return of {0}. Returning type {1} instead.", currFunctionType.ReturnType.GetClepsTypeString(), returnValue.ExpressionType.GetClepsTypeString());
                Status.AddError(new CompilerError(FileName, context.rightHandExpression().Start.Line, context.rightHandExpression().Start.Column, errorMessage));
            }

            IMethodRegister methodRegister = CodeGenerator.GetMethodRegister(FullyQualifiedClassName, CurrMemberIsStatic, CurrMemberType, CurrMemberName);

            methodRegister.CreateReturnStatement(returnValue);

            return(returnValue);
        }