public Exp xor_expr() { var e = and_expr(); if (e == null) return null; while (PeekAndDiscard(TokenType.OP_CARET)) { var r = and_expr(); if (r == null) Unexpected(); e = new BinExp(Op.Xor, e, r, filename, e.Start, r.End); } return e; }