Оптимизация поиска ENDMENU

This commit is contained in:
Victor 2015-04-14 21:57:44 +03:00
parent d96956d1aa
commit c42332f4a2

View File

@ -35,13 +35,17 @@ public final class Parser {
private int position;
private final Map<String, Integer> labels;
/** Оптимизация, чтобы каждый раз не искать endmenu,
* если их попросту нет в необработанном сценарии */
private boolean hasEndMenu;
public Parser(List<Token> tokens) {
this.tokens = tokens;
tokensCount = tokens.size();
position = 0;
labels = new HashMap<String, Integer>();
scanLabels();
hasEndMenu = false;
preScan();
}
public List<Token> getTokens() {
@ -308,6 +312,7 @@ public final class Parser {
title = consume(TokenType.TEXT).getText();
}
if (!hasEndMenu) return false;
// Ищем элементы выбора
final Menu menu = new Menu(title);
int pos = 0;
@ -348,10 +353,14 @@ public final class Parser {
return false;
}
private void scanLabels() {
private void preScan() {
// Сканируем все метки, для быстрого перехода командой jump.
// А также определяем параметры для оптимизации.
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) ) {
// label word :
final Token token = tokens.get(i + 1);