private void ProcessAssignPattern(IProgramKnowledgeBase pkb, BindingsManager bindingsManager) { PqlArgument leftRef = VarRef; PqlExpr rightRef = Expr; if (leftRef is PqlString) { Variable variable = pkb.Variables.GetVariableByName((leftRef as PqlString).Value); for (int i = 0; i < Args.GetSize(); i++) { Assign assignment = Args.GetEntityByIndex(i) as Assign; if (assignment == null || !assignment.Left.Name.Equals(variable.Name)) { bindingsManager.RemoveBoundEntity(assignment, Args); i--; } } } if (rightRef != null) { for (int i = 0; i < Args.GetSize(); i++) { Assign assignment = Args.GetEntityByIndex(i) as Assign; if (assignment == null) { Args.RemoveEntity(assignment); i--; } else { bool match = Expr.IsExact ? CompareTrees(assignment.Right, Expr.ExprTree, true) : FindTree(assignment.Right, Expr.ExprTree); if (!match) { bindingsManager.RemoveBoundEntity(assignment, Args); i--; } } } } }
public PqlPatternNode(PqlSynonym syn, PqlArgument varRef, PqlExpr expr) { Synonym = syn; VarRef = varRef; Expr = expr; }