2016-09-09 7 views
3

저는 양방향 (바이너리 | 텍스트) 파서/빌더를 정의하기위한 파이썬 구성 모듈의 선언적 구문을 정말 좋아합니다.파이썬의 구조와 유사한 golang 라이브러리가 있습니까?

저는 최근에 golang에 집중하기 시작했으며 golang과 유사한 라이브러리를 본 사람이 있는지 궁금해하고있었습니다.

construct 모듈을 사용한 적이 없다면 기본적으로 Python 객체 트리를 제공하고 이진 Blob을 가져올 수 있거나 Binary Blob을 Python 객체 트리로 구문 분석 할 수있는 Python 객체의 선언적 트리를 빌드해야합니다.

구성체 웹 페이지에서 간단한 예 : 하드 드라이브 MBR 파서를 도시 소스

>>> PascalString2 = ExprAdapter(PascalString, 
...  encoder = lambda obj, ctx: Container(length = len(obj), data = obj), 
...  decoder = lambda obj, ctx: obj.data 
...) 
>>> PascalString2.parse("\x05hello") 
'hello' 
>>> PascalString2.build("i'm a long string") 
"\x11i'm a long string" 

약간 더 복잡한 예.

mbr = Struct("mbr", 
    HexDumpAdapter(Bytes("bootloader_code", 446)), 
    Array(4, 
     Struct("partitions", 
      Enum(Byte("state"), 
       INACTIVE = 0x00, 
       ACTIVE = 0x80, 
      ), 
      BitStruct("beginning", 
       Octet("head"), 
       Bits("sect", 6), 
       Bits("cyl", 10), 
      ), 
      Enum(UBInt8("type"), 
       Nothing = 0x00, 
       FAT12 = 0x01, 
       XENIX_ROOT = 0x02, 
       XENIX_USR = 0x03, 
       FAT16_old = 0x04, 
       Extended_DOS = 0x05, 
       FAT16 = 0x06, 
       FAT32 = 0x0b, 
       FAT32_LBA = 0x0c, 
       NTFS = 0x07, 
       LINUX_SWAP = 0x82, 
       LINUX_NATIVE = 0x83, 
       _default_ = Pass, 
      ), 
      BitStruct("ending", 
       Octet("head"), 
       Bits("sect", 6), 
       Bits("cyl", 10), 
      ), 
      UBInt32("sector_offset"), # offset from MBR in sectors 
      UBInt32("size"), # in sectors 
     ) 
    ), 
    Const("signature", b"\x55\xAA"), 
) 

정말 구조 모델은 단일 파서/발전기로 결합 정의의 한입 크기의 블록을 가지고 할 수있는 기능, 얼마나 강력한 보여주는 TCP/IP stack 예를 들어이있다.

나는 PEG/EBNF 파서 생성기가 있다는 것을 알고있다. 그러나 나는 좀 더 예쁜 것을 기대하고 있었다.

+0

안녕하세요, @ Synthesizerpatel! 나는 비슷한 질문을한다. 당신이 뭔가 유용한 것을 찾았는지 궁금합니다. –

답변

0

이 파이썬의 구성 패키지와 동일하지 않지만 이동에 대한 Yacc의 버전이 :

Yacc에의 문법은 EBNF와 유사하다, 그래서 맞지 않을 수 있습니다 당신의 기준이지만, 널리 쓰이고 이해되기 때문에 언급 할만한 가치가 있다고 생각합니다.