Инкрементальный анализ потока в C ++ - PullRequest
1 голос
/ 14 июля 2010

Я читаю данные из (последовательного) порта, используя неблокирующую функцию read () (на C / C ++).Это означает, что данные поступают кусками неопределенного (но сообщаемого) размера (включая 0) каждый раз, когда я «опрашиваю» порт.Затем мне нужно проанализировать этот «поток» для определенных шаблонов (не XML).

Моя наивная реализация объединяет новую строку с предыдущей строкой потока каждый раз, когда read () возвращает ненулевой буфер, и повторноразбирает всю строку.Когда шаблон сопоставляется, соответствующая часть отбрасывается, оставляя только хвост строки в следующий раз.

Очевидно, что есть гораздо более эффективный способ сделать это, например, инкрементальный синтаксический анализ SAX,буферы типа deque или подобные строковые фрагменты и т. д. Кроме того, очевидно, я не первый, кто должен выполнять такой тип анализа потока.Предотвращение переполнения памяти в случае отсутствия совпадений с шаблоном также будет большим плюсом.

Спасибо, Ади

1 Ответ

0 голосов
/ 14 июля 2010

Вы можете сделать несколько трюков в зависимости от вашего шаблона.

  • Для поиска одного символа, такого как символ новой строки, вам нужно только отсканировать новую часть строки.
  • Если вы ищете \ r \ n, вам нужно только отсканировать новую часть, начиная с последнего символа предыдущей части.
  • Если у вас есть шаблон с известной конечной частью, вам нужно только отсканировать этот конец, чтобы узнать, нужно ли сканировать весь буфер.
  • Если у вас есть какой-то символ синхронизации, такой как точка с запятой в C / C ++, вы можете анализировать или объявлять ошибку синтаксического анализа всякий раз, когда вы ее найдете.
...