Esempio n. 1
0
    //type VarPrimitive(identity expression) { VarPrimitive(identity expression) }
    void VarCreate(YSParseNode VarCreateNode)
    {
        Current = VarCreateNode;
        List <int>   Dimensions;
        IdentityType _DataType;

        DataType(VarCreateNode.Children [0], out _DataType, out Dimensions);
        if (Dimensions != null)
        {
            YSToken NameToken = VarCreateNode.Children [1].Token;
            if (VarCreateNode.Children [2].Type == NType.ExpressionList)
            {
                IdentityType ResolvedType       = IdentityType.Unknown;
                List <int>   ReversedDimensions = new List <int> ();
                IDPacket     exp_list           = ExpressionList(VarCreateNode.Children [2], ref ReversedDimensions, ref ResolvedType);
                IDPacket     put = IDPacket.CreateIDPacket(STATE, NameToken.Content, IdentityType.Structure);
                put.ArrayType = ResolvedType;
                ReversedDimensions.Reverse();
                ArrayFrame AF = new ArrayFrame(put.ArrayType, ReversedDimensions.ToArray());
                STATE.PutGeneric(put, AF);

                GenericFrame CastedGeneric;
                ArrayFrame   AF_Casted;
                STATE.TryGetGeneric(put, out CastedGeneric);
                AF_Casted = (ArrayFrame)CastedGeneric;

                STATE.COPY(put, exp_list);
                Debug("T");
            }
            else if (VarCreateNode.Children [2].Type == NType.ArrayInit)
            {
                //TODO array initializer
            }
            else
            {
                Error("Arrays must be initialized with an expression list or array initializer");
            }
        }
        else
        {
            for (int i = 1; i < VarCreateNode.Children.Count; i++)
            {
                VarPrimitive(VarCreateNode.Children [i], _DataType);
            }
        }
        Debug("Exit VarCreate");
    }
Esempio n. 2
0
    //type VarPrimitive(identity expression) { VarPrimitive(identity expression) }
    void VarCreate(YSParseNode VarCreateNode)
    {
        Current = VarCreateNode;
        List<int> Dimensions;
        IdentityType _DataType;
        DataType (VarCreateNode.Children [0], out _DataType, out Dimensions);
        if (Dimensions != null) {
            YSToken NameToken = VarCreateNode.Children [1].Token;
            if (VarCreateNode.Children [2].Type == NType.ExpressionList) {
                IdentityType ResolvedType = IdentityType.Unknown;
                List<int> ReversedDimensions = new List<int> ();
                IDPacket exp_list = ExpressionList (VarCreateNode.Children [2], ref ReversedDimensions, ref ResolvedType);
                IDPacket put = IDPacket.CreateIDPacket (STATE, NameToken.Content, IdentityType.Structure);
                put.ArrayType = ResolvedType;
                ReversedDimensions.Reverse ();
                ArrayFrame AF = new ArrayFrame (put.ArrayType, ReversedDimensions.ToArray());
                STATE.PutGeneric (put, AF);

                GenericFrame CastedGeneric;
                ArrayFrame AF_Casted;
                STATE.TryGetGeneric (put, out CastedGeneric);
                AF_Casted = (ArrayFrame)CastedGeneric;

                STATE.COPY (put, exp_list);
                Debug ("T");
            } else if(VarCreateNode.Children [2].Type == NType.ArrayInit) {
                //TODO array initializer
            } else {
                Error("Arrays must be initialized with an expression list or array initializer");
            }
        } else {
            for (int i = 1; i < VarCreateNode.Children.Count; i++) {
                VarPrimitive (VarCreateNode.Children [i], _DataType);
            }
        }
        Debug ("Exit VarCreate");
    }
