Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Индекс в peek() говорит с какой позиции начинать старт а next() это обязательный оператор?

ФермаКактусов Высший разум (211433), закрыт 1 месяц назад
 while(pos < length)
{
char current = peek(0);
if (условие верно) делать это
else
next();
}
Лучший ответ
Олеся С@@@@@кова Высший разум (321137) 1 месяц назад
Ноль в peek(0) не обнуляется циклом, потому что peek(0) всегда возвращает текущий символ по позиции pos. Когда вызывается метод next(), он увеличивает значение pos, тем самым продвигаясь к следующему символу. Без вызова next(), значение pos останется на месте, и peek(0) всегда будет возвращать один и тот же символ, не двигаясь по строке.

Проще говоря, next() заставляет pos продвигаться вперёд, позволяя peek(0) возвращать следующий символ в строке. Без next() программа застрянет на одном символе и не сможет анализировать всю строку.

 
вот что делает код полностью:
 
package com.annimon.ownlang.parser; // Указывает пакет, к которому относится класс Lexer.
 
import java.util.ArrayList; // Импортирует класс ArrayList.
import java.util.List; // Импортирует интерфейс List.
 
/**
 * @author aNNiMON
 */
public final class Lexer { // Объявляет финальный класс Lexer.
 
    private static final String OPERATOR_CHARS = "+-*/()"; // Строка с символами операторов.
    private static final TokenType[] OPERATOR_TOKENS = { // Массив, соответствующий операторам из OPERATOR_CHARS.
        TokenType.PLUS, TokenType.MINUS,
        TokenType.STAR , TokenType.SLASH,
        TokenType.LPAREN, TokenType.RPAREN,
    };
 
    private final String input; // Исходная строка для анализа.
    private final int length; // Длина исходной строки.
    private final List<Token> tokens; // Список токенов.
    private int pos; // Текущая позиция в строке.
 
    public Lexer(String input) { // Конструктор класса Lexer.
        this.input = input;
        length = input.length();
        tokens = new ArrayList<>();
    }
 
    public List<Token> tokenize() { // Основной метод для лексического анализа.
        while (pos < length) { // Пока текущая позиция меньше длины строки.
            final char current = peek(0); // Получаем текущий символ.
            if (Character.isDigit(current)) tokenizeNumber(); // Если символ - цифра, вызываем метод tokenizeNumber().
            else if (current == '#') { // Если символ - '#', переходим к следующему символу и вызываем метод tokenizeHexNumber().
                next();
                tokenizeHexNumber();
            }
            else if (OPERATOR_CHARS.indexOf(current) != -1) { // Если символ - оператор, вызываем метод tokenizeOperator().
                tokenizeOperator();
            } else { // Если символ не подходит ни под одно из условий, переходим к следующему символу (пропускаем пробелы и прочее).
                next();
            }
        }
        return tokens; // Возвращаем список токенов.
    }
 
    private void tokenizeNumber() { // Метод для токенизации чисел.
        final StringBuilder buffer = new StringBuilder(); // Создаём буфер для накопления символов числа.
        char current = peek(0); // Получаем текущий символ.
        while (Character.isDigit(current)) { // Пока символ - цифра.
            buffer.append(current); // Добавляем символ в буфер.
            current = next(); // Переходим к следующему символу.
        }
        addToken(TokenType.NUMBER, buffer.toString()); // Добавляем токен числа в список токенов.
    }
 
    private void tokenizeHexNumber() { // Метод для токенизации шестнадцатеричных чисел.
        final StringBuilder buffer = new StringBuilder(); // Создаём буфер для накопления символов числа.
        char current = peek(0); // Получаем текущий символ.
        while (Character.isDigit(current) || isHexNumber(current)) { // Пока символ - цифра или шестнадцатеричное число.
Олеся С@@@@@коваВысший разум (321137) 1 месяц назад
buffer.append(current); // Добавляем символ в буфер.
current = next(); // Переходим к следующему символу.
}
addToken(TokenType.HEX_NUMBER, buffer.toString()); // Добавляем токен шестнадцатеричного числа в список токенов.
}

private static boolean isHexNumber(char current) { // Метод для проверки, является ли символ шестнадцатеричным числом.
return "abcdef".indexOf(Character.toLowerCase(current)) != -1; // Проверяем, входит ли символ в строку "abcdef".
}

private void tokenizeOperator() { // Метод для токенизации операторов.
final int position = OPERATOR_CHARS.indexOf(peek(0)); // Определяем позицию оператора в строке операторов.
Олеся С@@@@@коваВысший разум (321137) 1 месяц назад
addToken(OPERATOR_TOKENS[position]); // Добавляем соответствующий токен оператору в список токенов.
        next(); // Переходим к следующему символу.
    }
 
    private char next() { // Метод для перехода к следующему символу.
        pos++; // Увеличиваем текущую позицию.
        return peek(0); // Возвращаем текущий символ.
    }
 
    private char peek(int relativePosition) { // Метод для получения символа в относительной позиции.
        final int position = pos + relativePosition; // Рассчитываем абсолютную позицию.
        if (position >= length) return '\0'; // Если позиция выходит за пределы строки, возвращаем нулевой символ.
        return input.charAt(position); // Возвращаем символ в рассчитанной позиции.
    }
Олеся С@@@@@коваВысший разум (321137) 1 месяц назад
private void addToken(TokenType type) { // Метод для добавления токена без текста.
        addToken(type, ""); // Вызываем основной метод добавления токена с пустым текстом.
    }
 
    private void addToken(TokenType type, String text) { // Основной метод для добавления токена с текстом.
        tokens.add(new Token(type, text)); // Добавляем новый токен в список токенов.
    }
}
Остальные ответы
Александр Искусственный Интеллект (301506) 1 месяц назад
начинать старт чего?
ФермаКактусовВысший разум (211433) 1 месяц назад
peek(0) с нуля. эта функция не самоитерируема, тут next для нее получается?
ФермаКактусовВысший разум (211433) 1 месяц назад
не понял зачем тут next()
если peek само итерируема то зачем пихать в цикл.

код получает массив символов и проходит по каждому. цифры к цифрам символы к символам.
ФермаКактусовВысший разум (211433) 1 месяц назад
без цикла разве работать не будет итерируемая функция?
ФермаКактусовВысший разум (211433) 1 месяц назад
или итерация одноразова и тут цикл для того чтобы обновлять каждый шаг итерации?
ФермаКактусовВысший разум (211433) 1 месяц назад
а вообще код взят отсюда
Похожие вопросы