저는 파이썬에서 ASCII 문자열 (읽기 : EOL 종료 됨)과 바이너리 데이터를 모두 전송할 수 있어야하는 기본 네트워킹 프로토콜로 작업하고 있습니다. 후자가 가능하기 때문에 나는 바이너리가 될 바이트 수를 포함하는 문법을 작성하기로했다.런타임까지 SimpleParse 비 결정적 문법
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 단말기의 정의이므로 변경 될 수 없습니다.
감사
편집 내가 솔루션은 생산 binary_attribute 일치 할 때 중지 나 수동으로 AST 노드를 채울 수 있도록 그것을 말하는 것입니다 가정
(socket.recv를 통해())하지만, 어떻게 그럴 수 있습니까?
편집 2
Base64로 인코딩 또는 유사한 옵션을 선택하지 않습니다.
[1] 내가 그것을 테스트 have't, 그래서 실질적으로 작동하는 경우 문법은 당신이 인용 한 것과 같은 간단한 경우 그때, 당신이 생각
더 잘 이해하려면 어떤 종류의 파서 생성기를 사용하고 있습니까? (만약에 어떠한). 난 파이썬에 대해 많이 모르지만 당신이 트위스트 보았다, 당신은 프레임 워크/라이브러리에서 새로운 프로토콜을 구현할 수있을 것 같아요 – LB40
* 파서의 "클래스"보세요 * http://simpleparse.sourceforge.net/ 트위스티드는 흥미롭지 만 내 요구 사항에 맞춰 너무 본격적인 (무거운) 것처럼 보입니다. 어쩌면 다른 프로젝트에 사용하겠습니다. – Flavius
ASCII는 바이너리의 하위 집합이므로 첫 번째 질문은 두 가지를 분리해야하는 이유입니다. –