⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanner.java

📁 是一款用JAVA 编写的编译器 具有很强的编译功能
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                        }                        isJavaIdentifierPart = Character.isJavaIdentifierPart(                            Character.toCodePoint(high, ch));                    } else {                        isJavaIdentifierPart = Character.isJavaIdentifierPart(ch);                    }                }		if (!isJavaIdentifierPart) {		    name = names.fromChars(sbuf, 0, sp);		    token = keywords.key(name);		    return;		}	    }	} while (true);    }    /** Are surrogates supported?     */    final static boolean surrogatesSupported = surrogatesSupported();    private static boolean surrogatesSupported() {        try {            Character.isHighSurrogate('a');            return true;        } catch (NoSuchMethodError ex) {            return false;        }    }    /** Scan surrogate pairs.  If 'ch' is a high surrogate and     *  the next character is a low surrogate, then put the low     *  surrogate in 'ch', and return the high surrogate.     *  otherwise, just return 0.     */    private char scanSurrogates() {        if (surrogatesSupported && Character.isHighSurrogate(ch)) {            char high = ch;            scanChar();            if (Character.isLowSurrogate(ch)) {                return high;            }            ch = high;        }        return 0;    }    /** Return true if ch can be part of an operator.     */    private boolean isSpecial(char ch) {        switch (ch) {        case '!': case '%': case '&': case '*': case '?':        case '+': case '-': case ':': case '<': case '=':        case '>': case '^': case '|': case '~':	case '@':            return true;        default:            return false;        }    }    /** Read longest possible sequence of special characters and convert     *  to token.     */    private void scanOperator() {	while (true) {	    putChar(ch);	    Name newname = names.fromChars(sbuf, 0, sp);            if (keywords.key(newname) == IDENTIFIER) {		sp--;		break;	    }            name = newname;            token = keywords.key(newname);	    scanChar();	    if (!isSpecial(ch)) break;	}    }    /**     * Scan a documention comment; determine if a deprecated tag is present.     * Called once the initial /, * have been skipped, positioned at the second *     * (which is treated as the beginning of the first line).     * Stops positioned at the closing '/'.     */    @SuppressWarnings("fallthrough")    private void scanDocComment() {	boolean deprecatedPrefix = false;	forEachLine:	while (bp < buflen) {	    // Skip optional WhiteSpace at beginning of line	    while (bp < buflen && (ch == ' ' || ch == '\t' || ch == FF)) {		scanCommentChar();	    }	    // Skip optional consecutive Stars	    while (bp < buflen && ch == '*') {		scanCommentChar();		if (ch == '/') {		    return;		}	    }		    // Skip optional WhiteSpace after Stars	    while (bp < buflen && (ch == ' ' || ch == '\t' || ch == FF)) {		scanCommentChar();	    }	    deprecatedPrefix = false;	    // At beginning of line in the JavaDoc sense.	    if (bp < buflen && ch == '@' && !deprecatedFlag) {		scanCommentChar();		if (bp < buflen && ch == 'd') {		    scanCommentChar();		    if (bp < buflen && ch == 'e') {			scanCommentChar();			if (bp < buflen && ch == 'p') {			    scanCommentChar();			    if (bp < buflen && ch == 'r') {				scanCommentChar();				if (bp < buflen && ch == 'e') {				    scanCommentChar();				    if (bp < buflen && ch == 'c') {					scanCommentChar();					if (bp < buflen && ch == 'a') {					    scanCommentChar();					    if (bp < buflen && ch == 't') {						scanCommentChar();						if (bp < buflen && ch == 'e') {						    scanCommentChar();						    if (bp < buflen && ch == 'd') {							deprecatedPrefix = true;							scanCommentChar();						    }}}}}}}}}}}	    if (deprecatedPrefix && bp < buflen) {		if (Character.isWhitespace(ch)) {		    deprecatedFlag = true;		} else if (ch == '*') {		    scanCommentChar();		    if (ch == '/') {			deprecatedFlag = true;			return;		    }		}	    }	    // Skip rest of line	    while (bp < buflen) {		switch (ch) {		case '*':		    scanCommentChar();		    if (ch == '/') {			return;		    }		    break;		case CR: // (Spec 3.4)		    scanCommentChar();		    if (ch != LF) {			continue forEachLine;		    }		    /* fall through to LF case */		case LF: // (Spec 3.4)		    scanCommentChar();		    continue forEachLine;		default:		    scanCommentChar();		}	    } // rest of line	} // forEachLine	return;    }    /** The value of a literal token, recorded as a string.     *  For integers, leading 0x and 'l' suffixes are suppressed.     */    public String stringVal() {	return new String(sbuf, 0, sp);    }    /** Read token.     */    public void nextToken() {	try {	    prevEndPos = endPos;	    sp = 0;		    while (true) {		pos = bp;		switch (ch) {		case ' ': // (Spec 3.6)		case '\t': // (Spec 3.6)		case FF: // (Spec 3.6)		    do {			scanChar();		    } while (ch == ' ' || ch == '\t' || ch == FF);		    endPos = bp;		    processWhiteSpace();		    break;		case LF: // (Spec 3.4)		    scanChar();		    endPos = bp;		    processLineTerminator();		    break;		case CR: // (Spec 3.4)		    scanChar();		    if (ch == LF) {			scanChar();		    }		    endPos = bp;		    processLineTerminator();		    break;		case 'A': case 'B': case 'C': case 'D': case 'E':		case 'F': case 'G': case 'H': case 'I': case 'J':		case 'K': case 'L': case 'M': case 'N': case 'O':		case 'P': case 'Q': case 'R': case 'S': case 'T':		case 'U': case 'V': case 'W': case 'X': case 'Y':		case 'Z':		case 'a': case 'b': case 'c': case 'd': case 'e':		case 'f': case 'g': case 'h': case 'i': case 'j':		case 'k': case 'l': case 'm': case 'n': case 'o':		case 'p': case 'q': case 'r': case 's': case 't':		case 'u': case 'v': case 'w': case 'x': case 'y':		case 'z':		case '$': case '_':		    scanIdent();		    return;		case '0':		    scanChar();		    if (ch == 'x' || ch == 'X') {			scanChar();			if (ch == '.') {			    scanHexFractionAndSuffix(false);			} else if (digit(16) < 0) {			    lexError("invalid.hex.number");			} else {			    scanNumber(16);			}		    } else {			putChar('0');			scanNumber(8);		    }		    return;		case '1': case '2': case '3': case '4':		case '5': case '6': case '7': case '8': case '9':		    scanNumber(10);		    return;		case '.':		    scanChar();		    if ('0' <= ch && ch <= '9') {			putChar('.');			scanFractionAndSuffix();		    } else if (ch == '.') {			putChar('.'); putChar('.');			scanChar();			if (ch == '.') {			    scanChar();			    putChar('.');			    token = ELLIPSIS;			} else {			    lexError("malformed.fp.lit");			}		    } else {			token = DOT;		    }		    return;		case ',':		    scanChar(); token = COMMA; return;		case ';':		    scanChar(); token = SEMI; return;		case '(':		    scanChar(); token = LPAREN; return;		case ')':		    scanChar(); token = RPAREN; return;		case '[':		    scanChar(); token = LBRACKET; return;		case ']':		    scanChar(); token = RBRACKET; return;		case '{':		    scanChar(); token = LBRACE; return;		case '}':		    scanChar(); token = RBRACE; return;		case '/':		    scanChar();		    if (ch == '/') {			do {			    scanCommentChar();			} while (ch != CR && ch != LF && bp < buflen);			if (bp < buflen) {			    endPos = bp;			    processComment(CommentStyle.LINE);			}			break;		    } else if (ch == '*') {			scanChar();                        CommentStyle style;			if (ch == '*') {                            style = CommentStyle.JAVADOC;			    scanDocComment();			} else {                            style = CommentStyle.BLOCK;			    while (bp < buflen) {				if (ch == '*') {				    scanChar();				    if (ch == '/') break;				} else {				    scanCommentChar();				}			    }			}			if (ch == '/') {			    scanChar();			    endPos = bp;			    processComment(style);			    break;			} else {			    lexError("unclosed.comment");			    return;			}		    } else if (ch == '=') {			name = names.slashequals;			token = SLASHEQ;			scanChar();		    } else {			name = names.slash;			token = SLASH;		    }		    return;		case '\'':		    scanChar();		    if (ch == '\'') {			lexError("empty.char.lit");		    } else {			if (ch == CR || ch == LF)			    lexError(pos, "illegal.line.end.in.char.lit");			scanLitChar();			if (ch == '\'') {			    scanChar();			    token = CHARLITERAL;			} else {			    lexError(pos, "unclosed.char.lit");			}		    }		    return;		case '\"':		    scanChar();		    while (ch != '\"' && ch != CR && ch != LF && bp < buflen)			scanLitChar();		    if (ch == '\"') {			token = STRINGLITERAL;			scanChar();		    } else {			lexError(pos, "unclosed.str.lit");		    }		    return;		default:		    if (isSpecial(ch)) {			scanOperator();		    } else {                        boolean isJavaIdentifierStart;                        if (ch < '\u0080') {                            // all ASCII range chars already handled, above                            isJavaIdentifierStart = false;                        } else {                            char high = scanSurrogates();                            if (high != 0) {	                        if (sp == sbuf.length) {                                    putChar(high);                                } else {                                    sbuf[sp++] = high;                                }                                isJavaIdentifierStart = Character.isJavaIdentifierStart(                                    Character.toCodePoint(high, ch));                            } else {                                isJavaIdentifierStart = Character.isJavaIdentifierStart(ch);                            }                        }                        if (isJavaIdentifierStart) {			    scanIdent();		        } else if (bp == buflen || ch == EOI && bp+1 == buflen) { // JLS 3.5			    token = EOF;                            pos = bp = eofPos;		        } else {                            lexError("illegal.char", String.valueOf((int)ch));			    scanChar();		        }		    }		    return;		}	    }	} finally {	    endPos = bp;	    if (scannerDebug)		System.out.println("nextToken(" + pos				   + "," + endPos + ")=|" +				   new String(getRawCharacters(pos, endPos))				   + "|");	}    }    /** Return the current token, set by nextToken().     */    public Token token() {        return token;    }    /** Sets the current token.     */    public void token(Token token) {        this.token = token;    }    /** Return the current token's position: a 0-based     *  offset from beginning of the raw input stream     *  (before unicode translation)     */    public int pos() {        return pos;    }    /** Return the last character position of the current token.     */    public int endPos() {        return endPos;    }    /** Return the last character position of the previous token.     */    public int prevEndPos() {        return prevEndPos;    }    /** Return the position where a lexical error occurred;     */    public int errPos() {        return errPos;    }    /** Set the position where a lexical error occurred;     */    public void errPos(int pos) {        errPos = pos;    }    /** Return the name of an identifier or token for the current token.     */    public Name name() {        return name;    }    /** Return the radix of a numeric literal token.     */    public int radix() {        return radix;    }    /** Has a @deprecated been encountered in last doc comment?     *  This needs to be reset by client with resetDeprecatedFlag.     */    public boolean deprecatedFlag() {        return deprecatedFlag;    }    public void resetDeprecatedFlag() {        deprecatedFlag = false;    }    /**     * Returns the documentation string of the current token.     */    public String docComment() {        return null;    }    /**     * Returns a copy of the input buffer, up to its inputLength.     * Unicode escape sequences are not translated.     */    public char[] getRawCharacters() {        char[] chars = new char[buflen];        System.arraycopy(buf, 0, chars, 0, buflen);        return chars;    }    /**     * Returns a copy of a character array subset of the input buffer.     * The returned array begins at the <code>beginIndex</code> and     * extends to the character at index <code>endIndex - 1</code>.     * Thus the length of the substring is <code>endIndex-beginIndex</code>.     * This behavior is like      * <code>String.substring(beginIndex, endIndex)</code>.     * Unicode escape sequences are not translated.     *     * @param beginIndex the beginning index, inclusive.     * @param endIndex the ending index, exclusive.     * @throws IndexOutOfBounds if either offset is outside of the     *         array bounds     */    public char[] getRawCharacters(int beginIndex, int endIndex) {        int length = endIndex - beginIndex;        char[] chars = new char[length];        System.arraycopy(buf, beginIndex, chars, 0, length);        return chars;    }    public enum CommentStyle {        LINE,        BLOCK,        JAVADOC,    }    /**     * Called when a complete comment has been scanned. pos and endPos      * will mark the comment boundary.     */    protected void processComment(CommentStyle style) {	if (scannerDebug)	    System.out.println("processComment(" + pos			       + "," + endPos + "," + style + ")=|"                               + new String(getRawCharacters(pos, endPos))			       + "|");    }    /**     * Called when a complete whitespace run has been scanned. pos and endPos      * will mark the whitespace boundary.     */    protected void processWhiteSpace() {	if (scannerDebug)	    System.out.println("processWhitespace(" + pos			       + "," + endPos + ")=|" +			       new String(getRawCharacters(pos, endPos))			       + "|");    }    /**     * Called when a line terminator has been processed.     */    protected void processLineTerminator() {	if (scannerDebug)	    System.out.println("processTerminator(" + pos			       + "," + endPos + ")=|" +			       new String(getRawCharacters(pos, endPos))			       + "|");    }    /** Build a map for translating between line numbers and     * positions in the input.     *     * @return a LineMap */    public Position.LineMap getLineMap() {	return Position.makeLineMap(buf, buflen, false);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -