From 3801a4846847a2598b2399df5cd0f37a4c2245f5 Mon Sep 17 00:00:00 2001 From: Victor Date: Mon, 13 Apr 2015 14:42:17 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B8=20=D0=BC=D0=B5=D1=82=D0=BE=D0=BA=20(jump=20/=20?= =?UTF-8?q?label)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/annimon/everlastingsummer/Lexer.java | 4 +-- src/com/annimon/everlastingsummer/Parser.java | 32 +++++++++++++++++++ .../annimon/everlastingsummer/TokenType.java | 2 ++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/com/annimon/everlastingsummer/Lexer.java b/src/com/annimon/everlastingsummer/Lexer.java index 0d6c7d1..318a042 100644 --- a/src/com/annimon/everlastingsummer/Lexer.java +++ b/src/com/annimon/everlastingsummer/Lexer.java @@ -33,7 +33,7 @@ public final class Lexer { "window", "hide", "show", "with", - "return", "menu", "endmenu", + "return", "menu", "endmenu", "jump", "label", "renpy.pause", "persistent.sprite_time", "prolog_time", "day_time", "sunset_time", "night_time" @@ -48,7 +48,7 @@ public final class Lexer { TokenType.WINDOW, TokenType.HIDE, TokenType.SHOW, TokenType.WITH, - TokenType.RETURN, TokenType.MENU, TokenType.ENDMENU, + TokenType.RETURN, TokenType.MENU, TokenType.ENDMENU, TokenType.JUMP, TokenType.LABEL, TokenType.RENPY_PAUSE, TokenType.PERSISTENT_SPRITE_TIME, TokenType.PROLOG_TIME, TokenType.DAY_TIME, TokenType.SUNSET_TIME, TokenType.NIGHT_TIME diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index f1ec72e..2755154 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -1,6 +1,8 @@ package com.annimon.everlastingsummer; +import java.util.HashMap; import java.util.List; +import java.util.Map; import android.text.TextUtils; /** @@ -26,10 +28,14 @@ public final class Parser { private final int tokensCount; private int position; + private final Map labels; + public Parser(List tokens) { this.tokens = tokens; tokensCount = tokens.size(); position = 0; + labels = new HashMap(); + scanLabels(); } public List getTokens() { @@ -117,6 +123,8 @@ public final class Parser { return false; } + if (match(token, TokenType.JUMP)) return jump(); + if (lookMatch(1, TokenType.COLON)) { // menu: if (match(token, TokenType.MENU)) return menu(); @@ -326,6 +334,30 @@ public final class Parser { return true; } + private boolean jump() { + final String labelName = consume(TokenType.WORD).getText(); + if (labels.containsKey(labelName)) { + position = labels.get(labelName); + } + return false; + } + + private void scanLabels() { + // Сканируем все метки, для быстрого перехода командой jump. + for (int i = 0; i < tokensCount - 2; i++) { + if ( (tokens.get(i).getType() == TokenType.LABEL) && + (tokens.get(i + 2).getType() == TokenType.COLON) ) { + // label word : + final Token token = tokens.get(i + 1); + if (token.getType() == TokenType.WORD) { + // Добавляем позицию команды, следующей после метки. + labels.put(token.getText(), i + 3); + } + i += 2; + } + } + } + private double consumeDouble() { return Double.parseDouble(consume(TokenType.NUMBER).getText()); diff --git a/src/com/annimon/everlastingsummer/TokenType.java b/src/com/annimon/everlastingsummer/TokenType.java index b933a52..de95fc4 100644 --- a/src/com/annimon/everlastingsummer/TokenType.java +++ b/src/com/annimon/everlastingsummer/TokenType.java @@ -44,6 +44,8 @@ public enum TokenType { MENU, ENDMENU, + JUMP, + LABEL, RETURN, // команды