LINUX.ORG.RU

История изменений

Исправление pon4ik, (текущая версия) :

Кормим парсер побайтово, как это делают все нормальные люди.

Если протокол поддерживает разбиение на сообщения без разбора явно или не явно, то перед парсером можно поставить сплиттер.

Т.е. интерфейс будет выглядеть примерно так:


struct Parser {
  list<message> feed(vector<char> received);
}

Это DOM-like вариант, для случаев когда сообщения нужны целиком.

SAX-like вариант, он же потоковый может выглядеть примерно так:

struct Handler {
   void on_message(MessageHeader*);
   void on_field(Field*);
   // e.t.c
   void on_message_end(MessageFooter*);
}

struct Parser {
    void feed(vector<char> data, Handler& handler);
}

Фишка в том, что sax вариант в нормальном парсере у тебя одна фигня будет в реализации так или иначе, вопрос только какие требования к интерфейсу.

Исходная версия pon4ik, :

Кормим парсер побайтово, как это делают все нормальные люди.

Если протокол поддерживает разбиение на сообщения без разбора явно или не явно, то перед парсером можно поставить сплиттер.

Т.е. интерфейс будет выглядеть примерно так:


struct Parser {
  list<message> feed(vector<char> received);
}

Это DOM-like вариант, для случаев когда сообщения нужны целиком.

SAX-like вариант, он же потоковый может выглядеть примерно так:

struct Handler {
   void on_message(Message*);
   void on_field(Field*);
   // e.t.c
   void on_message_end();
}

struct Parser {
    void feed(vector<char> data, Handler& handler);
}

Фишка в том, что sax вариант в нормальном парсере у тебя одна фигня будет в реализации так или иначе, вопрос только какие требования к интерфейсу.