diff --git a/src/com/annimon/everlastingsummer/Lexer.java b/src/com/annimon/everlastingsummer/Lexer.java index 65b59e1..adbaff7 100644 --- a/src/com/annimon/everlastingsummer/Lexer.java +++ b/src/com/annimon/everlastingsummer/Lexer.java @@ -1,7 +1,10 @@ package com.annimon.everlastingsummer; -import java.util.LinkedList; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; /** * @author aNNiMON @@ -22,37 +25,42 @@ public final class Lexer { TokenType.LPAREN, TokenType.RPAREN, TokenType.LBRACKET, TokenType.RBRACKET, TokenType.COMMAND, TokenType.COLON, }; - - private static final String[] KEYWORDS = { - "play", "stop", - "music", "ambience", "sound", "sound_loop", - "fadein", "fadeout", + + private static final Map KEYWORDS; + static { + KEYWORDS = new HashMap(); + 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", - "at", - "window", "hide", "show", - "with", + KEYWORDS.put("scene", TokenType.SCENE); + KEYWORDS.put("anim", TokenType.ANIM); + KEYWORDS.put("bg", TokenType.BG); + 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", - "prolog_time", "day_time", "sunset_time", "night_time" - }; - private static final TokenType[] KEYWORD_TYPES = new TokenType[] { - TokenType.PLAY, TokenType.STOP, - TokenType.MUSIC, TokenType.AMBIENCE, TokenType.SOUND, TokenType.SOUNDLOOP, - 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 - }; + KEYWORDS.put("renpy.pause", TokenType.RENPY_PAUSE); + KEYWORDS.put("persistent.sprite_time", TokenType.PERSISTENT_SPRITE_TIME); + KEYWORDS.put("prolog_time", TokenType.PROLOG_TIME); + KEYWORDS.put("day_time", TokenType.DAY_TIME); + KEYWORDS.put("sunset_time", TokenType.SUNSET_TIME); + KEYWORDS.put("night_time", TokenType.NIGHT_TIME); + } private TokenizeState state; private int pos; @@ -117,14 +125,8 @@ public final class Lexer { if (Character.isLetterOrDigit(ch) || (ch == '_') || (ch == '.')) { buffer.append(ch); } else { - final String word = buffer.toString(); - for (int i = 0; i < KEYWORDS.length; i++) { - if (KEYWORDS[i].equalsIgnoreCase(word)) { - addToken(KEYWORD_TYPES[i]); - return; - } - } - addToken(TokenType.WORD); + final String word = buffer.toString().toLowerCase(Locale.ENGLISH); + addToken(KEYWORDS.containsKey(word) ? KEYWORDS.get(word) : TokenType.WORD); } }