Пример #1
0
        private PLvalue DetypeArray(PType type)
        {
            if (type is AArrayTempType)
            {
                AArrayTempType atype = (AArrayTempType)type;
                return(new AArrayLvalue(atype.GetToken(), new ALvalueExp(DetypeArray(atype.GetType())),
                                        atype.GetDimention()));
            }
            if (type is ANamedType)
            {
                ANamedType atype = (ANamedType)type;
                return(new AAmbiguousNameLvalue(atype.GetName()));
            }
            if (type is AVoidType)
            {
                AVoidType atype = (AVoidType)type;
                throw new Exception(Util.TokenToStringPos(atype.GetToken()) + " (Weeder)Unexpected type: void. It should not be possible for this error to occur");
            }

            /*if (type is AArrayType)
             * {
             *  AArrayType atype = (AArrayType)type;
             *  throw new Exception(Util.TokenToStringPos(atype.GetToken()) + " (Weeder)Unexpected type: ArrayType. It should not be possible for this error to occur");
             * }*/
            throw new Exception("(Weeder)Unexpected type: none. It should not be possible for this error to occur");
        }
Пример #2
0
        public override void CaseAArrayTempType(AArrayTempType node)
        {
            bool prevFolding = folding;
            int  prevValue   = value;
            bool wasANewExp  = isANewExp;

            isANewExp = Util.HasAncestor <ANewExp>(node);
            if (!isANewExp)
            {
                folding = true;
                value   = 0;
                base.CaseAArrayTempType(node);
                if (value <= 0)
                {
                    if (value < 0)
                    {
                        errors.Add(new ErrorCollection.Error(node.GetToken(), "Array dimention must be greater than 0."));
                    }
                    value = 1;
                }
                node.SetIntDim(new TIntegerLiteral(value.ToString()));
            }
            folding   = prevFolding;
            value     = prevValue;
            isANewExp = wasANewExp;
        }
Пример #3
0
        private PType LvalueToType(PLvalue lvalue, IList dynamicOpList, TLt genericToken, IList genericTypes)
        {
            PType type = LvalueToType(lvalue);

            if (genericToken != null)
            {
                type = new AGenericType(genericToken, type, new ArrayList());
                while (genericTypes.Count > 0)
                {
                    ((AGenericType)type).GetGenericTypes().Add(genericTypes[0]);
                }
            }
            foreach (PShadyDynamicOps op in dynamicOpList)
            {
                if (op is APointerShadyDynamicOps)
                {
                    APointerShadyDynamicOps aop = (APointerShadyDynamicOps)op;
                    type = new APointerType(aop.GetToken(), type);
                }
                else if (op is AArrayShadyDynamicOps)
                {
                    AArrayShadyDynamicOps aop = (AArrayShadyDynamicOps)op;
                    if (aop.GetExp() == null)
                    {
                        type = new ADynamicArrayType(aop.GetToken(), type);
                    }
                    else
                    {
                        type = new AArrayTempType(aop.GetToken(), type, aop.GetExp(), null);
                    }
                }
            }
            return(type);
        }
Пример #4
0
 private string TypeToString(PType type)
 {
     if (type is AArrayTempType)
     {
         AArrayTempType aType = (AArrayTempType)type;
         return(TypeToString(aType.GetType()) + "[" +
                ((AIntConstExp)aType.GetDimention()).GetIntegerLiteral().Text + "]");
     }
     return(Util.TypeToString(type));
 }
Пример #5
0
        public static string TypeToIdentifierString(PType type)
        {
            if (type is AVoidType)
            {
                return("void");
            }

            /*if (type is AArrayType)
             * {
             *  AArrayType aType = (AArrayType)type;
             *  return TypeToString(aType.GetType()) + "[" + aType.GetDimention().Text + "]";
             * }*/
            if (type is AArrayTempType)
            {
                AArrayTempType aType = (AArrayTempType)type;
                return(TypeToIdentifierString(aType.GetType()) + "Ar" + (aType.GetIntDim() == null ? "" : aType.GetIntDim().Text));
            }
            if (type is ANamedType)
            {
                ANamedType aType = (ANamedType)type;
                return(((AAName)aType.GetName()).AsString().Replace('.', '_'));
            }
            if (type is APointerType)
            {
                APointerType aType = (APointerType)type;
                return("p" + TypeToIdentifierString(aType.GetType()));
            }
            if (type is ADynamicArrayType)
            {
                ADynamicArrayType aType = (ADynamicArrayType)type;
                return(TypeToIdentifierString(aType.GetType()) + "DAr");
            }
            if (type is AGenericType)
            {
                AGenericType aType = (AGenericType)type;
                string       ret   = TypeToIdentifierString(aType.GetBase()) + "G_";
                bool         first = true;
                foreach (PType t in aType.GetGenericTypes())
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        ret += "_";
                    }
                    ret += TypeToIdentifierString(t);
                }
                return(ret + "_G");
            }
            throw new Exception("Unknown type");
        }
