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());