From 326c70f5149622c42e6784ed3c2ea5a82ce52f68 Mon Sep 17 00:00:00 2001 From: Victor Date: Thu, 16 Apr 2015 18:11:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D1=85=20=D0=BC=D0=B5=D0=BD=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/everlastingsummer/Parser.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 79df171..9931d3b 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -145,13 +145,7 @@ public final class Parser { // Остаток от меню выбора. Пропускаем до появления ENDMENU. if (match(token, TokenType.TEXT)) { - int pos = 0; - while (true) { - if (lookMatch(pos, TokenType.ENDMENU)) break; - if (lookMatch(pos, TokenType.EOF)) return true; - pos++; - } - position += pos; + if (hasEndMenu) position += skipMenu(); return false; } @@ -553,6 +547,25 @@ public final class Parser { } } + private int skipMenu() { + int pos = 0; + int level = 1; // уровень вложенности меню + while (true) { + // Расчёт уровня меню. + if (lookMatch(pos, TokenType.MENU) && lookMatch(pos + 1, TokenType.COLON)) { + level++; + pos++; + } + if (lookMatch(pos, TokenType.ENDMENU)) { + level--; + // Завершаем работу по достижению ENDMENU первого уровня. + if (level <= 0) break; + } + pos++; + } + return pos; + } + private double consumeDouble() { return Double.parseDouble(consume(TokenType.NUMBER).getText());