天天看点

模板引擎:一、理解Json解析器工作原理Json解析器

Json解析器

初衷

编写Json解析器目的是为了拓展自己的知识广度,并且通过简单的手写实践,能够深入了解一些技术细节(AST、DFA&NFA、LL(1)文法),以及便于理解目前主流的前端框架设计。

那么就通过Json,切入正题

Json

Json一共定义了四种数据类型:数值类型、字符串类型、数组、对象。

其中,前两者可以归纳为基本类型,后两个可以归纳为复合类型。

不过,还有一种特殊的值:

true,false,null,undefined

,这些值统一归类为关键字(keyword)

参考一下Json官方定义

何为解析?

将源字符串转换成我们预先定义的数据结构(本文专指Json)的过程。

其中,转换的过程可以称之为”词法/语法分析”

解析器

解析器类似于我们常见的加工处理器,处理数据的结果,就是我们得到的最终形式。

解析的过程分为两步:

  • 词法分析器(将字符流转换为Token流)
  • 语法分析器(把Token流转换为Json对象)

词法分析(Tokenization)

负责将源字符串分析,筛选为一个个具有单独含义的单词(词法单元:Token)。

而这些单词就是我们预先定义的数据结构(Json)中的数据类型。

模板引擎:一、理解Json解析器工作原理Json解析器

首先,定义一组Token,用来描述我们的数据类型

关键字

- true
- false
- null
- undefined
           
这四个是最简单也是最基本的数据结构,很容易描述。只要通过进行简单的字符匹配,就可以进行识别。

数值类型

参考MDN对数值类型的描述
  • 有符号
    • 整型
    • 浮点型
    • 指数型(-10e2)
    • 无穷数值
  • 无符号
    • 整型
    • 浮点型
    • 指数型
    • 无穷数值

字符串类型

定义: 以’ “ ‘起始,并以’ “ ‘成对匹配结尾的数据结构,即判定为字符串。

对象类型

定义: 以’ { ‘起始,并以’ } ‘成对匹配结尾的数据结构,并且以key-value的形式存在,key为基本字符串类型,即判定为对象。

数组类型

定义: 以’ [ ‘起始,并以’ ] ‘成对匹配结尾的数据结构,并且数据单元之间以’ , ‘进行分割,即判定为数组。

语法分析

得到Token流之后,接下来就是语法分析了。

JSON文法是遵循LL(1)(即文法无左递归),这就可以是递归构造我们的语法解析器了。

模板引擎:一、理解Json解析器工作原理Json解析器

什么是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

模板引擎:一、理解Json解析器工作原理Json解析器