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"); }
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; }
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); }
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)); }
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"); }
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); }
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); }
public override void CaseAArrayTempType(AArrayTempType node) { node.GetType().Apply(this); Write("[" + node.GetIntDim().Text + "]"); }
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); }
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()); }