Парсинг условных выражений if
This commit is contained in:
parent
e7aaa59c64
commit
595dced7bd
@ -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);
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,9 @@ public enum TokenType {
|
|||||||
LABEL,
|
LABEL,
|
||||||
RETURN,
|
RETURN,
|
||||||
|
|
||||||
|
IF,
|
||||||
|
ENDIF,
|
||||||
|
|
||||||
// команды
|
// команды
|
||||||
RENPY_PAUSE,
|
RENPY_PAUSE,
|
||||||
PERSISTENT_SPRITE_TIME,
|
PERSISTENT_SPRITE_TIME,
|
||||||
|
Loading…
Reference in New Issue
Block a user