StringBuilder против канатов
Доброе утро,
Я пишу синтаксический анализатор языка и ищу наилучшую структуру для использования кеша отката, который в настоящее время выполняет следующие действия:
- При запросе нового символа из потока этот символ добавляется в кэш, если запрашивается откат.
- Когда запрашивается откат, вернитесь к определенной точке в кэше, чтобы при запросе другого символа он получал его оттуда.
- Когда токен найден, удалите все в кэше отката до текущей позиции.
Короче говоря, я хотел бы знать, для чего вы считаете лучшей структурой данных:
- Приоритет 1: добавление символов (кодовые точки будут приветствоваться)
- Приоритет 2. Выполнение подстроки (такой как StringBuilder.delete(...)) в структуре данных (или полная очистка)
- Приоритет 3: Возможность создания строки кэша (например, StringBuilder.toString())
Надеюсь услышать тебя позже!
2 ответа
Если бы я был вами, для такого специализированного использования и с возможными ограничениями производительности и ресурсов, я бы реализовал свой собственный буфер из примитивов. Я думаю, что это больше проблем с адаптацией существующих структур. Конечно, если это не повредит, я постараюсь соответствовать хорошо известным соответствующим интерфейсам, таким как CharSequence
, Appendable
, List
, так далее.
Я подозреваю, что комбинация StringBuilder и PushbackReader
даст вам то, что вам нужно. Используйте StringBuilder для накопления символов и создания строк токенов, а также PushbackReader's mark
а также reset
методы реализации отката.
В качестве альтернативы, предварительно прочитайте весь входной файл как строку, а затем внедрите токенизатор, проиндексировав строку и получив подстроки.