天天看點

模闆引擎:一、了解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解析器