不改变类,优化以下方法: public TokenType nextToken() { if (!has_end) { if (index < source.length()) { switch (source.charAt(index++)) { case '.': System.out.println("DOT"); return TokenType.DOT; case '(': System.out.println("LPAREN"); return TokenType.LPAREN; case ')': System.out.println("RPAREN"); return TokenType.RPAREN; case '\\': System.out.println("LAMBDA"); return TokenType.LAMBDA; case ' ': return TokenType.BLANK; default: if ('a' <= source.charAt(index - 1) && source.charAt(index - 1) <= 'z') { int temp = index; while (temp < source.length() && (('a' < source.charAt(temp) && source.charAt(temp) <= 'z') || ('A' <= source.charAt(temp) && source.charAt(temp) <= 'Z') || ('0' <= source.charAt(temp) && source.charAt(temp) <= '9'))) { temp++; } index = temp; System.out.println("LCID"); return TokenType.LCID; } else { System.out.println("EOF"); return TokenType.EOF; } } } else { has_end = true; System.out.println("EOF"); return TokenType.EOF; } } System.out.println("EOF"); return TokenType.EOF; }
时间: 2024-01-17 22:06:00 浏览: 26
可以使用一个HashMap来存储字符和它对应的TokenType,以避免在每次调用nextToken()方法时都进行字符匹配。例如:
```
private static final Map<Character, TokenType> tokenMap = new HashMap<Character, TokenType>() {{
put('.', TokenType.DOT);
put('(', TokenType.LPAREN);
put(')', TokenType.RPAREN);
put('\\', TokenType.LAMBDA);
put(' ', TokenType.BLANK);
}};
public TokenType nextToken() {
if (!has_end) {
if (index < source.length()) {
char c = source.charAt(index++);
TokenType tokenType = tokenMap.get(c);
if (tokenType != null) {
System.out.println(tokenType);
return tokenType;
} else if ('a' <= c && c <= 'z') {
int temp = index;
while (temp < source.length() && (('a' < source.charAt(temp) && source.charAt(temp) <= 'z')
|| ('A' <= source.charAt(temp) && source.charAt(temp) <= 'Z')
|| ('0' <= source.charAt(temp) && source.charAt(temp) <= '9'))) {
temp++;
}
index = temp;
System.out.println("LCID");
return TokenType.LCID;
} else {
System.out.println("EOF");
return TokenType.EOF;
}
} else {
has_end = true;
System.out.println("EOF");
return TokenType.EOF;
}
}
System.out.println("EOF");
return TokenType.EOF;
}
```
这样,当需要添加新的字符时,只需要在HashMap中添加对应的键值对即可。在每次调用nextToken()方法时,只需查找HashMap中是否存在对应的TokenType即可。