2010-07-13 8 views
1

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

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

Очевидно, что существует гораздо более эффективный способ сделать это, например, инкрементный синтаксический анализ a-la SAX, декаподобных буферов или аналогичных струнных срезов и т. Д. Кроме того, очевидно, что я не первый, кто должен это делать тип анализа потока.

Кто-нибудь знает о какой-либо библиотеке, которая уже делает подобные вещи? Предотвращение переполнения памяти в случае отсутствия совпадений шаблонов также будет большим плюсом.

Спасибо, Adi

+0

Какой тип соответствия вам нужно сделать? – 2010-07-13 21:00:40

+0

Я должен поддерживать несколько разных устройств, поэтому мне нужен более обобщенный синтаксический анализатор. В настоящее время я ищу строку заголовка и нижнюю колонтитулу и возвращаю это «предложение» для последующего дополнительного синтаксического анализа. На самом деле, я надеялся на более общий парсер, например. регулярное выражение. –

ответ

0

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

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

Что делать, если шаблон является регулярным выражением? Слишком рано отвечать без дополнительной информации, ИМО. – 2010-07-13 21:33:02

+0

@Moron: Вы можете использовать эти трюки с регулярным выражением. Если ваше регулярное выражение имеет шаблон статического конца, вы можете найти его в новых данных буфера перед запуском всего регулярного выражения. –

+0

@ Zan: Предположим, что регулярное выражение было^someregex $. Тогда мы можем решить это в постоянном пространстве, построив DFA и запустив поток через него. – 2010-07-13 22:42:56

Смежные вопросы