StringBuilder против канатов

Доброе утро,

Я пишу синтаксический анализатор языка и ищу наилучшую структуру для использования кеша отката, который в настоящее время выполняет следующие действия:

  • При запросе нового символа из потока этот символ добавляется в кэш, если запрашивается откат.
  • Когда запрашивается откат, вернитесь к определенной точке в кэше, чтобы при запросе другого символа он получал его оттуда.
  • Когда токен найден, удалите все в кэше отката до текущей позиции.

Короче говоря, я хотел бы знать, для чего вы считаете лучшей структурой данных:

  • Приоритет 1: добавление символов (кодовые точки будут приветствоваться)
  • Приоритет 2. Выполнение подстроки (такой как StringBuilder.delete(...)) в структуре данных (или полная очистка)
  • Приоритет 3: Возможность создания строки кэша (например, StringBuilder.toString())

Надеюсь услышать тебя позже!

2 ответа

Решение

Если бы я был вами, для такого специализированного использования и с возможными ограничениями производительности и ресурсов, я бы реализовал свой собственный буфер из примитивов. Я думаю, что это больше проблем с адаптацией существующих структур. Конечно, если это не повредит, я постараюсь соответствовать хорошо известным соответствующим интерфейсам, таким как CharSequence, Appendable, List, так далее.

Я подозреваю, что комбинация StringBuilder и PushbackReader даст вам то, что вам нужно. Используйте StringBuilder для накопления символов и создания строк токенов, а также PushbackReader's mark а также reset методы реализации отката.

В качестве альтернативы, предварительно прочитайте весь входной файл как строку, а затем внедрите токенизатор, проиндексировав строку и получив подстроки.

Другие вопросы по тегам