Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 是否有类似于Python的golang库';什么是构造?_Parsing_Go_Data Structures_Declarative - Fatal编程技术网

Parsing 是否有类似于Python的golang库';什么是构造?

Parsing 是否有类似于Python的golang库';什么是构造?,parsing,go,data-structures,declarative,Parsing,Go,Data Structures,Declarative,我非常喜欢Python构造模块用于定义双向(二进制|文本)解析器/构建器的声明性语法 我最近开始关注golang,想知道是否有人见过(或可能是受人尊敬的作者)类似的golang图书馆 如果您从未使用过该模块,那么基本上可以构建一个Python对象的声明性树,您可以为Python对象树提供数据并获取二进制blob,或者将二进制blob解析为Python对象树 构造网页中的一个简单示例: >>> PascalString2 = ExprAdapter(PascalString, .

我非常喜欢Python构造模块用于定义双向(二进制|文本)解析器/构建器的声明性语法

我最近开始关注golang,想知道是否有人见过(或可能是受人尊敬的作者)类似的golang图书馆

如果您从未使用过该模块,那么基本上可以构建一个Python对象的声明性树,您可以为Python对象树提供数据并获取二进制blob,或者将二进制blob解析为Python对象树

构造网页中的一个简单示例:

>>> 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解析器

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"),
)
有一个示例真正展示了构造模型的强大功能,它能够将少量的定义块组合到单个解析器/生成器中


我知道有PEG/EBNF解析器生成器,但我希望看到更漂亮的东西。

这与Python的构造包不同,但有一个for Go版本:


Yacc的语法与EBNF相似,因此可能不符合您的标准,但它被广泛使用和理解,因此我认为值得一提。

嗨,@synthezerpatel!我有类似的问题。我想知道你是否发现了有用的东西?