Парсинг условных выражений if

This commit is contained in:
Victor 2015-04-15 23:40:18 +03:00
parent e7aaa59c64
commit 595dced7bd
3 changed files with 35 additions and 0 deletions

View File

@ -51,6 +51,9 @@ public final class Lexer {
KEYWORDS.put("jump", TokenType.JUMP); KEYWORDS.put("jump", TokenType.JUMP);
KEYWORDS.put("label", TokenType.LABEL); KEYWORDS.put("label", TokenType.LABEL);
KEYWORDS.put("if", TokenType.IF);
KEYWORDS.put("endif", TokenType.ENDIF);
KEYWORDS.put("renpy.pause", TokenType.RENPY_PAUSE); KEYWORDS.put("renpy.pause", TokenType.RENPY_PAUSE);
KEYWORDS.put("persistent.sprite_time", TokenType.PERSISTENT_SPRITE_TIME); KEYWORDS.put("persistent.sprite_time", TokenType.PERSISTENT_SPRITE_TIME);
KEYWORDS.put("prolog_time", TokenType.PROLOG_TIME); KEYWORDS.put("prolog_time", TokenType.PROLOG_TIME);

View File

@ -136,6 +136,7 @@ public final class Parser {
} }
if (match(token, TokenType.JUMP)) return jump(); if (match(token, TokenType.JUMP)) return jump();
if (match(token, TokenType.IF)) return ifStatement();
if (lookMatch(1, TokenType.COLON)) { if (lookMatch(1, TokenType.COLON)) {
// menu: // menu:
@ -363,6 +364,34 @@ public final class Parser {
return false; 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() { private Expression expression() {
return primary(); return primary();
} }

View File

@ -48,6 +48,9 @@ public enum TokenType {
LABEL, LABEL,
RETURN, RETURN,
IF,
ENDIF,
// команды // команды
RENPY_PAUSE, RENPY_PAUSE,
PERSISTENT_SPRITE_TIME, PERSISTENT_SPRITE_TIME,