diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 397aa70..f9c4c06 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -35,13 +35,17 @@ public final class Parser { private int position; private final Map labels; + /** Оптимизация, чтобы каждый раз не искать endmenu, + * если их попросту нет в необработанном сценарии */ + private boolean hasEndMenu; public Parser(List tokens) { this.tokens = tokens; tokensCount = tokens.size(); position = 0; labels = new HashMap(); - scanLabels(); + hasEndMenu = false; + preScan(); } public List getTokens() { @@ -308,6 +312,7 @@ public final class Parser { title = consume(TokenType.TEXT).getText(); } + if (!hasEndMenu) return false; // Ищем элементы выбора final Menu menu = new Menu(title); int pos = 0; @@ -348,10 +353,14 @@ public final class Parser { return false; } - private void scanLabels() { + private void preScan() { // Сканируем все метки, для быстрого перехода командой jump. + // А также определяем параметры для оптимизации. for (int i = 0; i < tokensCount - 2; i++) { - if ( (tokens.get(i).getType() == TokenType.LABEL) && + final TokenType current = tokens.get(i).getType(); + if (current == TokenType.ENDMENU) { + hasEndMenu = true; + } else if ( (current == TokenType.LABEL) && (tokens.get(i + 2).getType() == TokenType.COLON) ) { // label word : final Token token = tokens.get(i + 1);