Exemplo n.º 1
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);
        }
Exemplo n.º 2
0
        public override void OutADynamicArrayType(ADynamicArrayType node)
        {
            if (pointeredArrays.Contains(node))
            {
                return;
            }
            pointeredArrays.Add(node);
            APointerType replacer = new APointerType(new TStar("*"), null);

            node.ReplaceBy(replacer);
            replacer.SetType(node);
        }
Exemplo n.º 3
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");
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
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());
 }