Serialisable Term() { if (lxr.tok == Sym.MINUS || lxr.tok == Sym.PLUS || lxr.tok == Sym.NOT) { var op = SExpression.Op.Plus; switch (lxr.tok) { case Sym.MINUS: op = SExpression.Op.UMinus; break; case Sym.NOT: op = SExpression.Op.Not; break; case Sym.PLUS: Next(); return(Term()); } Next(); return(new SExpression(Term(), op, Serialisable.Null)); } var a = Factor(); while (lxr.tok == Sym.TIMES || lxr.tok == Sym.DIVIDE) { SExpression.Op op = SExpression.Op.And; switch (lxr.tok) { case Sym.TIMES: op = SExpression.Op.Times; break; case Sym.DIVIDE: op = SExpression.Op.Divide; break; } Next(); a = new SExpression(a, op, Factor()); } if (lxr.tok == Sym.IS) { Next(); Mustbe(Sym.NULL); return(new SExpression(a, SExpression.Op.Eql, Serialisable.Null)); } if (lxr.tok == Sym.IN) { Next(); return(new SInPredicate(a, Value())); } return(a); }
Serialisable OneVal() { Serialisable a = Term(); while (lxr.tok == Sym.PLUS || lxr.tok == Sym.MINUS) { SExpression.Op op = SExpression.Op.Or; switch (lxr.tok) { case Sym.PLUS: op = SExpression.Op.Plus; break; case Sym.MINUS: op = SExpression.Op.Minus; break; } Next(); a = new SExpression(a, op, Term()); } return(a); }