런타임까지 Deterministic 문법을 간단하게 말합니다
-
20-09-2019 - |
문제
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의 정의입니다. 따라서 변경할 수 없습니다.
감사
편집하다
솔루션이 프로덕션 binary_attribute와 일치 할 때 멈추고 AST 노드를 수동으로 채울 때 (Socket.Recv ())를 수동으로 채울 수 있다고 생각합니다. 그렇게하는 방법?
편집 2
Base64- 인코딩 또는 이와 유사한 것은 옵션이 아닙니다.
1] 테스트를 거치지 않았으므로 실제로 작동하는지 모르겠습니다. 아이디어를 얻는 것이 좋습니다.
해결책
응용 프로그램을 휴대용 및 신뢰할 수 있으려면 표준 ASCII 문자 만 와이어를 통과하는 것이 좋습니다.
다른 컴퓨터 아키텍처마다 다른 바이너리 표현, 다른 단어 크기, 다른 문자 세트가 있습니다. 이것을 다루는 데 세 가지 접근법이 있습니다.
먼저 문제를 무시하고 단일 paltform에서 프로토콜을 구현하기 만하면됩니다.
둘 다 당신은 모든 컴퓨터 과학을 가고 가능한 각 데이터 유형 ALA CORBA에 대해 "추기경 양식"을 제시 할 수 있습니다.
실용적으로 "Sprintf"및 "Scanf"의 마법을 사용하여 네트워크를 통해 데이터를 보낼 때 데이터를 일반 ASCII 문자로 변환 할 수 있습니다.
또한 귀하의 프로토콜에 메시지 시작 또는 그 근처에 메시지 길이가 포함되어 있다고 제안합니다. 홈 메이저 프로토콜에서 가장 일반적인 버그는 수신 파트너가 전송 된 것보다 더 많은 데이터를 기대하고 전송되지 않은 데이터를 영원히 대기하는 것입니다.
다른 팁
문법이 당신이 인용 한 것만 큼 간단하다면, 아마도 파서 생성기를 사용하는 것일 수 있습니까? 손으로 자신의 재귀 파서를 굴리는 것이 더 간단하고 빠를 수 있습니다.
사용하는 것이 좋습니다 건설하다 이진 데이터를 구문 분석하기위한 라이브러리. 또한 텍스트 (ASCII)를 지원하므로 텍스트를 감지 할 때 간단한 파서 기반 구식 구식으로 전달할 수 있지만 바이너리 데이터는 구성과 구문 분석됩니다. 매우 편리하고 강력합니다.