INode ParseSymbol() { if (CurrToken == Token.ReservedWord) { var name = CurrSpan.AsString(_source); Next(); switch (name) { case "$filter": return(new SymbolNode(Symbol.Filter)); case "$select": return(new SymbolNode(Symbol.Select)); case "$top": return(new SymbolNode(Symbol.Top)); case "$skip": return(new SymbolNode(Symbol.Skip)); case "$orderby": return(new SymbolNode(Symbol.OrderBy)); case "$count": return(new SymbolNode(Symbol.Count)); default: throw new InvalidOperationException("Unhandled symbol encountered"); } } return(null); }
INode ParseBinary(INode leftNode) { if (CurrToken == Token.Space && NextToken == Token.Word) { var op = GetOperator(NextSpan.AsString(_source)); var opPrecedence = GetPrecedence(op); if (CurrGreed >= opPrecedence) { Skip(Token.Space); Skip(Token.Word); Skip(Token.Space); _stGreed.Push(opPrecedence); var rightNode = ParseNode(); _stGreed.Pop(); return(new BinaryOperatorNode(op, leftNode, rightNode)); } } return(null); }