Esempio n. 3
0
    IDPacket ExpressionList(YSParseNode ExpressionListNode, ref List<int> DimensionsReversed, ref IdentityType ResolvedType)
    {
        DIMCNT = 0;
        Debug ("Expression List Resolving");
        //STATE.PutStructure (ARRAY, ArrayFrame);

        if (ExpressionListNode.Children.Count < 1) {
            Debug ("Expression List had no children");
            return null;
        }

        IDPacket ARRAY = IDPacket.CreateSystemPacket ("EXPL_TEMP", IdentityType.Structure);
        ScopeFrame ArrayScope = new ScopeFrame (new StructureFrame(), ARRAY.Name, ScopeFrame.FrameTypes.None);
        STATE.PushScope (ArrayScope);

        //List<IDPacket> RESULT = new List<IDPacket> ();
        //Look at the first node, all other nodes must conform to this node's type
        int NC = 0;
        YSParseNode FirstNode = ExpressionListNode.Children [NC++];
        //IdentityType ListType;
        int ListDimensions = 0;
        if (FirstNode.Type == NType.ExpressionList) {
            ListDimensions++;
            IDPacket IEXPL = ExpressionList (FirstNode, ref DimensionsReversed, ref ResolvedType);
            DimensionsReversed.AddRange (new List<int>(DimensionsReversed));
            //RESULT.Add (IEXPL);
            IDPacket FIRST = IDPacket.CreateIDPacket (STATE, "0", IdentityType.Structure);
            STATE.COPY (FIRST, IEXPL);
        } else {
            IDPacket EXP = Expression (FirstNode);
            ResolvedType = EXP.Type;
            if (!STATE.IsPrimitive (ResolvedType))
                Error ("Expression Lists can only contain identities that resolve to Primitive Types");
            //RESULT.Add (EXP);
            IDPacket FIRST = IDPacket.CreateIDPacket (STATE, "0", EXP.Type);
            STATE.COPY (FIRST, EXP);
        }
        int ELEMENT_COUNT = 1;
        while (NC < ExpressionListNode.Children.Count) {
            YSParseNode Node = ExpressionListNode.Children [NC++];
            if (Node.Type != FirstNode.Type)
                Error (String.Format("All children in an expression list must have the same dimensions " +
                    "Expecting {0} got {1}",
                    FirstNode.Type, Node.Type));
            if (FirstNode.Type == NType.ExpressionList) {
                IdentityType NodeType = IdentityType.Unknown;
                int NodeDimensions = 0;
                IDPacket NEXPL = ExpressionList (Node, ref DimensionsReversed, ref NodeType);
                if (NodeDimensions != ListDimensions) {
                    Error (String.Format ("All children of an expression list must have matching dimensions. " +
                    "Expected dimensions:{0} Found:{1}",
                        ListDimensions, NodeDimensions));
                }
                if (NodeType != ResolvedType) {
                    Error (String.Format ("All children of an expression list must have matching types. " +
                    "Expected type:{0} Found:{1}",
                        ResolvedType, NodeType));
                }
                //RESULT.Add (NEXPL);
                IDPacket NODE = IDPacket.CreateIDPacket (STATE, "" + ELEMENT_COUNT++, IdentityType.Structure);
                STATE.COPY (NODE, NEXPL);
            } else {
                IDPacket NEXP = Expression (Node);
                if (NEXP.Type != ResolvedType) {
                    Error (String.Format ("All children of an expression list must have matching types. " +
                    "Expected type:{0} Found:{1}",
                        ResolvedType, NEXP.Type));
                }
                //RESULT.Add (NEXP);
                IDPacket NODE = IDPacket.CreateIDPacket (STATE, "" + ELEMENT_COUNT++, NEXP.Type);
                STATE.COPY (NODE, NEXP);
            }
        }
        DIMCNT = ELEMENT_COUNT;
        DimensionsReversed.Add (DIMCNT);

        ArrayScope = STATE.PopScopeNoSave ();

        ArrayFrame ArrayFrame = new ArrayFrame (new IdentityType[] { ResolvedType });
        ArrayFrame.Merge ((GenericFrame)ArrayScope);
        ArrayFrame.ResolvedType = ResolvedType;
        DimensionsReversed.Reverse ();
        ArrayFrame.Dimensions = DimensionsReversed.ToArray();
        ARRAY.ArrayType = ResolvedType;
        STATE.PutGeneric (ARRAY, ArrayFrame);

        //ResolvedType = RESOLVED_TYPE;
        return ARRAY;
    }
