Оптимизация поиска ENDMENU
This commit is contained in:
parent
d96956d1aa
commit
c42332f4a2
@ -35,13 +35,17 @@ public final class Parser {
|
|||||||
private int position;
|
private int position;
|
||||||
|
|
||||||
private final Map<String, Integer> labels;
|
private final Map<String, Integer> labels;
|
||||||
|
/** Оптимизация, чтобы каждый раз не искать endmenu,
|
||||||
|
* если их попросту нет в необработанном сценарии */
|
||||||
|
private boolean hasEndMenu;
|
||||||
|
|
||||||
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>();
|
labels = new HashMap<String, Integer>();
|
||||||
scanLabels();
|
hasEndMenu = false;
|
||||||
|
preScan();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Token> getTokens() {
|
public List<Token> getTokens() {
|
||||||
@ -308,6 +312,7 @@ public final class Parser {
|
|||||||
title = consume(TokenType.TEXT).getText();
|
title = consume(TokenType.TEXT).getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!hasEndMenu) return false;
|
||||||
// Ищем элементы выбора
|
// Ищем элементы выбора
|
||||||
final Menu menu = new Menu(title);
|
final Menu menu = new Menu(title);
|
||||||
int pos = 0;
|
int pos = 0;
|
||||||
@ -348,10 +353,14 @@ public final class Parser {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void scanLabels() {
|
private void preScan() {
|
||||||
// Сканируем все метки, для быстрого перехода командой jump.
|
// Сканируем все метки, для быстрого перехода командой jump.
|
||||||
|
// А также определяем параметры для оптимизации.
|
||||||
for (int i = 0; i < tokensCount - 2; i++) {
|
for (int i = 0; i < tokensCount - 2; i++) {
|
||||||
if ( (tokens.get(i).getType() == TokenType.LABEL) &&
|
final TokenType current = tokens.get(i).getType();
|
||||||
|
if (current == TokenType.ENDMENU) {
|
||||||
|
hasEndMenu = true;
|
||||||
|
} else if ( (current == TokenType.LABEL) &&
|
||||||
(tokens.get(i + 2).getType() == TokenType.COLON) ) {
|
(tokens.get(i + 2).getType() == TokenType.COLON) ) {
|
||||||
// label word :
|
// label word :
|
||||||
final Token token = tokens.get(i + 1);
|
final Token token = tokens.get(i + 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user