From 595dced7bdc644fc910ee32bac1467e9bb9d7f02 Mon Sep 17 00:00:00 2001 From: Victor Date: Wed, 15 Apr 2015 23:40:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B0=D1=80=D1=81=D0=B8=D0=BD=D0=B3=20?= =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=BD=D1=8B=D1=85=20=D0=B2=D1=8B?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9=20if?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/everlastingsummer/Lexer.java | 3 ++ src/com/annimon/everlastingsummer/Parser.java | 29 +++++++++++++++++++ .../annimon/everlastingsummer/TokenType.java | 3 ++ 3 files changed, 35 insertions(+) diff --git a/src/com/annimon/everlastingsummer/Lexer.java b/src/com/annimon/everlastingsummer/Lexer.java index e5824d6..eec60e3 100644 --- a/src/com/annimon/everlastingsummer/Lexer.java +++ b/src/com/annimon/everlastingsummer/Lexer.java @@ -51,6 +51,9 @@ public final class Lexer { KEYWORDS.put("jump", TokenType.JUMP); KEYWORDS.put("label", TokenType.LABEL); + KEYWORDS.put("if", TokenType.IF); + KEYWORDS.put("endif", TokenType.ENDIF); + KEYWORDS.put("renpy.pause", TokenType.RENPY_PAUSE); KEYWORDS.put("persistent.sprite_time", TokenType.PERSISTENT_SPRITE_TIME); KEYWORDS.put("prolog_time", TokenType.PROLOG_TIME); diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index 81a8de4..e0f9a31 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -136,6 +136,7 @@ public final class Parser { } if (match(token, TokenType.JUMP)) return jump(); + if (match(token, TokenType.IF)) return ifStatement(); if (lookMatch(1, TokenType.COLON)) { // menu: @@ -363,6 +364,34 @@ public final class Parser { return false; } + private boolean ifStatement() { + final Expression condition = primary(); + consume(TokenType.COLON); + + if (condition.eval() == 0) { + // Если условие не верно, пропускаем блок до следующего ENDIF + int pos = 0; + int level = 1; // уровень вложенности блока + while (true) { + // Расчёт уровня блока. + if (lookMatch(pos, TokenType.IF)) { + level++; + pos++; + } + if (lookMatch(pos, TokenType.ENDIF)) { + level--; + // Завершаем работу по достижению ENDIF первого уровня. + if (level <= 0) break; + } + + if (lookMatch(pos, TokenType.EOF)) return false; + pos++; + } + position += pos; + } + return false; + } + private Expression expression() { return primary(); } diff --git a/src/com/annimon/everlastingsummer/TokenType.java b/src/com/annimon/everlastingsummer/TokenType.java index de95fc4..e7be886 100644 --- a/src/com/annimon/everlastingsummer/TokenType.java +++ b/src/com/annimon/everlastingsummer/TokenType.java @@ -48,6 +48,9 @@ public enum TokenType { LABEL, RETURN, + IF, + ENDIF, + // команды RENPY_PAUSE, PERSISTENT_SPRITE_TIME,