Json解析器
初衷
编写Json解析器目的是为了拓展自己的知识广度,并且通过简单的手写实践,能够深入了解一些技术细节(AST、DFA&NFA、LL(1)文法),以及便于理解目前主流的前端框架设计。
那么就通过Json,切入正题
Json
Json一共定义了四种数据类型:数值类型、字符串类型、数组、对象。
其中,前两者可以归纳为基本类型,后两个可以归纳为复合类型。
不过,还有一种特殊的值:true,false,null,undefined
,这些值统一归类为关键字(keyword)
参考一下Json官方定义
何为解析?
将源字符串转换成我们预先定义的数据结构(本文专指Json)的过程。
其中,转换的过程可以称之为”词法/语法分析”
解析器
解析器类似于我们常见的加工处理器,处理数据的结果,就是我们得到的最终形式。
解析的过程分为两步:
- 词法分析器(将字符流转换为Token流)
- 语法分析器(把Token流转换为Json对象)
词法分析(Tokenization)
负责将源字符串分析,筛选为一个个具有单独含义的单词(词法单元:Token)。
而这些单词就是我们预先定义的数据结构(Json)中的数据类型。
首先,定义一组Token,用来描述我们的数据类型
关键字
- true
- false
- null
- undefined
这四个是最简单也是最基本的数据结构,很容易描述。只要通过进行简单的字符匹配,就可以进行识别。
数值类型
- 有符号
- 整型
- 浮点型
- 指数型(-10e2)
- 无穷数值
- 无符号
- 整型
- 浮点型
- 指数型
- 无穷数值
字符串类型
定义: 以’ “ ‘起始,并以’ “ ‘成对匹配结尾的数据结构,即判定为字符串。
对象类型
定义: 以’ { ‘起始,并以’ } ‘成对匹配结尾的数据结构,并且以key-value的形式存在,key为基本字符串类型,即判定为对象。
数组类型
定义: 以’ [ ‘起始,并以’ ] ‘成对匹配结尾的数据结构,并且数据单元之间以’ , ‘进行分割,即判定为数组。
语法分析
得到Token流之后,接下来就是语法分析了。
JSON文法是遵循LL(1)(即文法无左递归),这就可以是递归构造我们的语法解析器了。
什么是Json解析器
Json解析器,就是实现将源字符串转换为Json对象的工具。
在JS中,可以参考JSON.parse(str)
(MDN文档)
手写Json解析器
通过了解了Json解析器的工作原理之后,那么在下一节将通过纯原生JS手写一个简单的JSON.parse功能。
参考资料
自己实现JSON、XML的解析:https://juejin.im/post/5a46e174518825698e726486
实现简单的JSON解析器:https://segmentfault.com/a/1190000010998941
解析器编写思路:https://www.zhihu.com/question/24640264/answer/80500016