示例#1
0
        private static QueryParserNode BuildTree(IList subtokens, QueryParserNode.Type opCode)
        {
            QueryParserNode node = new TermNode((string)subtokens[subtokens.Count - 1]);

            for (int i = subtokens.Count - 2; i >= 0; i--)
            {
                TermNode leftOpnd = new TermNode((string)subtokens[i]);
                OpNode   op       = new OpNode(opCode);
                op.AddOperand(leftOpnd);
                op.AddOperand(node);
                node = op;
            }
            return(node);
        }
示例#2
0
        private static QueryParserNode ParseExpression()
        {
            QueryParserNode nodeLeftOperand = ProcessTerm();

            GetNextToken();

            //---------------------------------------------------------------------
            //  if next token == "" => EOS, no more processing, return left operand
            //  as result,
            //  if next token == ")" => we reached the endo of parenthed expression,
            //  return left operand as result, else process two operands and Op,
            //  return Op as root.
            //---------------------------------------------------------------------

            if ((strToken == "") || (strToken == ")") || (strToken == "+\""))
            {
                BackToken();
                return(nodeLeftOperand);
            }

            QueryParserNode.Type typeNode;
            if (!isPhrasalMode)
            {
                switch (strToken)
                {
                case "and":  typeNode = QueryParserNode.Type.eoAnd; break;

                case "or":   typeNode = QueryParserNode.Type.eoOr;  break;

                case "near": typeNode = QueryParserNode.Type.eoNear; break;

                default:     typeNode = QueryParserNode.Type.eoAnd; BackToken(); break;
                }
            }
            else
            {
                typeNode = QueryParserNode.Type.eoPhraseNear;
                BackToken();
            }

            OpNode          nodeOp           = new OpNode(typeNode);
            QueryParserNode nodeRightOperand = ParseExpression();

            nodeOp.AddOperand(nodeLeftOperand);
            nodeOp.AddOperand(nodeRightOperand);

            return(nodeOp);
        }