Токенизация строк в файле - PullRequest
0 голосов
/ 04 октября 2011

У меня есть файл, в котором я токенизирую все строки в нем.

Таким образом, каждый токен сохраняется в char *token = (char *) malloc(len + 1); Токен освобождается до выделения нового, поэтому мне нужен способ хранения токенов для дальнейшего использования.

Какая хорошая стратегия для хранения токенов? У меня есть функция, которая выводит одну строку токена за раз.

Мой вопрос здесь не о том, как токенизировать или анализировать, поэтому, пожалуйста, не обращайте внимания на реализацию этого. У меня вопрос, у меня есть несколько строк, которые выделяются и освобождаются несколько раз в цикле. Итак, как мне хранить каждое выделение в другом месте для дальнейшего использования?

1 Ответ

0 голосов
/ 04 октября 2011

Обычно токены не сохраняются в файл. Парсер запрашивает их, когда анализатор готов прочитать дополнительные входные данные.

Таким образом, токены сохраняются в памяти в куче программы, и после того, как они были обработаны (что может занять много времени до полного анализа файла), они освобождаются.

--- Обновление после редактирования ---

Если вас беспокоит чрезмерное распределение и освобождение, у вас есть несколько решений, в зависимости от детализации проблемы, которую вы пытаетесь решить.

Для строк вы можете создавать их через интерфейс «строителя строк», который проверяет, присутствует ли уже строка с этим текстом, и, если это так, возвращает ссылку на уже существующую строку. Обратите внимание, что для правильной работы все возвращаемые строки должны быть неизменными (так как изменение строки в одной ссылке изменит строку во всех ссылках). Подобные решения возможны для чисел, логических значений и т. Д.

Для повторного использования токена вы можете превратить токен в структуру, которая в основном ссылается указателем на данные, которые могут быть "использованы" синтаксическим анализатором. Таким образом, синтаксический анализатор захватывает «поля» токена, и токен «скелет» может быть добавлен обратно в «очередь повторного использования». Очередь повторного использования должна сбросить ссылки «данных» токена, прежде чем возвращать его токенизатору, который будет переписан, чтобы запросить в очереди его структуры данных. Если токены «в очереди» отсутствуют, очередь должна их тихо распределить.

Существуют и другие решения, в зависимости от того, насколько хитро вы хотите получить.

...