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); }
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); }