📄 scanner.java
字号:
scanChar();
break;
case 'f':
putChar('\f');
scanChar();
break;
case 'r':
putChar('\r');
scanChar();
break;
case '\'':
putChar('\'');
scanChar();
break;
case '\"':
putChar('\"');
scanChar();
break;
case '\\':
putChar('\\');
scanChar();
break;
default:
lexError(Position.make(line, col), "illegal.esc.char");
}
}
} else if (bp != buflen) {
putChar(ch);
scanChar();
}
}
/**
* 读取浮点数的小数部分
*/
private void scanFraction() {
while (digit(10) >= 0) {
putChar(ch);
scanChar();
}
int sp1 = sp;
if (ch == 'e' || ch == 'E') {
putChar(ch);
scanChar();
if (ch == '+' || ch == '-') {
putChar(ch);
scanChar();
}
if ('0' <= ch && ch <= '9') {
do {
putChar(ch);
scanChar();
} while ('0' <= ch && ch <= '9')
;
return;
}
lexError("malformed.fp.lit");
sp = sp1;
}
}
/**
*读取浮点数的小数部分和f,d后缀。
*/
private void scanFractionAndSuffix() {
scanFraction();
if (ch == 'f' || ch == 'F') {
putChar(ch);
scanChar();
token = FLOATLITERAL;
} else {
if (ch == 'd' || ch == 'D') {
putChar(ch);
scanChar();
}
token = DOUBLELITERAL;
}
}
/**
* 处理数字及其各种后缀。
*/
private void scanNumber(int radix) {
this.radix = radix;
int digitRadix = (radix <= 10) ? 10 : 16;
while (digit(digitRadix) >= 0) {
putChar(ch);
scanChar();
}
if (radix <= 10 && ch == '.') {
putChar(ch);
scanChar();
scanFractionAndSuffix();
} else if (radix <= 10 &&
(ch == 'e' || ch == 'E' || ch == 'f' || ch == 'F' || ch == 'd' ||
ch == 'D')) {
scanFractionAndSuffix();
} else {
if (ch == 'l' || ch == 'L') {
scanChar();
token = LONGLITERAL;
} else {
token = INTLITERAL;
}
}
}
/**
*读取标示符:实现方法:循环读取下一个字符,直到不能识别为止,然后将
*得到字符串转化为一个name对象,并将其在字母表中进行对比,判断是否为标示符,
*或者其他。
*/
private void scanIdent() {
do {
if (sp == sbuf.length)
putChar(ch);
else
sbuf[sp++] = ch;
scanChar();
switch (ch) {
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 '_':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
break;
default:
if (!Character.isJavaIdentifierPart(ch) || bp >= buflen) {
name = names.fromChars(sbuf, 0, sp);
token = keywords.key(name);
return;
}
}
} while (true)
;
}
/**
* 如果是操作符得一部分,则返回true,用于判断操作符。
*
* */
private boolean isSpecial(char ch) {
switch (ch) {
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 doccomment line after the inital '*''s for
* a @deprecated tag. This should be extended to support all javadoc tags.
*/
private void scanDocCommentTag() {
int start = bp + 1;
do {
scanDocCommentChar();
} while ('a' <= ch && ch <= 'z')
;
if (names.fromChars(buf, start, bp - start) == names.deprecated) {
deprecatedFlag = true;
}
}
/**
*跳过不是javadoc工具要处理的注释。
*/
private void skipComment() {
while (bp < buflen) {
switch (ch) {
case '*':
scanChar();
if (ch == '/')
return;
break;
default:
scanCommentChar();
break;
}
}
}
/**
*
* 读入javadoc工具要处理的注释,并将其转为一个字符串,
*/
private String scanDocComment() {
if (buffer == null)
buffer = new char[1024];
count = 0;
boolean linestart = false;
boolean firstLine = true;
while (bp < buflen && ch == '*') {
scanDocCommentChar();
}
if (bp < buflen && ch == '/') {
return "";
}
if (bp < buflen) {
if (ch == LF) {
scanDocCommentChar();
firstLine = false;
} else if (ch == CR) {
scanDocCommentChar();
if (ch == LF) {
scanDocCommentChar();
firstLine = false;
}
}
}
outerLoop:
while (bp < buflen) {
wsLoop:
while (bp < buflen) {
switch (ch) {
case ' ':
scanDocCommentChar();
break;
case '\t':
col = ((col - 1) / TabInc * TabInc) + TabInc;
scanDocCommentChar();
break;
case FF:
col = 0;
scanDocCommentChar();
break;
default:
break wsLoop;
}
}
if (ch == '*') {
do {
scanDocCommentChar();
} while (ch == '*')
;
if (ch == '/') {
break outerLoop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -