Использование HashMap вместо поиска по массиву в цикле
This commit is contained in:
parent
f8e5121229
commit
5645d37c6c
@ -1,7 +1,10 @@
|
|||||||
package com.annimon.everlastingsummer;
|
package com.annimon.everlastingsummer;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author aNNiMON
|
* @author aNNiMON
|
||||||
@ -22,37 +25,42 @@ public final class Lexer {
|
|||||||
TokenType.LPAREN, TokenType.RPAREN, TokenType.LBRACKET, TokenType.RBRACKET,
|
TokenType.LPAREN, TokenType.RPAREN, TokenType.LBRACKET, TokenType.RBRACKET,
|
||||||
TokenType.COMMAND, TokenType.COLON,
|
TokenType.COMMAND, TokenType.COLON,
|
||||||
};
|
};
|
||||||
|
|
||||||
private static final String[] KEYWORDS = {
|
private static final Map<String, TokenType> KEYWORDS;
|
||||||
"play", "stop",
|
static {
|
||||||
"music", "ambience", "sound", "sound_loop",
|
KEYWORDS = new HashMap<String, TokenType>();
|
||||||
"fadein", "fadeout",
|
KEYWORDS.put("play", TokenType.PLAY);
|
||||||
|
KEYWORDS.put("stop", TokenType.STOP);
|
||||||
|
KEYWORDS.put("music", TokenType.MUSIC);
|
||||||
|
KEYWORDS.put("ambience", TokenType.AMBIENCE);
|
||||||
|
KEYWORDS.put("sound", TokenType.SOUND);
|
||||||
|
KEYWORDS.put("sound_loop", TokenType.SOUNDLOOP);
|
||||||
|
KEYWORDS.put("fadein", TokenType.FADEIN);
|
||||||
|
KEYWORDS.put("fadeout", TokenType.FADEOUT);
|
||||||
|
|
||||||
"scene", "anim", "bg", "cg",
|
KEYWORDS.put("scene", TokenType.SCENE);
|
||||||
"at",
|
KEYWORDS.put("anim", TokenType.ANIM);
|
||||||
"window", "hide", "show",
|
KEYWORDS.put("bg", TokenType.BG);
|
||||||
"with",
|
KEYWORDS.put("cg", TokenType.CG);
|
||||||
|
KEYWORDS.put("at", TokenType.AT);
|
||||||
|
KEYWORDS.put("window", TokenType.WINDOW);
|
||||||
|
KEYWORDS.put("hide", TokenType.HIDE);
|
||||||
|
KEYWORDS.put("show", TokenType.SHOW);
|
||||||
|
KEYWORDS.put("with", TokenType.WITH);
|
||||||
|
|
||||||
"return", "menu", "endmenu", "jump", "label",
|
KEYWORDS.put("return", TokenType.RETURN);
|
||||||
|
KEYWORDS.put("menu", TokenType.MENU);
|
||||||
|
KEYWORDS.put("endmenu", TokenType.ENDMENU);
|
||||||
|
KEYWORDS.put("jump", TokenType.JUMP);
|
||||||
|
KEYWORDS.put("label", TokenType.LABEL);
|
||||||
|
|
||||||
"renpy.pause", "persistent.sprite_time",
|
KEYWORDS.put("renpy.pause", TokenType.RENPY_PAUSE);
|
||||||
"prolog_time", "day_time", "sunset_time", "night_time"
|
KEYWORDS.put("persistent.sprite_time", TokenType.PERSISTENT_SPRITE_TIME);
|
||||||
};
|
KEYWORDS.put("prolog_time", TokenType.PROLOG_TIME);
|
||||||
private static final TokenType[] KEYWORD_TYPES = new TokenType[] {
|
KEYWORDS.put("day_time", TokenType.DAY_TIME);
|
||||||
TokenType.PLAY, TokenType.STOP,
|
KEYWORDS.put("sunset_time", TokenType.SUNSET_TIME);
|
||||||
TokenType.MUSIC, TokenType.AMBIENCE, TokenType.SOUND, TokenType.SOUNDLOOP,
|
KEYWORDS.put("night_time", TokenType.NIGHT_TIME);
|
||||||
TokenType.FADEIN, TokenType.FADEOUT,
|
}
|
||||||
|
|
||||||
TokenType.SCENE, TokenType.ANIM, TokenType.BG, TokenType.CG,
|
|
||||||
TokenType.AT,
|
|
||||||
TokenType.WINDOW, TokenType.HIDE, TokenType.SHOW,
|
|
||||||
TokenType.WITH,
|
|
||||||
|
|
||||||
TokenType.RETURN, TokenType.MENU, TokenType.ENDMENU, TokenType.JUMP, TokenType.LABEL,
|
|
||||||
|
|
||||||
TokenType.RENPY_PAUSE, TokenType.PERSISTENT_SPRITE_TIME,
|
|
||||||
TokenType.PROLOG_TIME, TokenType.DAY_TIME, TokenType.SUNSET_TIME, TokenType.NIGHT_TIME
|
|
||||||
};
|
|
||||||
|
|
||||||
private TokenizeState state;
|
private TokenizeState state;
|
||||||
private int pos;
|
private int pos;
|
||||||
@ -117,14 +125,8 @@ public final class Lexer {
|
|||||||
if (Character.isLetterOrDigit(ch) || (ch == '_') || (ch == '.')) {
|
if (Character.isLetterOrDigit(ch) || (ch == '_') || (ch == '.')) {
|
||||||
buffer.append(ch);
|
buffer.append(ch);
|
||||||
} else {
|
} else {
|
||||||
final String word = buffer.toString();
|
final String word = buffer.toString().toLowerCase(Locale.ENGLISH);
|
||||||
for (int i = 0; i < KEYWORDS.length; i++) {
|
addToken(KEYWORDS.containsKey(word) ? KEYWORDS.get(word) : TokenType.WORD);
|
||||||
if (KEYWORDS[i].equalsIgnoreCase(word)) {
|
|
||||||
addToken(KEYWORD_TYPES[i]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
addToken(TokenType.WORD);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user