Пример #6
0
        private void MakeAssignments(AABlock block, PType type, PLvalue leftSide, bool onEnhritedFields)
        {
            if (type is ANamedType && data.StructTypeLinks.ContainsKey((ANamedType)type))
            {
                AStructDecl str = data.StructTypeLinks[(ANamedType)type];
                foreach (AALocalDecl field in str.GetLocals().OfType <AALocalDecl>())
                {
                    if (!onEnhritedFields && data.EnheritanceLocalMap.ContainsKey(field))
                    {
                        continue;
                    }

                    ALvalueExp lvalueExp = new ALvalueExp(Util.MakeClone(leftSide, data));
                    data.ExpTypes[lvalueExp] = data.LvalueTypes[leftSide];
                    AStructLvalue newLeftSide = new AStructLvalue(lvalueExp, new ADotDotType(new TDot(".")), new TIdentifier(field.GetName().Text));
                    data.StructFieldLinks[newLeftSide] = field;
                    data.LvalueTypes[newLeftSide]      = field.GetType();

                    if (field.GetInit() != null)
                    {
                        AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), newLeftSide,
                                                                       Util.MakeClone(field.GetInit(), data));
                        data.ExpTypes[assignment] = data.LvalueTypes[newLeftSide];

                        block.GetStatements().Add(new AExpStm(new TSemicolon(";"),
                                                              assignment));
                    }
                    else
                    {
                        MakeAssignments(block, field.GetType(), newLeftSide, onEnhritedFields);
                    }
                }
            }
            else if (type is AArrayTempType)
            {
                AArrayTempType aType = (AArrayTempType)type;
                for (int i = 0; i < int.Parse(aType.GetIntDim().Text); i++)
                {
                    AIntConstExp index = new AIntConstExp(new TIntegerLiteral(i.ToString()));
                    data.ExpTypes[index] = new ANamedType(new TIdentifier("int"), null);

                    ALvalueExp lvalueExp = new ALvalueExp(Util.MakeClone(leftSide, data));
                    data.ExpTypes[lvalueExp] = data.LvalueTypes[leftSide];
                    AArrayLvalue newLeftSide = new AArrayLvalue(new TLBracket("["), lvalueExp, index);
                    data.LvalueTypes[newLeftSide] = aType.GetType();

                    MakeAssignments(block, aType.GetType(), newLeftSide, onEnhritedFields);
                }
            }
        }
        public override void InAArrayTempType(AArrayTempType node)
        {
            if (node.GetIntDim() == null && !Util.HasAncestor <ANewExp>(node))
            {
                node = node;

                /*bool valid = true;
                 * int val = FoldInt(node.GetDimention(), ref valid);
                 * if (!valid)
                 * {
                 *  errors.Add(new ErrorCollection.Error(node.GetToken(), "The dimension must be a constant expression."));
                 *  throw new ParserException(null, null);
                 * }
                 * node.SetIntDim(new TIntegerLiteral(val.ToString()));*/
            }
            base.InAArrayTempType(node);
        }
