解析器组合子
Parser Combinators

原始链接: https://t3.at/blog/2026-10-17-parser-combinators/

头部:{ 目标IP:"1.1.1.1",解析IP:"1.1.1.1",ICMP载荷大小:56,总包大小:84 } 数据包:[ { 字节数:64,来源:"1.1.1.1",序号:1,生存时间:52,时间:389 }, { 字节数:64,来源:"1.1.1.1",序号:2,生存时间:52,时间:68.7 }, { 字节数:64,来源:"1.1.1.1",序号:3,生存时间:52,时间:47.1 }, { 字节数:64,来源:"1.1.1.1",序号:4,生存时间:52,时间:48.6 }, { 字节数:64,来源:"1.1.1.1",序号:5,生存时间:52,时间:85.8 }, { 字节数:64,来源:"1.1.1.1",序号:6,生存时间:52,时间:84.8 }, { 字节数:64,来源:"1.1.1.1",序号:7,生存时间:52,时间:87.4 } ] 统计:{ 已发送包数:8,已接收包数:7,丢包率:12.5,时间:7008,往返时延:{ 最小:47.129,平均:115.88,最大:388.75,平均偏差:112.515 } }

**Parser Combinators**(t3.at)是一份通过组合小型解析函数来构建解析器的可视化、幻灯片式指南。评论者称赞其清晰度和动画,但批评幻灯片界面浪费屏幕空间并破坏浏览器的前进/后退导航。 关键讨论点: - **Python 的 `re.Scanner`** 在正则表达式与完整解析器之间为词法分析提供折中方案,尽管它未文档化。 - **语言人体工学差异**:Haskell 的 monadic/applicative 运算符(`<$`、`$>`)可减少解包,而 Rust/TS 往往需要更多映射代码。一位评论者正在构建一个 Rust 库,添加 capture/bind 组合子以减少这一点。 - **类型设计争论**:解析器应返回 `T` 还是 `Either`,以及对“部分解析器”的困惑。 - **局限性**:组合子无法处理左递归文法,并可能在歧义输入上指数级回溯。 - **正则表达式** 在形式上不足以进行递归/上下文无关解析。 - **CPS/monadic 风格** 支持增量/流式解析。 - **性能**:在 Node.js 中字符串切片较慢;基于索引的方法更快。 - 一位评论者分享了 Fritz Ruehr 的诗,定义了解析器的类型签名。 总体而言,该讨论串混合了对指南的欣赏,以及关于解析器设计、类型安全和语言人体工学的技术辩论。
相关文章

原文

{ header: { targetIp: "1.1.1.1", resolvedIp: "1.1.1.1", icmpPayloadSize: 56, totalPacketSize: 84 }, packets: [ { byteCount: 64, from: "1.1.1.1", seq: 1, ttl: 52, time: 389 }, { byteCount: 64, from: "1.1.1.1", seq: 2, ttl: 52, time: 68.7 }, { byteCount: 64, from: "1.1.1.1", seq: 3, ttl: 52, time: 47.1 }, { byteCount: 64, from: "1.1.1.1", seq: 4, ttl: 52, time: 48.6 }, { byteCount: 64, from: "1.1.1.1", seq: 5, ttl: 52, time: 85.8 }, { byteCount: 64, from: "1.1.1.1", seq: 6, ttl: 52, time: 84.8 }, { byteCount: 64, from: "1.1.1.1", seq: 7, ttl: 52, time: 87.4 }, ], statistics: { packetsTransmitted: 8, packetsReceived: 7, packetLoss: 12.5, time: 7008, rtt: { min: 47.129, avg: 115.88, max: 388.75, mdev: 112.515 }, }, }

联系我们 contact @ memedata.com