Я создаю приложение Erlang, которое должно анализировать двоичный поток TCP из сторонней программы.Один из типов пакетов, которые я могу получить, имеет данные, отформатированные следующим образом:
N_terms * [Флаги (8 бит), Тип (8 бит), [необязательные данные]].
Проблема, с которой я столкнулся, заключается в том, что необязательные данные определяются перестановкой всех возможных комбинаций флагов и типов.Кроме того, в зависимости от типа есть дополнительные необязательные данные, связанные с ним.
Если бы я написал парсер на императивном языке, я просто прочитал бы в 2 полях и затем получил бы серию if (...) операторы, в которых я буду читать значение и увеличивать свою позицию в потоке.В Erlang мое первоначальное наивное предположение состоит в том, что у меня будет 2 ^ N функциональных предложений, чтобы соответствовать синтаксису байтов в потоке, где N - общее количество флагов + все типы с дополнительными необязательными данными.
В существующем виде,как минимум, у меня есть 3 флага и 1 тип, которые содержат необязательные данные, которые я должен реализовать, что означало бы, что у меня будет 16 различных функциональных предложений для сопоставления в потоке.
Должен быть лучший идиоматичный способчтобы сделать это в Erlang - что мне не хватает?
Редактировать: Я должен уточнить, я не знаю количество терминов заранее.