//>> PrimaryExpr ::= Literal | Number | VariableReference | '(' Expr ')' | FunctionCall private AstNode ParsePrimaryExpr(AstNode qyInput) { Debug.Assert(IsPrimaryExpr(this.scanner)); AstNode opnd = null; switch (this.scanner.Kind) { case XPathScanner.LexKind.String: opnd = new Operand(this.scanner.StringValue); NextLex(); break; case XPathScanner.LexKind.Number: opnd = new Operand(this.scanner.NumberValue); NextLex(); break; case XPathScanner.LexKind.Dollar: NextLex(); CheckToken(XPathScanner.LexKind.Name); opnd = new Variable(this.scanner.Name, this.scanner.Prefix); NextLex(); break; case XPathScanner.LexKind.LParens: NextLex(); opnd = ParseExpresion(qyInput); if (opnd.TypeOfAst != AstNode.QueryType.ConstantOperand) { opnd = new Group(opnd); } PassToken(XPathScanner.LexKind.RParens); break; case XPathScanner.LexKind.Name : if (this.scanner.CanBeFunction && ! IsNodeType(this.scanner)) { opnd = ParseMethod(null); } break; } Debug.Assert(opnd != null, "IsPrimaryExpr() was true. We should recognize this lex."); return opnd; }
private static void ComposeVariable(Variable node, StringBuilder expr) { expr.Append(s_Dollar); expr.Append(node.Prefix); expr.Append(":"); expr.Append(node.Localname); }
private IQuery ProcessVariable(Variable root) { _hasPrefix = true; if (! allowVar) { throw new XPathException(Res.Xp_InvalidKeyPattern, _query); } return new VariableQuery(root.Localname, root.Prefix); }