private void ExtractIfNext(If check, Statement next) { Statement last1 = check.IfBody.GetLast(); if (last1 is If) { ExtractIfNext(last1 as If, next); } else { NextTable.SetNext(last1, next); } if (check.ElseBody != null) { Statement last2 = check.ElseBody.GetLast(); if (last2 is If) { ExtractIfNext(last2 as If, next); } else { NextTable.SetNext(last2, next); } } }
private void ExtractIf(If check, Procedure procedureContext) { ExtractVariable(check.Condition); Variable retrievedVariable = Variables.GetVariableByName(check.Condition.Name); UsesTable.SetUses(check, retrievedVariable); ExtractBody(check, check.IfBody, procedureContext); NextTable.SetNext(check, check.IfBody.GetFirst()); if (check.ElseBody != null) { ExtractBody(check, check.ElseBody, procedureContext); NextTable.SetNext(check, check.ElseBody.GetFirst()); } }
private void ExtractWhile(While loop, Procedure procedureContext) { ExtractVariable(loop.Condition); Variable retrievedVariable = Variables.GetVariableByName(loop.Condition.Name); UsesTable.SetUses(loop, retrievedVariable); ExtractBody(loop, loop.Body, procedureContext); NextTable.SetNext(loop, loop.Body.GetFirst()); if (loop.Body.GetLast() is If) { ExtractIfNext(loop.Body.GetLast() as If, loop); } else { NextTable.SetNext(loop.Body.GetLast(), loop); } }
private void ExtractProcedure(Procedure procedure) { IStatementList children = procedure.Body; for (int i = 0; i < children.GetSize(); i++) { Statement child = children[i]; ExtractStatement(child, procedure); if (i > 0) { Statement previousChild = children[i - 1]; FollowsTable.SetFollows(previousChild, child); if (!(previousChild is If)) { NextTable.SetNext(previousChild, child); } else { ExtractIfNext(previousChild as If, child); } } IVariableList modifiedVariables = ModifiesTable.GetModifiedBy(child); IVariableList usedVariables = UsesTable.GetUsedBy(child); foreach (Variable variable in modifiedVariables) { ModifiesTable.SetModifies(procedure, variable); } foreach (Variable variable in usedVariables) { UsesTable.SetUses(procedure, variable); } } }
private void ExtractBody(Container container, IStatementList body, Procedure procedureContext) { for (int i = 0; i < body.GetSize(); i++) { Statement child = body[i]; ExtractStatement(child, procedureContext); ParentTable.SetParent(container, child); if (i > 0) { Statement previousChild = body[i - 1]; FollowsTable.SetFollows(previousChild, child); if (!(previousChild is If)) { NextTable.SetNext(previousChild, child); } else { ExtractIfNext(previousChild as If, child); } } IVariableList modifiedVariables = ModifiesTable.GetModifiedBy(child); IVariableList usedVariables = UsesTable.GetUsedBy(child); foreach (Variable variable in modifiedVariables) { ModifiesTable.SetModifies(container, variable); } foreach (Variable variable in usedVariables) { UsesTable.SetUses(container, variable); } } }