Поддержка переходов и меток (jump / label)
This commit is contained in:
parent
22f0ac668f
commit
3801a48468
@ -33,7 +33,7 @@ public final class Lexer {
|
|||||||
"window", "hide", "show",
|
"window", "hide", "show",
|
||||||
"with",
|
"with",
|
||||||
|
|
||||||
"return", "menu", "endmenu",
|
"return", "menu", "endmenu", "jump", "label",
|
||||||
|
|
||||||
"renpy.pause", "persistent.sprite_time",
|
"renpy.pause", "persistent.sprite_time",
|
||||||
"prolog_time", "day_time", "sunset_time", "night_time"
|
"prolog_time", "day_time", "sunset_time", "night_time"
|
||||||
@ -48,7 +48,7 @@ public final class Lexer {
|
|||||||
TokenType.WINDOW, TokenType.HIDE, TokenType.SHOW,
|
TokenType.WINDOW, TokenType.HIDE, TokenType.SHOW,
|
||||||
TokenType.WITH,
|
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.RENPY_PAUSE, TokenType.PERSISTENT_SPRITE_TIME,
|
||||||
TokenType.PROLOG_TIME, TokenType.DAY_TIME, TokenType.SUNSET_TIME, TokenType.NIGHT_TIME
|
TokenType.PROLOG_TIME, TokenType.DAY_TIME, TokenType.SUNSET_TIME, TokenType.NIGHT_TIME
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package com.annimon.everlastingsummer;
|
package com.annimon.everlastingsummer;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,10 +28,14 @@ public final class Parser {
|
|||||||
private final int tokensCount;
|
private final int tokensCount;
|
||||||
private int position;
|
private int position;
|
||||||
|
|
||||||
|
private final Map<String, Integer> labels;
|
||||||
|
|
||||||
public Parser(List<Token> tokens) {
|
public Parser(List<Token> tokens) {
|
||||||
this.tokens = tokens;
|
this.tokens = tokens;
|
||||||
tokensCount = tokens.size();
|
tokensCount = tokens.size();
|
||||||
position = 0;
|
position = 0;
|
||||||
|
labels = new HashMap<String, Integer>();
|
||||||
|
scanLabels();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Token> getTokens() {
|
public List<Token> getTokens() {
|
||||||
@ -117,6 +123,8 @@ public final class Parser {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (match(token, TokenType.JUMP)) return jump();
|
||||||
|
|
||||||
if (lookMatch(1, TokenType.COLON)) {
|
if (lookMatch(1, TokenType.COLON)) {
|
||||||
// menu:
|
// menu:
|
||||||
if (match(token, TokenType.MENU)) return menu();
|
if (match(token, TokenType.MENU)) return menu();
|
||||||
@ -326,6 +334,30 @@ public final class Parser {
|
|||||||
return true;
|
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() {
|
private double consumeDouble() {
|
||||||
return Double.parseDouble(consume(TokenType.NUMBER).getText());
|
return Double.parseDouble(consume(TokenType.NUMBER).getText());
|
||||||
|
@ -44,6 +44,8 @@ public enum TokenType {
|
|||||||
|
|
||||||
MENU,
|
MENU,
|
||||||
ENDMENU,
|
ENDMENU,
|
||||||
|
JUMP,
|
||||||
|
LABEL,
|
||||||
RETURN,
|
RETURN,
|
||||||
|
|
||||||
// команды
|
// команды
|
||||||
|
Loading…
Reference in New Issue
Block a user