From c42332f4a2953f507bb41653f88eb948e87b5b87 Mon Sep 17 00:00:00 2001 From: Victor Date: Tue, 14 Apr 2015 21:57:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=BF=D1=82=D0=B8=D0=BC=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0?= =?UTF-8?q?=20ENDMENU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/everlastingsummer/Parser.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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);