Esempio n. 4
0
    IDPacket ExpressionList(YSParseNode ExpressionListNode, ref List <int> DimensionsReversed, ref IdentityType ResolvedType)
    {
        DIMCNT = 0;
        Debug("Expression List Resolving");
        //STATE.PutStructure (ARRAY, ArrayFrame);

        if (ExpressionListNode.Children.Count < 1)
        {
            Debug("Expression List had no children");
            return(null);
        }

        IDPacket   ARRAY      = IDPacket.CreateSystemPacket("EXPL_TEMP", IdentityType.Structure);
        ScopeFrame ArrayScope = new ScopeFrame(new StructureFrame(), ARRAY.Name, ScopeFrame.FrameTypes.None);

        STATE.PushScope(ArrayScope);

        //List<IDPacket> RESULT = new List<IDPacket> ();
        //Look at the first node, all other nodes must conform to this node's type
        int         NC        = 0;
        YSParseNode FirstNode = ExpressionListNode.Children [NC++];
        //IdentityType ListType;
        int ListDimensions = 0;

        if (FirstNode.Type == NType.ExpressionList)
        {
            ListDimensions++;
            IDPacket IEXPL = ExpressionList(FirstNode, ref DimensionsReversed, ref ResolvedType);
            DimensionsReversed.AddRange(new List <int>(DimensionsReversed));
            //RESULT.Add (IEXPL);
            IDPacket FIRST = IDPacket.CreateIDPacket(STATE, "0", IdentityType.Structure);
            STATE.COPY(FIRST, IEXPL);
        }
        else
        {
            IDPacket EXP = Expression(FirstNode);
            ResolvedType = EXP.Type;
            if (!STATE.IsPrimitive(ResolvedType))
            {
                Error("Expression Lists can only contain identities that resolve to Primitive Types");
            }
            //RESULT.Add (EXP);
            IDPacket FIRST = IDPacket.CreateIDPacket(STATE, "0", EXP.Type);
            STATE.COPY(FIRST, EXP);
        }
        int ELEMENT_COUNT = 1;

        while (NC < ExpressionListNode.Children.Count)
        {
            YSParseNode Node = ExpressionListNode.Children [NC++];
            if (Node.Type != FirstNode.Type)
            {
                Error(String.Format("All children in an expression list must have the same dimensions " +
                                    "Expecting {0} got {1}",
                                    FirstNode.Type, Node.Type));
            }
            if (FirstNode.Type == NType.ExpressionList)
            {
                IdentityType NodeType       = IdentityType.Unknown;
                int          NodeDimensions = 0;
                IDPacket     NEXPL          = ExpressionList(Node, ref DimensionsReversed, ref NodeType);
                if (NodeDimensions != ListDimensions)
                {
                    Error(String.Format("All children of an expression list must have matching dimensions. " +
                                        "Expected dimensions:{0} Found:{1}",
                                        ListDimensions, NodeDimensions));
                }
                if (NodeType != ResolvedType)
                {
                    Error(String.Format("All children of an expression list must have matching types. " +
                                        "Expected type:{0} Found:{1}",
                                        ResolvedType, NodeType));
                }
                //RESULT.Add (NEXPL);
                IDPacket NODE = IDPacket.CreateIDPacket(STATE, "" + ELEMENT_COUNT++, IdentityType.Structure);
                STATE.COPY(NODE, NEXPL);
            }
            else
            {
                IDPacket NEXP = Expression(Node);
                if (NEXP.Type != ResolvedType)
                {
                    Error(String.Format("All children of an expression list must have matching types. " +
                                        "Expected type:{0} Found:{1}",
                                        ResolvedType, NEXP.Type));
                }
                //RESULT.Add (NEXP);
                IDPacket NODE = IDPacket.CreateIDPacket(STATE, "" + ELEMENT_COUNT++, NEXP.Type);
                STATE.COPY(NODE, NEXP);
            }
        }
        DIMCNT = ELEMENT_COUNT;
        DimensionsReversed.Add(DIMCNT);

        ArrayScope = STATE.PopScopeNoSave();

        ArrayFrame ArrayFrame = new ArrayFrame(new IdentityType[] { ResolvedType });

        ArrayFrame.Merge((GenericFrame)ArrayScope);
        ArrayFrame.ResolvedType = ResolvedType;
        DimensionsReversed.Reverse();
        ArrayFrame.Dimensions = DimensionsReversed.ToArray();
        ARRAY.ArrayType       = ResolvedType;
        STATE.PutGeneric(ARRAY, ArrayFrame);

        //ResolvedType = RESOLVED_TYPE;
        return(ARRAY);
    }