protected internal virtual FullTextQuery term(QueryScanner scanner) { FullTextQuery q = null; switch (scanner.scan()) { case QueryScanner.TKN_NOT: q = term(scanner); return((q != null) ? new FullTextQueryUnaryOp(FullTextQuery.Operator.Not, q) : null); case QueryScanner.TKN_LPAR: q = disjunction(scanner); break; case QueryScanner.TKN_WORD: q = new FullTextQueryMatchOp(scanner.inQuotes ? FullTextQuery.Operator.StrictMatch : FullTextQuery.Operator.Match, scanner.word, scanner.wordPos); break; case QueryScanner.TKN_EOQ: return(null); default: break; } scanner.scan(); return(q); }
protected internal virtual FullTextQuery disjunction(QueryScanner scanner) { FullTextQuery left = conjunction(scanner); if (scanner.token == QueryScanner.TKN_OR) { FullTextQuery right = disjunction(scanner); if (left != null && right != null) { return(new FullTextQueryBinaryOp(FullTextQuery.Operator.Or, left, right)); } else if (right != null) { return(right); } } return(left); }
protected internal virtual FullTextQuery conjunction(QueryScanner scanner) { FullTextQuery left = term(scanner); if (scanner.token == QueryScanner.TKN_WORD || scanner.token == QueryScanner.TKN_AND) { if (scanner.token == QueryScanner.TKN_WORD) { scanner.unget = true; } FullTextQuery.Operator cop = scanner.inQuotes ? FullTextQuery.Operator.Near : FullTextQuery.Operator.And; FullTextQuery right = disjunction(scanner); if (left != null && right != null) { return(new FullTextQueryBinaryOp(cop, left, right)); } else if (right != null) { return(right); } } return(left); }
/// <summary> Binary node constructor</summary> /// <param name="op">operation code /// </param> /// <param name="left">left operand /// </param> /// <param name="right">right operand /// </param> public FullTextQueryBinaryOp(Operator op, FullTextQuery left, FullTextQuery right) : base(op) { this.left = left; this.right = right; }
public virtual void Visit(FullTextQuery q) { }
/// <summary> Unary node constructor</summary> /// <param name="op">operation code /// </param> /// <param name="opd">operand /// </param> public FullTextQueryUnaryOp(Operator op, FullTextQuery opd) : base(op) { this.opd = opd; }
/// <summary> Binary node constructor</summary> /// <param name="op">operation code /// </param> /// <param name="left">left operand /// </param> /// <param name="right">right operand /// </param> public FullTextQueryBinaryOp(Operator op, FullTextQuery left, FullTextQuery right):base(op) { this.left = left; this.right = right; }
/// <summary> Unary node constructor</summary> /// <param name="op">operation code /// </param> /// <param name="opd">operand /// </param> public FullTextQueryUnaryOp(Operator op, FullTextQuery opd):base(op) { this.opd = opd; }