public override void CaseALvalueExp(ALvalueExp node) { InALvalueExp(node); if (node.GetLvalue() != null) { node.GetLvalue().Apply(this); } OutALvalueExp(node); }
public override void CaseAAssignmentExp(AAssignmentExp node) { ALvalueExp replacer = new ALvalueExp(node.GetLvalue()); data.ExpTypes[replacer] = data.LvalueTypes[replacer.GetLvalue()]; node.ReplaceBy(replacer); replacer.Apply(this); }
private void MakeAssignmentLeftDynamic(PExp leftSide, PExp rightSide, PType type, AABlock block, ref int index) { if (Util.IsBulkCopy(type)) { if (type is ANamedType) { ANamedType aType = (ANamedType)type; AStructDecl structDecl = data.StructTypeLinks[aType]; foreach (AALocalDecl localDecl in structDecl.GetLocals()) { ABinopExp newleftSide = new ABinopExp(leftSide, new APlusBinop(new TPlus("+")), new AStringConstExp( new TStringLiteral("\"." + localDecl.GetName().Text + "\""))); ALvalueExp newrightSide = new ALvalueExp(new AStructLvalue(rightSide, new ADotDotType(new TDot(".")), new TIdentifier(localDecl.GetName().Text))); data.ExpTypes[newleftSide] = data.ExpTypes[newrightSide] = data.ExpTypes[newleftSide.GetRight()] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[newrightSide] = data.LvalueTypes[newrightSide.GetLvalue()] = localDecl.GetType(); data.StructFieldLinks[(AStructLvalue) newrightSide.GetLvalue()] = localDecl; MakeAssignmentLeftDynamic(newleftSide, newrightSide, localDecl.GetType(), block, ref index); } } else {//Is array type. Can Only be a constant array type AArrayTempType aType = (AArrayTempType)type; for (int i = 0; i < int.Parse(aType.GetIntDim().Text); i++) { ABinopExp newleftSide = new ABinopExp(leftSide, new APlusBinop(new TPlus("+")), new AStringConstExp( new TStringLiteral("\"[" + i + "]\""))); AArrayLvalue rightLvalue = new AArrayLvalue(new TLBracket("["), rightSide, new AIntConstExp(new TIntegerLiteral(i.ToString()))); ALvalueExp newrightSide = new ALvalueExp(rightLvalue); data.ExpTypes[newleftSide] = data.ExpTypes[newrightSide] = data.ExpTypes[newleftSide.GetRight()] = new ANamedType(new TIdentifier("string"), null); data.ExpTypes[newrightSide] = data.LvalueTypes[rightLvalue] = aType.GetType(); data.ExpTypes[rightLvalue.GetIndex()] = new ANamedType(new TIdentifier("int"), null); MakeAssignmentLeftDynamic(newleftSide, newrightSide, aType.GetType(), block, ref index); } } } else { ANamedType aType = type is APointerType ? new ANamedType(new TIdentifier(Util.IsIntPointer(type, ((APointerType)type).GetType(), data) ? "int" : "string"), null) : (ANamedType)type; string capitalType = Util.Capitalize(aType.AsIdentifierString());// Char.ToUpper(aType.GetName().Text[0]) + aType.GetName().Text.Substring(1); leftSide = Util.MakeClone(leftSide, data); rightSide = Util.MakeClone(rightSide, data); ABooleanConstExp trueConst1 = new ABooleanConstExp(new ATrueBool()); ABooleanConstExp trueConst2 = new ABooleanConstExp(new ATrueBool()); ASimpleInvokeExp outerInvoke = new ASimpleInvokeExp(new TIdentifier("DataTableSet" + capitalType), new ArrayList() { trueConst2, leftSide, rightSide }); block.GetStatements().Insert(index, new AExpStm(new TSemicolon(";"), outerInvoke)); index++; data.ExpTypes[trueConst1] = data.ExpTypes[trueConst2] = new ANamedType(new TIdentifier("bool"), null); data.ExpTypes[outerInvoke] = new AVoidType(new TVoid("void")); data.SimpleMethodLinks[outerInvoke] = data.Libraries.Methods.First(m => m.GetName().Text == outerInvoke.GetName().Text); } }
public override void OutALvalueExp(ALvalueExp node) { if (!(node.GetLvalue() is AAmbiguousNameLvalue || node.GetLvalue() is ANamespaceLvalue || node.GetLvalue() is ATypeLvalue)) if (node.Parent() != null) //If I havent been replaced data.ExpTypes[node] = data.LvalueTypes[node.GetLvalue()]; base.OutALvalueExp(node); }
public override void OutALvalueExp(ALvalueExp node) { data.ExpTypes[node] = data.LvalueTypes[node.GetLvalue()]; }