模板引擎:一、理解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解析器工作原理_第1张图片

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

关键字

- true
- false
- null
- undefined

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

数值类型

参考MDN对数值类型的描述

  • 有符号
    • 整型
    • 浮点型
    • 指数型(-10e2)
    • 无穷数值
  • 无符号
    • 整型
    • 浮点型
    • 指数型
    • 无穷数值

字符串类型

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

对象类型

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

数组类型

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

语法分析

得到Token流之后,接下来就是语法分析了。
JSON文法是遵循LL(1)(即文法无左递归),这就可以是递归构造我们的语法解析器了。

模板引擎:一、理解Json解析器工作原理_第2张图片

什么是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解析器工作原理_第3张图片

你可能感兴趣的:(Web前端,JavaScript篇)