public Exp comparison()
{
var e = expr();
if (e == null)
return e;
int posStart = e.Start;
Exp inner;
for (; ; )
{
Op op;
//'<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
switch (lexer.Peek().Type)
{
case TokenType.OP_LT: op = Op.Lt; break;
case TokenType.OP_LE: op = Op.Le; break;
case TokenType.OP_GE: op = Op.Ge; break;
case TokenType.OP_GT: op = Op.Gt; break;
case TokenType.OP_EQ: op = Op.Eq; break;
case TokenType.OP_NE: op = Op.Ne; break;
case TokenType.In: op = Op.In; break;
case TokenType.Not:
Expect(TokenType.Not);
Expect(TokenType.In);
inner = expr();
e = new BinExp(Op.NotIn, e, inner, filename, posStart, inner.End);
continue;
case TokenType.Is:
Expect(TokenType.Is);
op = PeekAndDiscard(TokenType.Not) ? Op.IsNot : Op.Is;
inner = expr();
e = new BinExp(op, e, inner, filename, posStart, inner.End);
continue;
default: return e;
}
lexer.Get();
inner = expr();
e = new BinExp(op, e, inner, filename, posStart, inner.End);
}
}