public ExprRecResult Recognize(CodeString Code, PluginRoot Plugin, ref ExpressionNode Out)
        {
            var Result = Code.StartsWith(Operators, Skip, new IdCharCheck(true));

            if (Result.Position != -1)
            {
                var State = Plugin.State;
                var Right = Code.Substring(Result.String.Length).Trim();
                Right = Right.TrimOneBracket(SkippingHandlers);

                if (Right.Length == 0)
                {
                    State.Messages.Add(MessageId.DeficientExpr, Code);
                    return(ExprRecResult.Failed);
                }

                var TypeMngrPlugin = Plugin.GetPlugin <TypeMngrPlugin>();
                if (TypeMngrPlugin == null)
                {
                    return(ExprRecResult.Unknown);
                }

                var OldCheckingMode = TypeMngrPlugin.CheckingMode;
                if (Result.Index == 0)
                {
                    TypeMngrPlugin.CheckingMode = CheckingMode.Checked;
                }
                else if (Result.Index == 1)
                {
                    TypeMngrPlugin.CheckingMode = CheckingMode.Unchecked;
                }
                else
                {
                    throw new ApplicationException();
                }

                Out = Expressions.Recognize(Right, Plugin);
                TypeMngrPlugin.CheckingMode = OldCheckingMode;

                if (Out == null)
                {
                    return(ExprRecResult.Failed);
                }
                else
                {
                    return(ExprRecResult.Ready);
                }
            }

            return(ExprRecResult.Unknown);
        }
Exemple #2
0
        private bool AllocateObject(CodeScopeNode Scope, ref int Index, SelfVariable Self, ExpressionNode Size, PluginRoot Plugin, CodeString Code)
        {
            var TypeMngrPlugin = Plugin.GetPlugin <TypeMngrPlugin>();

            TypeMngrPlugin.Flags |= TypeMngrPluginFlags.NoWarningOnCastingToSameType;
            TypeMngrPlugin.Flags |= TypeMngrPluginFlags.EnableReadonlyWriting;

            var Func = Identifiers.GetByFullNameFast <Function>(Scope.State, "Internals.ObjectHelper.Allocate");

            if (Func == null)
            {
                return(false);
            }

            var FuncNode = Plugin.NewNode(new IdExpressionNode(Func, Code));

            if (Func == null)
            {
                return(false);
            }

            var FuncType  = Func.Children[0] as TypeOfFunction;
            var SizeParam = FuncType.Children[1] as FunctionParameter;

            if (Size.Type == null || !Size.Type.IsEquivalent(SizeParam.TypeOfSelf))
            {
                Size = Expressions.Convert(Size, SizeParam.TypeOfSelf, Plugin, Code);
                if (Size == null)
                {
                    return(false);
                }
            }

            var CallCh = new ExpressionNode[] { FuncNode, Size };
            var Call   = Plugin.NewNode(new OpExpressionNode(Operator.Call, CallCh, Code));

            if (Call == null)
            {
                return(false);
            }

            var Node = Expressions.Reinterpret(Call, Self.TypeOfSelf, Plugin, Code);

            if (Node == null)
            {
                return(false);
            }

            var FS         = Scope.FunctionScope;
            var Assignment = Expressions.SetValue(FS.SelfVariable, Node, Plugin, Code, true);

            if (Assignment == null)
            {
                return(false);
            }

            var Command = new Command(Scope, Code, CommandType.Expression);

            Command.Expressions = new List <ExpressionNode>()
            {
                Assignment
            };
            Scope.Children.Insert(Index, Command);
            Index++;

            return(ProcessContainer(Command));
        }
Exemple #3
0
        public static ExpressionNode FlattenIndices(PluginRoot Plugin, ExpressionNode[] Indices,
                                                    ExpressionNode[] Dimensions, CodeString Code, Identifier TempVarType = null)
        {
            if (Dimensions.Length == 1)
            {
                return(Indices[0]);
            }

            var Ret       = (ExpressionNode)null;
            var MulVar    = (Identifier)null;
            var Container = Plugin.Container;
            var State     = Plugin.State;

            if (Dimensions.Length >= 2)
            {
                var NCPlugin      = Plugin.GetPlugin <NCPlugin>();
                var DeclContainer = NCPlugin.DeclContainer;
                MulVar = DeclContainer.CreateAndDeclareVariable(State.AutoVarName, TempVarType);
                if (MulVar == null)
                {
                    return(null);
                }
            }

            for (var i = Dimensions.Length - 1; i >= 0; i--)
            {
                var Chi        = Indices[i];
                var LinkedNode = (LinkedExprNode)null;
                if (MulVar != null && i != 1)
                {
                    ExpressionNode[] AssignmentCh;
                    if (i == Dimensions.Length - 1)
                    {
                        var Dst = Plugin.NewNode(new IdExpressionNode(MulVar, Code));
                        if (Dst == null)
                        {
                            return(null);
                        }

                        AssignmentCh = new ExpressionNode[] { Dst, Dimensions[i] };
                    }
                    else
                    {
                        var Dst    = Plugin.NewNode(new IdExpressionNode(MulVar, Code));
                        var MulSrc = Plugin.NewNode(new IdExpressionNode(MulVar, Code));
                        if (Dst == null || MulSrc == null)
                        {
                            return(null);
                        }

                        var MulCh   = new ExpressionNode[] { MulSrc, Dimensions[i] };
                        var MulNode = Plugin.NewNode(new OpExpressionNode(Operator.Multiply, MulCh, Code));
                        if (MulNode == null)
                        {
                            return(null);
                        }

                        AssignmentCh = new ExpressionNode[] { Dst, MulNode };
                    }

                    var Assignment = Plugin.NewNode(new OpExpressionNode(Operator.Assignment, AssignmentCh, Code));
                    if (Assignment == null)
                    {
                        return(null);
                    }

                    LinkedNode = new LinkedExprNode(Assignment, LinkedNodeFlags.NotRemovable);
                }

                if (MulVar != null && i != Dimensions.Length - 1)
                {
                    var MulNode = Plugin.NewNode(new IdExpressionNode(MulVar, Code));
                    if (MulNode == null)
                    {
                        return(null);
                    }

                    var MulCh = new ExpressionNode[] { Chi, MulNode };
                    Chi = Plugin.NewNode(new OpExpressionNode(Operator.Multiply, MulCh, Code));
                    if (Chi == null)
                    {
                        return(null);
                    }
                }

                if (Ret != null)
                {
                    var AddCh   = new ExpressionNode[] { Ret, Chi };
                    var AddNode = new OpExpressionNode(Operator.Add, AddCh, Code);
                    if (LinkedNode != null)
                    {
                        AddNode.LinkedNodes.Add(LinkedNode);
                    }

                    Ret = Plugin.NewNode(AddNode);
                    if (Ret == null)
                    {
                        return(null);
                    }
                }
                else
                {
                    Ret = Chi;
                    if (LinkedNode != null)
                    {
                        Ret.LinkedNodes.Add(LinkedNode);
                    }
                }
            }

            return(Ret);
        }