parsing - 是否有类似于 Python 构造的 golang 库?

标签 parsing go data-structures declarative

<分区>

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

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

如果您从未使用过 construct模块,您基本上构建了一个 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"),
)

有一个 TCP/IP stack这个例子真正展示了构造模型的强大之处,它能够将一口大小的定义 block 组合到一个解析器/生成器中。

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

最佳答案

这与 Python 的 Construct 包不同,但有一个版本 Yacc对于围棋:

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

关于parsing - 是否有类似于 Python 构造的 golang 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412191/

相关文章:

parsing - Haskell/Parsec : How do you use the functions in Text. Parsec.Indent?

python - 我应该使用什么数据结构进行情感分析?

parsing - Scala 解析器组合器,解析器因优先级而失败

mysql - time.Time 的子类型不使用 gorm lib 创建列

go - 发布后表格值为空

templates - 有没有办法列出使用过的变量?

javascript - 防止 Javascript 数组中的循环引用

xml - XML 架构文件中 xs 和 xsd 之间的区别?

.net - 用于 .NET 的 RSS 解析器

java - 分隔多个正则表达式的最佳分隔符