Пример #8
0
        private List <PStm> AssignDefault(PLvalue lvalue)
        {
            List <PStm> returner  = new List <PStm>();
            PType       type      = data.LvalueTypes[lvalue];
            PExp        rightSide = null;

            if (type is ANamedType)
            {
                ANamedType aType = (ANamedType)type;
                if (aType.IsPrimitive("string"))//aType.GetName().Text == "string")
                {
                    rightSide = new AStringConstExp(new TStringLiteral("\"\""));
                    data.ExpTypes[rightSide] = new ANamedType(new TIdentifier("string"), null);
                }
                else if (aType.IsPrimitive(GalaxyKeywords.NullablePrimitives.words)) //GalaxyKeywords.NullablePrimitives.words.Contains(aType.GetName().Text))
                {
                    rightSide = new ANullExp();
                    data.ExpTypes[rightSide] = new ANamedType(new TIdentifier("null"), null);
                }
                else if (aType.IsPrimitive(new [] { "int", "byte", "fixed" }))

                /*aType.GetName().Text == "int" ||
                *  aType.GetName().Text == "byte" ||
                *  aType.GetName().Text == "fixed")*/
                {
                    rightSide = new AIntConstExp(new TIntegerLiteral("0"));
                    data.ExpTypes[rightSide] = type;
                }
                else if (aType.IsPrimitive("bool"))//aType.GetName().Text == "bool")
                {
                    rightSide = new ABooleanConstExp(new AFalseBool());
                    data.ExpTypes[rightSide] = type;
                }
                else if (aType.IsPrimitive("color"))//aType.GetName().Text == "color")
                {
                    PExp             arg1   = new AIntConstExp(new TIntegerLiteral("0"));
                    PExp             arg2   = new AIntConstExp(new TIntegerLiteral("0"));
                    PExp             arg3   = new AIntConstExp(new TIntegerLiteral("0"));
                    ASimpleInvokeExp invoke = new ASimpleInvokeExp(new TIdentifier("Color"), new ArrayList()
                    {
                        arg1, arg2, arg3
                    });
                    rightSide = invoke;
                    data.ExpTypes[rightSide]       = type;
                    data.ExpTypes[arg1]            =
                        data.ExpTypes[arg2]        =
                            data.ExpTypes[arg3]    = new ANamedType(new TIdentifier("int"), null);
                    data.SimpleMethodLinks[invoke] =
                        data.Libraries.Methods.First(func => func.GetName().Text == invoke.GetName().Text);
                }
                else if (aType.IsPrimitive("char"))//aType.GetName().Text == "char")
                {
                    //Dunno?!
                    rightSide = new ACharConstExp(new TCharLiteral("'\0'"));
                    data.ExpTypes[rightSide] = type;
                }
                else //Struct
                {
                    AStructDecl str = data.StructTypeLinks[aType];
                    foreach (AALocalDecl localDecl in str.GetLocals())
                    {
                        ALvalueExp    reciever  = new ALvalueExp(Util.MakeClone(lvalue, data));
                        AStructLvalue newLvalue = new AStructLvalue(reciever, new ADotDotType(new TDot(".")), new TIdentifier(localDecl.GetName().Text));
                        data.StructFieldLinks[newLvalue] = localDecl;
                        data.ExpTypes[reciever]          = type;
                        data.LvalueTypes[newLvalue]      = localDecl.GetType();
                        returner.AddRange(AssignDefault(newLvalue));
                    }
                    return(returner);
                }
                AAssignmentExp assignment = new AAssignmentExp(new TAssign("="), Util.MakeClone(lvalue, data), rightSide);
                data.ExpTypes[assignment] = type;
                return(new List <PStm>()
                {
                    new AExpStm(new TSemicolon(";"), assignment)
                });
            }
            if (type is AArrayTempType)
            {
                AArrayTempType aType = (AArrayTempType)type;
                for (int i = 0; i < int.Parse(aType.GetIntDim().Text); i++)
                {
                    ALvalueExp   reciever  = new ALvalueExp(Util.MakeClone(lvalue, data));
                    AArrayLvalue newLvalue = new AArrayLvalue(new TLBracket("["), reciever, new AIntConstExp(new TIntegerLiteral(i.ToString())));
                    data.ExpTypes[reciever]             = type;
                    data.LvalueTypes[newLvalue]         = aType.GetType();
                    data.ExpTypes[newLvalue.GetIndex()] = new ANamedType(new TIdentifier("int"), null);
                    returner.AddRange(AssignDefault(newLvalue));
                }
                return(returner);
            }

            throw new Exception("Unexpected type. (LivenessAnalasys.AssignDefault), got " + type);
        }
Пример #9
0
 public override void CaseAArrayTempType(AArrayTempType node)
 {
     node.GetType().Apply(this);
     Write("[" + node.GetIntDim().Text + "]");
 }
