public override void CaseAAssignmentExp(AAssignmentExp node) { if (!(node.Parent() is AExpStm)) { PStm parentStm = Util.GetAncestor<PStm>(node); MoveMethodDeclsOut mover = new MoveMethodDeclsOut("multipleAssignmentsVar", finalTrans.data); node.GetLvalue().Apply(mover); PLvalue lvalue = Util.MakeClone(node.GetLvalue(), finalTrans.data); ALvalueExp exp = new ALvalueExp(lvalue); finalTrans.data.ExpTypes[exp] = finalTrans.data.LvalueTypes[lvalue]; node.ReplaceBy(exp); AExpStm stm = new AExpStm(new TSemicolon(";"), node); AABlock block = (AABlock) parentStm.Parent(); //block.GetStatements().Insert(block.GetStatements().IndexOf(parentStm), localDeclStm); block.GetStatements().Insert(block.GetStatements().IndexOf(parentStm), stm); //localDeclStm.Apply(this); stm.Apply(this); if (parentStm is AWhileStm && Util.IsAncestor(exp, ((AWhileStm)parentStm).GetCondition())) { AWhileStm aStm = (AWhileStm)parentStm; //Copy assignment before continues //Before each continue in the while, and at the end. //Add continue statement, if not present block = (AABlock)((ABlockStm)aStm.GetBody()).GetBlock(); if (block.GetStatements().Count == 0 || !(block.GetStatements()[block.GetStatements().Count - 1] is AContinueStm)) block.GetStatements().Add(new AContinueStm(new TContinue("continue"))); //Get all continue statements in the while ContinueFinder finder = new ContinueFinder(); block.Apply(finder); foreach (AContinueStm continueStm in finder.Continues) { stm = new AExpStm(new TSemicolon(";"), Util.MakeClone(node, finalTrans.data)); block.GetStatements().Insert(block.GetStatements().IndexOf(continueStm), stm); stm.Apply(this); } } return; } base.CaseAAssignmentExp(node); }
public override void CaseAAssignmentExp(AAssignmentExp node) { if (node.GetExp() is ALvalueExp && Util.ReturnsTheSame(node.GetLvalue(), ((ALvalueExp)node.GetExp()).GetLvalue(), data)) { RemovedOne = true; node.Parent().Parent().RemoveChild(node.Parent()); } else base.CaseAAssignmentExp(node); }
public override void CaseAAssignmentExp(AAssignmentExp node) { currentLocal = null; node.GetLvalue().Apply(this); if (currentLocal != null) { AALocalDecl decl = data.LocalLinks[currentLocal]; NeededRefs[Util.GetAncestor<AMethodDecl>(node)].Add(decl); } node.GetExp().Apply(this); }
public override void CaseAAssignmentExp(AAssignmentExp node) { if (!processMethodsOnly && !processStructs) { if (!processFieldsOnly) if (node.GetLvalue() is ALocalLvalue) { ALocalLvalue lvalue = (ALocalLvalue)node.GetLvalue(); assignedToLocals[finalTrans.data.LocalLinks[lvalue]].Add(node); node.GetExp().Apply(this); return; } if (node.GetLvalue() is AFieldLvalue) { AFieldLvalue lvalue = (AFieldLvalue)node.GetLvalue(); AFieldDecl decl = finalTrans.data.FieldLinks[lvalue]; if (!assignedToFields[decl].Contains(node)) assignedToFields[decl].Add(node); node.GetExp().Apply(this); return; } } base.CaseAAssignmentExp(node); }
public override void CaseAAssignmentExp(AAssignmentExp node) { if (node.GetExp() is ANullExp) { PType type = data.LvalueTypes[node.GetLvalue()]; if (type is APointerType) { bool add = true; foreach (PType pType in TypesWithIdentifierArray) { if (Util.TypesEqual(((APointerType)type).GetType(), pType, data)) { add = false; break; } } if (add) TypesWithIdentifierArray.Add(((APointerType) type).GetType()); } } base.CaseAAssignmentExp(node); }
public override void CaseAAssignmentExp(AAssignmentExp node) { InAAssignmentExp(node); if (node.GetExp() != null) { node.GetExp().Apply(this); } if (node.GetLvalue() != null) { node.GetLvalue().Apply(this); } if (node.GetToken() != null) { node.GetToken().Apply(this); } OutAAssignmentExp(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); }
public override void OutAAssignmentExp(AAssignmentExp node) { PType from = data.ExpTypes[node.GetExp()]; PType to = data.LvalueTypes[node.GetLvalue()]; if (!Assignable(from, to)) { if (ImplicitAssignable(from, to)) { ANamedType namedTo = (ANamedType) to; ACastExp cast = new ACastExp(new TLParen("("), new ANamedType(new TIdentifier(((AAName)namedTo.GetName()).AsString()), null), node.GetExp()); node.SetExp(cast); OutACastExp(cast); //to = from; } else errors.Add(new ErrorCollection.Error(node.GetToken(), currentSourceFile, LocRM.GetString("ErrorText151") + Util.TypeToString(from) + LocRM.GetString("ErrorText152") + Util.TypeToString(to))); } data.ExpTypes[node] = to; if (node.GetLvalue() is ALocalLvalue) { assignedToOutParams.Add(data.LocalLinks[(ALocalLvalue) node.GetLvalue()]); } if (node.GetLvalue() is AStructLvalue && data.StructFieldLinks.ContainsKey((AStructLvalue) node.GetLvalue())) { AALocalDecl decl = data.StructFieldLinks[(AStructLvalue) node.GetLvalue()]; if (decl.GetConst() != null) errors.Add(new ErrorCollection.Error(node.GetToken(), LocRM.GetString("ErrorText153"))); } if (node.GetLvalue() is AStructFieldLvalue && data.StructMethodFieldLinks.ContainsKey((AStructFieldLvalue)node.GetLvalue())) { AALocalDecl decl = data.StructMethodFieldLinks[(AStructFieldLvalue)node.GetLvalue()]; if (decl.GetConst() != null) errors.Add(new ErrorCollection.Error(node.GetToken(), LocRM.GetString("ErrorText153"))); } base.OutAAssignmentExp(node); }
public override void CaseAAssignmentExp(AAssignmentExp node) { node.GetLvalue().Apply(this); //node.GetToken().Apply(this); Write(" = "); node.GetExp().Apply(this); }
public override void CaseAAssignmentExp(AAssignmentExp node) { isLeftAssign = true; node.GetLvalue().Apply(this); isLeftAssign = false; node.GetExp().Apply(this); }
public override void OutAAssignmentExp(AAssignmentExp node) { PType type = data.ExpTypes[node]; if (Util.IsBulkCopy(type)) { node.Apply(mover); List<PStm> replacementStatements = MakeAssignments(node.GetLvalue(), node.GetExp(), new List<AALocalDecl>() {null}); PStm pStm = Util.GetAncestor<PStm>(node); AABlock pBlock = (AABlock) pStm.Parent(); foreach (PStm stm in replacementStatements) { pBlock.GetStatements().Insert(pBlock.GetStatements().IndexOf(pStm), stm); } pBlock.RemoveChild(pStm); } base.OutAAssignmentExp(node); }
public override void CaseAAssignmentExp(AAssignmentExp node) { if (node.GetExp() is ANewExp) { node.GetExp().Apply(this); } bool rightIsDynamic = false; PExp rightString = null; bool rightWasSet = assignmentRightSideSet; assignmentRightSideSet = false; if (rightWasSet) { rightIsDynamic = hadPointer; rightString = nameExp; } hadPointer = false; nameExp = null; node.GetLvalue().Apply(this); bool leftIsDynamic = hadPointer; PExp leftString = nameExp; if (!rightWasSet) { hadPointer = false; nameExp = null; node.GetExp().Apply(this); rightIsDynamic = hadPointer; rightString = nameExp; } PType type = data.ExpTypes[node]; if (node.GetExp() is ANullExp && type is APointerType && Util.IsIntPointer(node, ((APointerType)type).GetType(), data)) { AIntConstExp replacer = new AIntConstExp(new TIntegerLiteral("0")); data.ExpTypes[replacer] = new ANamedType(new TIdentifier("int"), null); node.GetExp().ReplaceBy(replacer); } /* Cases to handle * * left dynamic, right dynamic, type simple / left dynamic, right normal, type simple * left dynamic, right dynamic, type bulk * left dynamic, right simple, type bulk * left simple, right dynamic, type bulk * * */ /*if (!Util.IsBulkCopy(type)) {//left dynamic, right dynamic, type simple / left dynamic, right normal, type simple if (leftIsDynamic) { string typeString = "string"; if (type is ANamedType) { typeString = ((ANamedType) type).GetName().Text; } PExp exp = CreateDynaicSetStm(typeString, leftString, node.GetExp()); node.ReplaceBy(exp); } } else*/ { //throw new ParserException(null, "Not implemented"); if (type is ANamedType) { } else if (type is AArrayTempType || type is ADynamicArrayType) { } PStm pStm = Util.GetAncestor<PStm>(node); AABlock pBlock = (AABlock) pStm.Parent(); int index = pBlock.GetStatements().IndexOf(pStm) + 1; if (leftIsDynamic) { if (rightIsDynamic) {//left dynamic, right dynamic, type bulk MakeAssignmentBothDynamic(leftString, rightString, type, pBlock, ref index); pStm.Parent().RemoveChild(pStm); } else {//left dynamic, right simple, type bulk MakeAssignmentLeftDynamic(leftString, node.GetExp(), type, pBlock, ref index); pStm.Parent().RemoveChild(pStm); } } else if (rightIsDynamic) {//left simple, right dynamic, type bulk MakeAssignmentRightDynamic(node.GetLvalue(), rightString, type, pBlock, ref index); pStm.Parent().RemoveChild(pStm); } } }
public override void CaseAAssignmentExp(AAssignmentExp node) { /*if (!(data.ExpTypes[node] is APointerType)) { base.CaseAAssignmentExp(node); return; }*/ { currentPointer.Clear(); node.GetLvalue().Apply(this); List<PointerType> leftSide = MakePointer(currentPointer); currentPointer.Clear(); node.GetExp().Apply(this); //List<PointerType> rightSide = MakePointer(currentPointer); if (leftSide.Count > 0) foreach (List<PointerType> prefix in GetPrefixes(leftSide)) { bool isRoot = prefix == leftSide; if (isSet != Contains(setPointers, prefix)) { if (isSet) { if (isRoot) setPointers.Add(prefix); } else setPointers.Remove(prefix); } if (isExposed != Contains(exposedPointers, prefix)) { if (isSet) setPointers.Add(prefix); else if (isRoot) setPointers.Remove(prefix); } } } }