home *** CD-ROM | disk | FTP | other *** search
- package espresso;
-
- import java.io.FileInputStream;
- import java.io.IOException;
-
- class Scanner implements Constants {
- private static Name[] symName = new Name[112];
- private static Name slashEqualsS = Name.fromString("/=");
- private static Name slashS = Name.fromString("/");
- private int litlen;
- private byte[] lit = new byte[64];
- private int ccol;
- private int cline;
- // $FF: renamed from: ch byte
- private byte field_0;
- // $FF: renamed from: bp int
- private int field_1;
- private byte[] buf;
- int errPos = -1;
- double floatVal;
- long intVal;
- Name name;
- int lastpos = 0;
- int pos = 0;
- int sym;
- private static int extendedMaxKey;
- private static int standardMaxKey;
- private static byte[] key;
- private static int maxKey = 0;
- static final byte SUB = 26;
- // $FF: renamed from: CR byte
- static final byte field_2 = 13;
- // $FF: renamed from: FF byte
- static final byte field_3 = 12;
- // $FF: renamed from: LF byte
- static final byte field_4 = 10;
- static final int tabinc = 8;
-
- static {
- for(int var0 = 0; var0 <= 111; ++var0) {
- symName[var0] = null;
- }
-
- enterKeyword("+", 20);
- enterKeyword("-", 21);
- enterKeyword("!", 22);
- enterKeyword("%", 23);
- enterKeyword("^", 24);
- enterKeyword("&", 25);
- enterKeyword("*", 26);
- enterKeyword("|", 27);
- enterKeyword("~", 28);
- enterKeyword("/", 29);
- enterKeyword(">", 30);
- enterKeyword("<", 31);
- enterKeyword("?", 32);
- enterKeyword(":", 33);
- enterKeyword("=", 34);
- enterKeyword("++", 35);
- enterKeyword("--", 36);
- enterKeyword("==", 37);
- enterKeyword("<=", 38);
- enterKeyword(">=", 39);
- enterKeyword("!=", 40);
- enterKeyword("<<", 41);
- enterKeyword(">>", 42);
- enterKeyword(">>>", 43);
- enterKeyword("+=", 44);
- enterKeyword("-=", 45);
- enterKeyword("*=", 46);
- enterKeyword("/=", 47);
- enterKeyword("&=", 48);
- enterKeyword("|=", 49);
- enterKeyword("^=", 50);
- enterKeyword("%=", 51);
- enterKeyword("<<=", 52);
- enterKeyword(">>=", 53);
- enterKeyword(">>>=", 54);
- enterKeyword("||", 55);
- enterKeyword("&&", 56);
- enterKeyword("abstract", 60);
- enterKeyword("break", 61);
- enterKeyword("case", 62);
- enterKeyword("catch", 63);
- enterKeyword("class", 64);
- enterKeyword("const", 65);
- enterKeyword("continue", 66);
- enterKeyword("default", 67);
- enterKeyword("do", 68);
- enterKeyword("else", 69);
- enterKeyword("extends", 70);
- enterKeyword("final", 71);
- enterKeyword("finally", 72);
- enterKeyword("for", 73);
- enterKeyword("if", 74);
- enterKeyword("implements", 75);
- enterKeyword("import", 76);
- enterKeyword("interface", 77);
- enterKeyword("native", 78);
- enterKeyword("new", 79);
- enterKeyword("package", 80);
- enterKeyword("private", 81);
- enterKeyword("protected", 82);
- enterKeyword("public", 83);
- enterKeyword("return", 84);
- enterKeyword("static", 85);
- enterKeyword("super", 86);
- enterKeyword("switch", 87);
- enterKeyword("synchronized", 88);
- enterKeyword("this", 89);
- enterKeyword("threadsafe", 90);
- enterKeyword("throw", 91);
- enterKeyword("throws", 92);
- enterKeyword("transient", 93);
- enterKeyword("try", 94);
- enterKeyword("while", 95);
- enterKeyword("instanceof", 96);
- enterKeyword("boolean", 97);
- enterKeyword("byte", 98);
- enterKeyword("char", 99);
- enterKeyword("double", 100);
- enterKeyword("float", 101);
- enterKeyword("int", 102);
- enterKeyword("long", 103);
- enterKeyword("short", 104);
- enterKeyword("void", 105);
- enterKeyword("null", 106);
- standardMaxKey = maxKey;
- enterKeyword("fun", 107);
- enterKeyword("seq", 108);
- enterKeyword("->", 109);
- extendedMaxKey = maxKey;
- key = new byte[maxKey + 1];
-
- for(int var1 = 0; var1 <= maxKey; ++var1) {
- key[var1] = 1;
- }
-
- for(int var2 = 0; var2 <= 111; ++var2) {
- if (symName[var2] != null) {
- key[symName[var2].index] = (byte)var2;
- }
- }
-
- }
-
- private static void enterKeyword(String var0, int var1) {
- Name var2 = Name.fromString(var0);
- symName[var1] = var2;
- if (var2.index > maxKey) {
- maxKey = var2.index;
- }
-
- }
-
- String sym2string(int var1) {
- switch (var1) {
- case 1:
- return "<identifier>";
- case 2:
- return "<character>";
- case 3:
- return "<string>";
- case 4:
- return "<integer>";
- case 5:
- return "<long integer>";
- case 6:
- return "<float>";
- case 7:
- return "<double>";
- case 10:
- return "'.'";
- case 11:
- return "','";
- case 12:
- return "';'";
- case 13:
- return "'('";
- case 14:
- return "')'";
- case 15:
- return "'['";
- case 16:
- return "']'";
- case 17:
- return "'{'";
- case 18:
- return "'}'";
- case 110:
- return "<bad symbol>";
- case 111:
- return "<end of input>";
- default:
- return symName[var1].toString();
- }
- }
-
- void nextsym() {
- this.lastpos = (this.cline << 10) + this.ccol;
-
- label171:
- while(true) {
- boolean var1 = false;
- this.pos = (this.cline << 10) + this.ccol;
- int var2 = this.field_1;
- switch (this.field_0) {
- case 9:
- this.ccol = (this.ccol - 1) / 8 * 8 + 8;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- break;
- case 10:
- case 12:
- ++this.cline;
- this.ccol = 0;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- break;
- case 11:
- case 14:
- case 15:
- case 16:
- case 17:
- case 18:
- case 19:
- case 20:
- case 21:
- case 22:
- case 23:
- case 24:
- case 25:
- case 27:
- case 28:
- case 29:
- case 30:
- case 31:
- case 33:
- case 35:
- case 37:
- case 38:
- case 42:
- case 43:
- case 45:
- case 58:
- case 60:
- case 61:
- case 62:
- case 63:
- case 64:
- case 94:
- case 96:
- case 124:
- default:
- if (this.isspecial(this.field_0)) {
- this.getspecials();
- } else {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.lexError("illegal character");
- }
-
- return;
- case 13:
- ++this.cline;
- this.ccol = 0;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (this.field_0 == 10) {
- this.ccol = 0;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
- break;
- case 26:
- this.sym = 111;
- return;
- case 32:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- break;
- case 34:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.litlen = 0;
-
- while(this.field_0 != 34 && (char)this.field_0 >= ' ') {
- this.getlitch();
- }
-
- if (this.field_0 == 34) {
- this.sym = 3;
- this.name = Name.fromSource(this.lit, 0, this.litlen);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- } else {
- this.lexError("unclosed character literal");
- }
-
- return;
- case 39:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.litlen = 0;
- this.getlitch();
- if (this.field_0 == 39) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 2;
- byte[] var3 = new byte[this.litlen];
- int var4 = Convert.source2ascii(this.lit, 0, this.litlen, var3);
- this.intVal = (long)Convert.ascii2string(var3, 0, var4).charAt(0);
- } else {
- this.lexError("unclosed character literal");
- }
-
- return;
- case 40:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 13;
- return;
- case 41:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 14;
- return;
- case 44:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 11;
- return;
- case 46:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (48 <= this.field_0 && this.field_0 <= 57) {
- this.getfraction(var2);
- } else {
- this.sym = 10;
- }
-
- return;
- case 47:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (this.field_0 == 47) {
- while(true) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (this.field_0 == 13 || this.field_0 == 10 || this.field_0 == 26) {
- continue label171;
- }
- }
- } else {
- if (this.field_0 != 42) {
- if (this.field_0 == 61) {
- this.name = slashEqualsS;
- this.sym = 47;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- } else {
- this.name = slashS;
- this.sym = 29;
- }
-
- return;
- }
-
- while(true) {
- if (this.field_0 == 13) {
- ++this.cline;
- this.ccol = 0;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (this.field_0 == 10) {
- this.ccol = 0;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
- } else if (this.field_0 == 10) {
- ++this.cline;
- this.ccol = 0;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- } else if (this.field_0 == 9) {
- this.ccol = (this.ccol - 1) / 8 * 8 + 8;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- } else {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
-
- if (this.field_0 == 42 || this.field_0 == 26) {
- while(this.field_0 == 42) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
-
- if (this.field_0 == 47 || this.field_0 == 26) {
- if (this.field_0 != 47) {
- this.lexError("unclosed comment");
- return;
- }
-
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- continue label171;
- }
- }
- }
- }
- case 48:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (this.field_0 == 120) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.getnumber(var2 + 2, 16);
- } else {
- this.getnumber(var2, 8);
- }
-
- return;
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- this.getnumber(var2, 10);
- return;
- case 59:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 12;
- return;
- case 91:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 15;
- return;
- case 92:
- if (!this.isUnicode()) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.lexError("illegal character");
- return;
- }
-
- var1 = true;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = 65;
- case 36:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- case 79:
- case 80:
- case 81:
- case 82:
- case 83:
- case 84:
- case 85:
- case 86:
- case 87:
- case 88:
- case 89:
- case 90:
- case 95:
- case 97:
- case 98:
- case 99:
- case 100:
- case 101:
- case 102:
- case 103:
- case 104:
- case 105:
- case 106:
- case 107:
- case 108:
- case 109:
- case 110:
- case 111:
- case 112:
- case 113:
- case 114:
- case 115:
- case 116:
- case 117:
- case 118:
- case 119:
- case 120:
- case 121:
- case 122:
- while(true) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- switch (this.field_0) {
- case 36:
- case 48:
- case 49:
- case 50:
- case 51:
- case 52:
- case 53:
- case 54:
- case 55:
- case 56:
- case 57:
- case 65:
- case 66:
- case 67:
- case 68:
- case 69:
- case 70:
- case 71:
- case 72:
- case 73:
- case 74:
- case 75:
- case 76:
- case 77:
- case 78:
- case 79:
- case 80:
- case 81:
- case 82:
- case 83:
- case 84:
- case 85:
- case 86:
- case 87:
- case 88:
- case 89:
- case 90:
- case 95:
- case 97:
- case 98:
- case 99:
- case 100:
- case 101:
- case 102:
- case 103:
- case 104:
- case 105:
- case 106:
- case 107:
- case 108:
- case 109:
- case 110:
- case 111:
- case 112:
- case 113:
- case 114:
- case 115:
- case 116:
- case 117:
- case 118:
- case 119:
- case 120:
- case 121:
- case 122:
- continue;
- case 37:
- case 38:
- case 39:
- case 40:
- case 41:
- case 42:
- case 43:
- case 44:
- case 45:
- case 46:
- case 47:
- case 58:
- case 59:
- case 60:
- case 61:
- case 62:
- case 63:
- case 64:
- case 91:
- case 93:
- case 94:
- case 96:
- default:
- if (this.field_0 >= 0) {
- if (var1) {
- this.name = Name.fromSource(this.buf, var2, this.field_1 - var2);
- } else {
- this.name = Name.fromAscii(this.buf, var2, this.field_1 - var2);
- }
-
- if (this.name.index <= maxKey) {
- this.sym = key[this.name.index];
- } else {
- this.sym = 1;
- }
-
- return;
- }
- continue;
- case 92:
- }
-
- if (!this.isUnicode()) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.lexError("illegal character");
- return;
- }
-
- var1 = true;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
- case 93:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 16;
- return;
- case 123:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 17;
- return;
- case 125:
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 18;
- return;
- }
- }
- }
-
- private void getspecials() {
- int var1 = this.field_1;
- this.name = Name.fromAscii(this.buf, var1, 1);
-
- while(true) {
- this.sym = key[this.name.index];
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (!this.isspecial(this.field_0)) {
- break;
- }
-
- Name var2 = Name.fromAscii(this.buf, var1, this.field_1 + 1 - var1);
- if (var2.index > maxKey || key[var2.index] == 1) {
- break;
- }
-
- this.name = var2;
- }
-
- }
-
- private boolean isspecial(byte var1) {
- switch (var1) {
- case 33:
- case 37:
- case 38:
- case 42:
- case 63:
- case 43:
- case 45:
- case 58:
- case 60:
- case 61:
- case 62:
- case 94:
- case 124:
- case 126:
- return true;
- default:
- return false;
- }
- }
-
- private void getnumber(int var1, int var2) {
- while(Convert.digit2int(this.field_0, var2 == 8 ? 10 : var2) >= 0) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
-
- if (var2 <= 10 && this.field_0 == 46) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.getfraction(var1);
- } else if (var2 > 10 || this.field_0 != 101 && this.field_0 != 69) {
- if (this.field_0 != 108 && this.field_0 != 76) {
- this.makeint(var1, this.field_1 - var1, var2, 2147483647L);
- this.intVal = (long)((int)this.intVal);
- this.sym = 4;
- } else {
- this.makeint(var1, this.field_1 - var1, var2, Long.MAX_VALUE);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.sym = 5;
- }
- } else {
- this.getfraction(var1);
- }
-
- }
-
- private void makeint(int var1, int var2, int var3, long var4) {
- this.intVal = 0L;
- int var6 = var3 == 10 ? 1 : 2;
-
- for(int var7 = 0; var7 < var2; ++var7) {
- int var8 = Convert.digit2int(this.buf[var1 + var7], var3);
- if (var8 < 0) {
- this.lexError("malformed integer number");
- return;
- }
-
- if (this.intVal < (long)0 || var4 / (long)(var3 / var6) < this.intVal || var4 - (long)(var8 / var6) < this.intVal * (long)(var3 / var6)) {
- this.lexError("integer number too large");
- return;
- }
-
- this.intVal = this.intVal * (long)var3 + (long)var8;
- }
-
- }
-
- private void getfraction(int var1) {
- while(Convert.digit2int(this.field_0, 10) >= 0) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
-
- this.sym = 7;
- if (this.field_0 == 101 || this.field_0 == 69) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (this.field_0 == 43 || this.field_0 == 45) {
- byte var2 = this.field_0;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (48 > this.field_0 || this.field_0 > 57) {
- this.field_0 = var2;
- --this.field_1;
- --this.ccol;
- }
- }
-
- while(Convert.digit2int(this.field_0, 10) >= 0) {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
- }
-
- if (this.field_0 != 100 && this.field_0 != 68) {
- if (this.field_0 == 102 || this.field_0 == 70) {
- this.sym = 6;
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
- } else {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
-
- try {
- this.floatVal = Double.valueOf(new String(this.buf, 0, var1, this.field_1 - var1));
- } catch (NumberFormatException var4) {
- this.lexError("malformed floating point number");
- }
-
- }
-
- private void getlitch() {
- if (this.field_0 == 92) {
- if (this.isUnicode()) {
- this.putch(this.field_0);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.putch(this.field_0);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.putch(this.field_0);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.putch(this.field_0);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.putch(this.field_0);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- this.putch(this.field_0);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- } else {
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (48 <= this.field_0 && this.field_0 <= 55) {
- byte var1 = this.field_0;
- int var2 = Convert.digit2int(this.field_0, 8);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (48 <= this.field_0 && this.field_0 <= 55) {
- var2 = var2 * 8 + Convert.digit2int(this.field_0, 8);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- if (var1 <= 51 && 48 <= this.field_0 && this.field_0 <= 55) {
- var2 = var2 * 8 + Convert.digit2int(this.field_0, 8);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
- }
-
- this.putch((byte)var2);
- } else if ((char)this.field_0 >= ' ') {
- switch (this.field_0) {
- case 98:
- case 116:
- case 110:
- case 102:
- case 114:
- case 34:
- case 39:
- case 92:
- this.putch((byte)92);
- this.putch(this.field_0);
- break;
- default:
- this.lexError("invalid escape character", (this.cline << 10) + this.ccol - 1);
- }
-
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
- }
- } else if ((char)this.field_0 >= ' ') {
- this.putch(this.field_0);
- this.field_0 = this.buf[++this.field_1];
- ++this.ccol;
- }
-
- }
-
- private boolean isUnicode() {
- return this.field_1 + 6 < this.buf.length && this.buf[this.field_1] == 92 && this.buf[this.field_1 + 1] == 117 && Convert.digit2int(this.buf[this.field_1 + 2], 16) >= 0 && Convert.digit2int(this.buf[this.field_1 + 3], 16) >= 0 && Convert.digit2int(this.buf[this.field_1 + 4], 16) >= 0 && Convert.digit2int(this.buf[this.field_1 + 5], 16) >= 0;
- }
-
- private void putch(byte var1) {
- if (this.litlen == this.lit.length) {
- byte[] var2 = new byte[this.lit.length * 2];
- System.arraycopy(this.lit, 0, var2, 0, this.lit.length);
- this.lit = var2;
- }
-
- this.lit[this.litlen++] = var1;
- }
-
- private void lexError(String var1) {
- this.lexError(var1, this.pos);
- }
-
- private void lexError(String var1, int var2) {
- Report.error(var2, var1);
- this.sym = 110;
- this.errPos = var2;
- }
-
- private void dch() {
- System.out.print((char)this.field_0);
- System.out.flush();
- }
-
- Scanner(FileInputStream var1) {
- try {
- this.buf = new byte[var1.available() + 1];
- if (var1.read(this.buf) != this.buf.length - 1) {
- throw new IOException("read error");
- }
- } catch (IOException var3) {
- this.lexError(((Throwable)var3).toString());
- this.buf = new byte[1];
- }
-
- this.buf[this.buf.length - 1] = 26;
- this.field_1 = 0;
- this.cline = 1;
- this.ccol = 1;
- this.field_0 = this.buf[0];
- this.nextsym();
- if (Switches.extended) {
- maxKey = extendedMaxKey;
- } else {
- maxKey = standardMaxKey;
- }
-
- }
- }
-