示例#1
0
        private PqlPatternNode Pattern()
        {
            PqlToken   id      = currentToken;
            PqlSynonym synonym = new PqlSynonym(id);

            Eat(PqlTokenType.IDENT);
            Eat(PqlTokenType.LPAREN);
            PqlArgument varRef = Ref();

            Eat(PqlTokenType.COMMA);

            PqlExpr expr = null;

            if (currentToken.Type == PqlTokenType.STRING)
            {
                expr = Expr(true);
            }
            else if (currentToken.Type == PqlTokenType.FLOOR)
            {
                Eat(PqlTokenType.FLOOR);
                if (currentToken.Type == PqlTokenType.STRING)
                {
                    expr = Expr(false);
                    Eat(PqlTokenType.FLOOR);
                }
                else if (currentToken.Type == PqlTokenType.COMMA)
                {
                    Eat(PqlTokenType.COMMA);
                    Eat(PqlTokenType.FLOOR);
                }
            }
            Eat(PqlTokenType.RPAREN);
            return(new PqlPatternNode(synonym, varRef, expr));
        }
示例#2
0
        private PqlCompare AttrCompare()
        {
            PqlAttrRef left = AttrRef();

            Eat(PqlTokenType.EQ);
            PqlArgument right = Ref();

            return(new PqlCompare(left, right));
        }
示例#3
0
        private PqlAffectsT AffectsT()
        {
            Eat(PqlTokenType.AFFECTST);
            Eat(PqlTokenType.LPAREN);
            PqlArgument leftRef = Ref();

            Eat(PqlTokenType.COMMA);
            PqlArgument rightRef = Ref();

            Eat(PqlTokenType.RPAREN);
            return(new PqlAffectsT(PqlTokenType.AFFECTST, leftRef, rightRef));
        }
示例#4
0
        private PqlNextT NextT()
        {
            Eat(PqlTokenType.NEXTT);
            Eat(PqlTokenType.LPAREN);
            PqlArgument leftRef = Ref();

            Eat(PqlTokenType.COMMA);
            PqlArgument rightRef = Ref();

            Eat(PqlTokenType.RPAREN);
            return(new PqlNextT(PqlTokenType.NEXTT, leftRef, rightRef));
        }
示例#5
0
        private PqlUses Uses()
        {
            Eat(PqlTokenType.USES);
            Eat(PqlTokenType.LPAREN);
            PqlArgument leftRef = Ref();

            Eat(PqlTokenType.COMMA);
            PqlArgument rightRef = Ref();

            Eat(PqlTokenType.RPAREN);
            return(new PqlUses(PqlTokenType.USES, leftRef, rightRef));
        }
示例#6
0
        private PqlModifies Modifies()
        {
            Eat(PqlTokenType.MODIFIES);
            Eat(PqlTokenType.LPAREN);
            PqlArgument leftRef = Ref();

            Eat(PqlTokenType.COMMA);
            PqlArgument rightRef = Ref();

            Eat(PqlTokenType.RPAREN);
            return(new PqlModifies(PqlTokenType.MODIFIES, leftRef, rightRef));
        }
示例#7
0
        private PqlFollowsT FollowsT()
        {
            Eat(PqlTokenType.FOLLOWST);
            Eat(PqlTokenType.LPAREN);
            PqlArgument leftRef = Ref();

            Eat(PqlTokenType.COMMA);
            PqlArgument rightRef = Ref();

            Eat(PqlTokenType.RPAREN);
            return(new PqlFollowsT(PqlTokenType.FOLLOWST, leftRef, rightRef));
        }
示例#8
0
        private PqlCallsT CallsT()
        {
            Eat(PqlTokenType.CALLST);
            Eat(PqlTokenType.LPAREN);
            PqlArgument leftRef = Ref();

            Eat(PqlTokenType.COMMA);
            PqlArgument rightRef = Ref();

            Eat(PqlTokenType.RPAREN);
            return(new PqlCallsT(PqlTokenType.CALLST, leftRef, rightRef));
        }
示例#9
0
        private PqlParent Parent()
        {
            Eat(PqlTokenType.PARENT);
            Eat(PqlTokenType.LPAREN);
            PqlArgument leftRef = Ref();

            Eat(PqlTokenType.COMMA);
            PqlArgument rightRef = Ref();

            Eat(PqlTokenType.RPAREN);
            return(new PqlParent(PqlTokenType.PARENT, leftRef, rightRef));
        }
示例#10
0
        private void ProcessContainerPattern(IProgramKnowledgeBase pkb, BindingsManager bindingsManager)
        {
            PqlArgument leftRef = VarRef;

            if (leftRef is PqlString)
            {
                Variable variable = pkb.Variables.GetVariableByName((leftRef as PqlString).Value);
                for (int i = 0; i < Args.GetSize(); i++)
                {
                    Container container = Args.GetEntityByIndex(i) as Container;
                    if (!container.Condition.Name.Equals(variable.Name))
                    {
                        bindingsManager.RemoveBoundEntity(container, Args);
                        i--;
                    }
                }
            }
        }
示例#11
0
        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--;
                        }
                    }
                }
            }
        }
示例#12
0
 public PqlPatternNode(PqlSynonym syn, PqlArgument varRef, PqlExpr expr)
 {
     Synonym = syn;
     VarRef  = varRef;
     Expr    = expr;
 }
示例#13
0
 public PqlParentT(PqlTokenType relationType, PqlArgument leftRef, PqlArgument rightRef) : base(relationType, leftRef, rightRef)
 {
 }
示例#14
0
 public PqlFollows(PqlTokenType relationType, PqlArgument leftRef, PqlArgument rightRef) : base(relationType, leftRef, rightRef)
 {
 }
示例#15
0
 public PqlRelation(PqlTokenType relationType, PqlArgument leftRef, PqlArgument rightRef)
 {
     RelationType = relationType;
     LeftRef      = leftRef;
     RightRef     = rightRef;
 }
示例#16
0
 public PqlCompare(PqlAttrRef leftRef, PqlArgument rightRef)
 {
     LeftRef  = leftRef;
     RightRef = rightRef;
 }