if (a==null) a=L.next_token(); if (a.sym==EOF) { b=a; c=a; d=a; }
if (b==null) b=L.next_token(); if (b.sym==EOF) { c=b; d=b; }
if (c==null) c=L.next_token(); if (c.sym==EOF) { d=c; }
if (d==null) d=L.next_token();
if (a.sym==ID && b.sym==COLON && (c.sym==RUN || c.sym==CHECK) && (d.sym==ID || d.sym==LBRACE)) {
Symbol x=c; b=d; c=null; d=null; return x;
}
Symbol x=a; a=b; b=c; c=d; d=null; return x;
}
};
// Merges "pred" "/" "xxx" into the actual symbol
// Merges "fun" "/" "xxx" into the actual symbol
// Merges ! { in = < <= > >= } into a single symbol
// Merges {..}=>{..} into a single symbol
final Scanner B = new Scanner() {
private Symbol undo;
public final Symbol next_token() throws Exception {
Symbol x = undo;
undo = null;
if (x==null) x = A.next_token();
if (x.sym==NOT) {
Symbol y = A.next_token();
if (y.sym==IN) return merge(x, y, NOTIN);
if (y.sym==EQUALS) return merge(x, y, NOTEQUALS);
if (y.sym==LT) return merge(x, y, NOTLT);
if (y.sym==LTE) return merge(x, y, NOTLTE);
if (y.sym==GT) return merge(x, y, NOTGT);
if (y.sym==GTE) return merge(x, y, NOTGTE);
undo = y;
} else if (x.sym==PRED) {
Symbol y = A.next_token();
if (y.sym!=SLASH) { undo=y; return x; }
Symbol z = A.next_token();
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("totalOrder")) return merge(x, z, TOTALORDER);
undo = z;
} else if (x.sym==FUN) {
Symbol y = A.next_token();
if (y.sym!=SLASH) { undo=y; return x; }
Symbol z = A.next_token();
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("add")) return merge(x, z, INTADD);
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("sub")) return merge(x, z, INTSUB);
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("mul")) return merge(x, z, INTMUL);
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("div")) return merge(x, z, INTDIV);
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("rem")) return merge(x, z, INTREM);
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("min")) return merge(x, z, INTMIN);
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("max")) return merge(x, z, INTMAX);
if (z.sym==ID && ((ExprVar)(z.value)).label.equals("next")) return merge(x, z, INTNEXT);
} else if (x.sym==ONE) {
Symbol y = A.next_token();
if (y.sym!=ARROW) { undo=y; return x; }
Symbol z = A.next_token();
if (z.sym==ONE) return merge(x, z, ONE_ARROW_ONE);
if (z.sym==LONE) return merge(x, z, ONE_ARROW_LONE);
if (z.sym==SOME) return merge(x, z, ONE_ARROW_SOME);
if (z.sym==SET) return merge(x, z, ONE_ARROW_ANY); else { undo=z; return merge(x, y, ONE_ARROW_ANY); }
} else if (x.sym==LONE) {
Symbol y = A.next_token();
if (y.sym!=ARROW) { undo=y; return x; }
Symbol z = A.next_token();
if (z.sym==ONE) return merge(x, z, LONE_ARROW_ONE);
if (z.sym==LONE) return merge(x, z, LONE_ARROW_LONE);
if (z.sym==SOME) return merge(x, z, LONE_ARROW_SOME);
if (z.sym==SET) return merge(x, z, LONE_ARROW_ANY); else { undo=z; return merge(x, y, LONE_ARROW_ANY); }
} else if (x.sym==SOME) {
Symbol y = A.next_token();
if (y.sym!=ARROW) { undo=y; return x; }
Symbol z = A.next_token();
if (z.sym==ONE) return merge(x, z, SOME_ARROW_ONE);
if (z.sym==LONE) return merge(x, z, SOME_ARROW_LONE);
if (z.sym==SOME) return merge(x, z, SOME_ARROW_SOME);
if (z.sym==SET) return merge(x, z, SOME_ARROW_ANY); else { undo=z; return merge(x, y, SOME_ARROW_ANY); }
} else if (x.sym==SET) {
Symbol y = A.next_token();
if (y.sym!=ARROW) { undo=y; return x; }
Symbol z = A.next_token();
if (z.sym==ONE) return merge(x, z, ANY_ARROW_ONE);
if (z.sym==LONE) return merge(x, z, ANY_ARROW_LONE);
if (z.sym==SOME) return merge(x, z, ANY_ARROW_SOME);
if (z.sym==SET) return merge(x, z, ARROW); else { undo=z; return merge(x, y, ARROW); }
} else if (x.sym==ARROW) {
Symbol z = A.next_token();
if (z.sym==ONE) return merge(x, z, ANY_ARROW_ONE);
if (z.sym==LONE) return merge(x, z, ANY_ARROW_LONE);
if (z.sym==SOME) return merge(x, z, ANY_ARROW_SOME);
if (z.sym==SET) return merge(x, z, ARROW); else { undo=z; }
}
return x;
}
};
// Merge "- number" into "-number" whenever it is not immediately following ")" "]" "}" DISJ TOTALORDER INT SUM ID NUMBER STR IDEN THIS INTMIN INTMAX INTNEXT UNIV SIGINT NONE
final Scanner C = new Scanner() {
private Symbol last, undo;
public final Symbol next_token() throws Exception {
Symbol x = undo;
undo = null;
if (x==null) x = B.next_token();
if (last!=null) {
if (last.sym==RPAREN || last.sym==RBRACKET || last.sym==RBRACE || last.sym==DISJ || last.sym==TOTALORDER || last.sym==INT) return last = x;
if (last.sym==SUM || last.sym==ID || last.sym==NUMBER || last.sym==STR || last.sym==IDEN || last.sym==THIS) return last = x;
if (last.sym==INTMIN || last.sym==INTMAX || last.sym==INTNEXT || last.sym==UNIV || last.sym==SIGINT || last.sym==NONE) return last = x;
}
if (x.sym==MINUS) {
Symbol y = B.next_token();
if (y.sym==NUMBER) {
ExprConstant num = (ExprConstant)(y.value);
y.pos = x.pos.merge(y.pos);
y.value = ExprConstant.Op.NUMBER.make(y.pos, 0 - num.num);
return last = y;