解析器组合子是一类函数,它接收一个输入字符串,并返回解析得到的值以及剩余未解析的字符串。Parser<T> 定义为 (input: string) => [T, string]。例如,p Integer 将 "10 20 30" 解析为数字 10,剩余部分为 " 20 30"。p Hello 从 "Hello 100" 中提取 "Hello",剩下 " 100"。p Ignore Whitespace 消耗空格,返回 " " 和 "100"。随后 p Integer 将 "100" 解析为数字 100,剩余空字符串。
顺序组合子 p Seq 允许组合多个解析器:p Seq(p Hello, p Ignore Whitespace, p Integer) 会把 "Hello 100" 解析为元组 ["Hello", null, 100]。p Map 组合子用于转换解析结果,例如将 ["Hello", null, 100] 转换为 {greeting: "Hello", who: 100}。同样,p Seq(p Number, p Semicolon) 通过反复应用解析器来消费每一组数字加分号,从而将 "10;20;30;" 解析为数字列表。
本文还通过解析网络 ping 命令的输出进行说明,展示了如何借助这些组合子从原始文本中提取结构化数据。折叠(fold)与展开(unfold)操作则演示了解析器如何归约或重建数值,例如对列表求和,或将 "Hello 100" 转换为 ["Hello", " ", 100],反之亦然。
来源: Hacker News · 由HeadlinesBriefing整理摘要