private static bool TryTakeExpression(TokenKeeper tokenKeeper, out FilterClause clause) { if (TryTakeParenExpression(tokenKeeper, out clause) || TryTakeComparison(tokenKeeper, out clause)) { var work = new TokenKeeper(tokenKeeper); if (TryTakeRelOp(work, ref clause)) { tokenKeeper.Swap(work); } return(true); } clause = null; return(false); }
private static bool TryTakeComparison(TokenKeeper tokenKeeper, out FilterClause clause) { Token left, right, op; var work = new TokenKeeper(tokenKeeper); if (TryTakeData(work, out left) && TryTakeOperator(work, out op) && TryTakeData(work, out right)) { tokenKeeper.Swap(work); clause = new ComparisonClause(left, op, right); return(true); } clause = null; return(false); }
private static bool TryTakeRelOp(TokenKeeper tokenKeeper, ref FilterClause clause) { if (tokenKeeper.Next.IsRelop()) { var work = new TokenKeeper(tokenKeeper); var op = work.Take(); FilterClause rhs; if (TryTakeExpression(work, out rhs)) { var relOpClause = new RelOpClause(clause, op, rhs); tokenKeeper.Swap(work); clause = relOpClause; return(true); } } return(false); }
private static bool TryTakeParenExpression(TokenKeeper tokenKeeper, out FilterClause clause) { if (tokenKeeper.Next.TokenType == TokenType.OpenParen) { var work = new TokenKeeper(tokenKeeper); work.Take(); FilterClause expression; if (TryTakeExpression(work, out expression) && work.Next.TokenType == TokenType.CloseParen) { work.Take(); clause = new ParenClause(expression); tokenKeeper.Swap(work); return(true); } } clause = null; return(false); }
public RelOpClause(FilterClause lhs, Token op, FilterClause rhs) { Lhs = lhs; Op = op; Rhs = rhs; }
public ParenClause(FilterClause clause) { Clause = clause; }