📄 lex.java
字号:
ungetc(c); return IntConstant; } } } } value = c - '0'; while ('0' <= c2 && c2 <= '9') { value = value * 10 + c2 - '0'; c2 = getc(); } token.longValue = value; if (c2 == 'F' || c2 == 'f') { token.doubleValue = (double)value; return FloatConstant; } else if (c2 == 'E' || c2 == 'e' || c2 == 'D' || c2 == 'd' || c2 == '.') { StringBuffer tbuf = textBuffer; tbuf.setLength(0); tbuf.append(value); return readDouble(tbuf, c2, token); } else if (c2 == 'L' || c2 == 'l') return LongConstant; else { ungetc(c2); return IntConstant; } } private int readDouble(StringBuffer sbuf, int c, Token token) { if (c != 'E' && c != 'e' && c != 'D' && c != 'd') { sbuf.append((char)c); for (;;) { c = getc(); if ('0' <= c && c <= '9') sbuf.append((char)c); else break; } } if (c == 'E' || c == 'e') { sbuf.append((char)c); c = getc(); if (c == '+' || c == '-') { sbuf.append((char)c); c = getc(); } while ('0' <= c && c <= '9') { sbuf.append((char)c); c = getc(); } } try { token.doubleValue = Double.parseDouble(sbuf.toString()); } catch (NumberFormatException e) { return BadToken; } if (c == 'F' || c == 'f') return FloatConstant; else { if (c != 'D' && c != 'd') ungetc(c); return DoubleConstant; } } // !"#$%&'( )*+,-./0 12345678 9:;<=>? private static final int[] equalOps = { NEQ, 0, 0, 0, MOD_E, AND_E, 0, 0, 0, MUL_E, PLUS_E, 0, MINUS_E, 0, DIV_E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LE, EQ, GE, 0 }; private int readSeparator(int c) { int c2, c3; if ('!' <= c && c <= '?') { int t = equalOps[c - '!']; if (t == 0) return c; else { c2 = getc(); if (c == c2) switch (c) { case '=' : return EQ; case '+' : return PLUSPLUS; case '-' : return MINUSMINUS; case '&' : return ANDAND; case '<' : c3 = getc(); if (c3 == '=') return LSHIFT_E; else { ungetc(c3); return LSHIFT; } case '>' : c3 = getc(); if (c3 == '=') return RSHIFT_E; else if (c3 == '>') { c3 = getc(); if (c3 == '=') return ARSHIFT_E; else { ungetc(c3); return ARSHIFT; } } else { ungetc(c3); return RSHIFT; } default : break; } else if (c2 == '=') return t; } } else if (c == '^') { c2 = getc(); if (c2 == '=') return EXOR_E; } else if (c == '|') { c2 = getc(); if (c2 == '=') return OR_E; else if (c2 == '|') return OROR; } else return c; ungetc(c2); return c; } private int readIdentifier(int c, Token token) { StringBuffer tbuf = textBuffer; tbuf.setLength(0); do { tbuf.append((char)c); c = getc(); } while (Character.isJavaIdentifierPart((char)c)); ungetc(c); String name = tbuf.toString(); int t = ktable.lookup(name); if (t >= 0) return t; else { /* tbuf.toString() is executed quickly since it does not * need memory copy. Using a hand-written extensible * byte-array class instead of StringBuffer is not a good idea * for execution speed. Converting a byte array to a String * object is very slow. Using an extensible char array * might be OK. */ token.textValue = name; return Identifier; } } private static final KeywordTable ktable = new KeywordTable(); static { ktable.append("abstract", ABSTRACT); ktable.append("boolean", BOOLEAN); ktable.append("break", BREAK); ktable.append("byte", BYTE); ktable.append("case", CASE); ktable.append("catch", CATCH); ktable.append("char", CHAR); ktable.append("class", CLASS); ktable.append("const", CONST); ktable.append("continue", CONTINUE); ktable.append("default", DEFAULT); ktable.append("do", DO); ktable.append("double", DOUBLE); ktable.append("else", ELSE); ktable.append("extends", EXTENDS); ktable.append("false", FALSE); ktable.append("final", FINAL); ktable.append("finally", FINALLY); ktable.append("float", FLOAT); ktable.append("for", FOR); ktable.append("goto", GOTO); ktable.append("if", IF); ktable.append("implements", IMPLEMENTS); ktable.append("import", IMPORT); ktable.append("instanceof", INSTANCEOF); ktable.append("int", INT); ktable.append("interface", INTERFACE); ktable.append("long", LONG); ktable.append("native", NATIVE); ktable.append("new", NEW); ktable.append("null", NULL); ktable.append("package", PACKAGE); ktable.append("private", PRIVATE); ktable.append("protected", PROTECTED); ktable.append("public", PUBLIC); ktable.append("return", RETURN); ktable.append("short", SHORT); ktable.append("static", STATIC); ktable.append("strictfp", STRICT); ktable.append("super", SUPER); ktable.append("switch", SWITCH); ktable.append("synchronized", SYNCHRONIZED); ktable.append("this", THIS); ktable.append("throw", THROW); ktable.append("throws", THROWS); ktable.append("transient", TRANSIENT); ktable.append("true", TRUE); ktable.append("try", TRY); ktable.append("void", VOID); ktable.append("volatile", VOLATILE); ktable.append("while", WHILE); } private static boolean isBlank(int c) { return c == ' ' || c == '\t' || c == '\f' || c == '\r' || c == '\n'; } private static boolean isDigit(int c) { return '0' <= c && c <= '9'; } private void ungetc(int c) { lastChar = c; } public String getTextAround() { int begin = position - 10; if (begin < 0) begin = 0; int end = position + 10; if (end > maxlen) end = maxlen; return input.substring(begin, end); } private int getc() { if (lastChar < 0) if (position < maxlen) return input.charAt(position++); else return -1; else { int c = lastChar; lastChar = -1; return c; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -