diff --git a/src/com/annimon/everlastingsummer/Lexer.java b/src/com/annimon/everlastingsummer/Lexer.java index eec60e3..35d370b 100644 --- a/src/com/annimon/everlastingsummer/Lexer.java +++ b/src/com/annimon/everlastingsummer/Lexer.java @@ -52,6 +52,7 @@ public final class Lexer { KEYWORDS.put("label", TokenType.LABEL); KEYWORDS.put("if", TokenType.IF); + KEYWORDS.put("else", TokenType.ELSE); KEYWORDS.put("endif", TokenType.ENDIF); KEYWORDS.put("renpy.pause", TokenType.RENPY_PAUSE); diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index e0f9a31..bcc967d 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -153,6 +153,18 @@ public final class Parser { position += pos; return false; } + + // Остаток от условного выражения. Пропускаем до появления ENDIF. + if (match(token, TokenType.ELSE)) { + int pos = 0; + while (true) { + if (lookMatch(pos, TokenType.ENDIF)) break; + if (lookMatch(pos, TokenType.EOF)) return true; + pos++; + } + position += pos; + return false; + } } // Текст с именем автора реплики. @@ -378,6 +390,12 @@ public final class Parser { level++; pos++; } + if (lookMatch(pos, TokenType.ELSE)) { + level--; + pos += 2; // пропускаем ELSE и двоеточие + // Завершаем работу по достижению ELSE первого уровня. + if (level <= 0) break; + } if (lookMatch(pos, TokenType.ENDIF)) { level--; // Завершаем работу по достижению ENDIF первого уровня. diff --git a/src/com/annimon/everlastingsummer/TokenType.java b/src/com/annimon/everlastingsummer/TokenType.java index e7be886..1349419 100644 --- a/src/com/annimon/everlastingsummer/TokenType.java +++ b/src/com/annimon/everlastingsummer/TokenType.java @@ -49,6 +49,7 @@ public enum TokenType { RETURN, IF, + ELSE, ENDIF, // команды