Пример #10
0
        public static StringBuilder TypeToStringBuilder(PType type)
        {
            if (type is AVoidType)
            {
                return(new StringBuilder("void"));
            }

            /*if (type is AArrayType)
             * {
             *  AArrayType aType = (AArrayType)type;
             *  return TypeToString(aType.GetType()) + "[" + aType.GetDimention().Text + "]";
             * }*/
            if (type is AArrayTempType)
            {
                AArrayTempType aType = (AArrayTempType)type;

                StringBuilder builder = new StringBuilder();
                builder.Append(TypeToStringBuilder(aType.GetType()));
                builder.Append("[");
                if (aType.GetIntDim() != null)
                {
                    builder.Append(aType.GetIntDim().Text);
                }
                builder.Append("]");
                return(builder);
            }
            if (type is ANamedType)
            {
                ANamedType    aType   = (ANamedType)type;
                StringBuilder builder = new StringBuilder();
                foreach (TIdentifier identifier in ((AAName)aType.GetName()).GetIdentifier())
                {
                    if (builder.Length != 0)
                    {
                        builder.Append(".");
                    }
                    builder.Append(identifier.Text);
                }
                return(builder);
            }
            if (type is APointerType)
            {
                APointerType  aType   = (APointerType)type;
                StringBuilder builder = new StringBuilder();
                builder.Append(TypeToStringBuilder(aType.GetType()));
                builder.Append("*");
                return(builder);
            }
            if (type is ADynamicArrayType)
            {
                ADynamicArrayType aType   = (ADynamicArrayType)type;
                StringBuilder     builder = new StringBuilder();
                builder.Append(TypeToStringBuilder(aType.GetType()));
                builder.Append("[]");
                return(builder);
            }
            if (type is AGenericType)
            {
                AGenericType  aType   = (AGenericType)type;
                StringBuilder builder = new StringBuilder();
                builder.Append(TypeToStringBuilder(aType.GetBase()));
                builder.Append("<");
                bool first = true;
                foreach (PType t in aType.GetGenericTypes())
                {
                    if (first)
                    {
                        first = false;
                    }
                    else
                    {
                        builder.Append(", ");
                    }
                    builder.Append(TypeToStringBuilder(t));
                }
                builder.Append(">");
                return(builder);
            }
            throw new Exception("Unknown type. Got " + type);
        }
Пример #11
0
 public static bool TypesEqual(PType t1, PType t2, SharedData data)
 {
     if (t1.GetType() != t2.GetType())
     {
         return(false);
     }
     if (t1 is AVoidType)
     {
         return(true);
     }
     if (t1 is AArrayTempType)
     {
         AArrayTempType aT1 = (AArrayTempType)t1;
         AArrayTempType aT2 = (AArrayTempType)t2;
         return(TypesEqual(aT1.GetType(), aT2.GetType(), data) &&
                ReturnsTheSame(aT1.GetDimention(), aT2.GetDimention(), data));
     }
     if (t1 is ADynamicArrayType)
     {
         ADynamicArrayType aT1 = (ADynamicArrayType)t1;
         ADynamicArrayType aT2 = (ADynamicArrayType)t2;
         return(TypesEqual(aT1.GetType(), aT2.GetType(), data));
     }
     if (t1 is ANamedType)
     {
         ANamedType aT1 = (ANamedType)t1;
         ANamedType aT2 = (ANamedType)t2;
         if (aT1.IsPrimitive() && aT2.IsPrimitive())
         {
             return(((AAName)aT1.GetName()).AsString() == ((AAName)aT2.GetName()).AsString());
         }
         if (data.StructTypeLinks.ContainsKey(aT1) != data.StructTypeLinks.ContainsKey(aT2))
         {
             return(false);
         }
         if (data.StructTypeLinks.ContainsKey(aT1) && data.StructTypeLinks[aT1] != data.StructTypeLinks[aT2])
         {
             return(false);
         }
         if (data.DelegateTypeLinks.ContainsKey(aT1) != data.DelegateTypeLinks.ContainsKey(aT2))
         {
             return(false);
         }
         if (data.DelegateTypeLinks.ContainsKey(aT1) && data.DelegateTypeLinks[aT1] != data.DelegateTypeLinks[aT2])
         {
             return(false);
         }
         return(true);
     }
     if (t1 is ANullType)
     {
         return(true);
     }
     if (t1 is APointerType)
     {
         APointerType aT1 = (APointerType)t1;
         APointerType aT2 = (APointerType)t2;
         return(TypesEqual(aT1.GetType(), aT2.GetType(), data));
     }
     if (t1 is AGenericType)
     {
         AGenericType aT1 = (AGenericType)t1;
         AGenericType aT2 = (AGenericType)t2;
         if (!TypesEqual(aT1.GetBase(), aT2.GetBase(), data))
         {
             return(false);
         }
         if (aT1.GetGenericTypes().Count != aT2.GetGenericTypes().Count)
         {
             return(false);
         }
         for (int i = 0; i < aT1.GetGenericTypes().Count; i++)
         {
             if (!TypesEqual((PType)aT1.GetGenericTypes()[i], (PType)aT2.GetGenericTypes()[i], data))
             {
                 return(false);
             }
         }
         return(true);
     }
     throw new Exception("Util.TypesEqual: Unexpected type. Got + " + t1.GetType());
 }