- 文章名称:从零编写一个解析器(1)—— 解析数字
- 参考地址:https://github.com/Geal/nom/blob/master/doc/making_a_new_parser_from_scratch.md
- 文章来自:https://github.com/suhanyujie/my-parser-rs
- 文章作者:suhanyujie
- Tips:文章如果有任何错误之处,还请指正,谢谢~
- 标签:Rust,parser
长久以来,由于我在工作中使用 go 语言,所以时常会遇到需要将 sql 转换为 struct 的需求,虽然在网上能够找到一些将 sql、json 等转换为 struct 的工具,但大都无法配置,要么只支持将 json 转 struct,要么转换后 tag 的风格不符合我所需要的。
基于这种情况,我一直想自己写一套可自定义的转换工具,要想能灵活的转换,先需要对源码字符串(sql 或者 json)进行解析,因此,我们从这里开始,逐步学习如何实现一个解析器,最终的目标是可以灵活的将 sql、json 转换为 go struct。
nom是 Rust 中一个强大的解析器库,而我们就是要基于 nom 对源字符串进行解析。
本文的前半部分深度参考 nom 仓库中的一个文档。
万丈高楼平地起,要想用 nom 写好一个解析器,我们先要对 nom 进行一些了解,因此先从一些小示例开始,主要是通过一些 nom 自带的函数来实现简单的解析。
第一次解析
根据 文档 中的介绍,我们先从解析一个括号中的数字 —— (12345)
开始。先定义一个函数签名,它用于把字符串 (12345)
解析成数字:
fn parse_u32(input: &[u8]) -> IResult<&[u8], u32>
parse_u32 是函数名称,它接收一个 input 参数,IResult
即 nom::IResult
,是 nom 中常用的结果返回类型。可以通过