Я работаю над базовым сетевым протоколом в Python, который должен иметь возможность передавать как строки ASCII (читай: завершенные EOL), так и двоичные данные.
Чтобы последний был возможен, я решил создать грамматику так, чтобы она содержала количество байтов, которые будут двоичными.
Для SimpleParse грамматика будет выглядеть так [1]:
EOL := [\n]
IDENTIFIER := [a-zA-Z0-9_-]+
SIZE_INTEGER := [1-9]*[0-9]+
ASCII_VALUE := [^\n\0]+, EOL
BINARY_VALUE := .*+
value := (ASCII_VALUE/BINARY_VALUE)
eol_attribute := IDENTIFIER, ':', value
binary_attribute := IDENTIFIER, [\t], SIZE_INTEGER, ':', value
attributes := (eol_attribute/binary_attribute)+
command := IDENTIFIER, EOL
command := IDENTIFIER, '{', attributes, '}'
Проблема в том, что я не знаю, как проинструктировать SimpleParse, что следующее будет бином двоичных данных SIZE_INTEGER байтов во время выполнения .
Причиной этого является определение терминала BINARY_VALUE, который удовлетворяет моим потребностям в том виде, в каком он есть сейчас, поэтому его нельзя изменить.
Спасибо
Редактировать
Я полагаю, что решение заставит его остановиться, когда он совпадет с производственным двоичным_атрибутом, и позволит мне заполнить узел AST вручную (через socket.recv ()), но как это сделать?
Редактировать 2
Base64-кодирование или аналогичное не вариант.
[1] Я не проверял это, поэтому я не знаю, работает ли он практически, это только для вас, чтобы получить представление